الاتصال بقاعدة بيانات MySQL من خلال الاندرويد
14 March
قبل مدة ليست بالبعيدة و بعد انتهائي من معرفة جل اساسيات برمجة الويب بواسطة php و js بدون فريمات قررت الانتقال الى الاندرويد بعد انتهائي من الدورة تبادر الى دهنى سؤال و هو كيف يمكنني الاتصال بقاعدة بيانات Mysql من خلال الاندرويد و بعد البحث صدمت انه غير ممكن لكن هناك بديل يسمى Rest api .
فيديو يوضح النتيجة التي سنصل اليها
المتطلبات:
اضف التالي الى dependencies:
المتطلبات:
- اساسيات php .
- الاتصال بقاعدة البيانات sql .
- جيسون Json هو سهل التعلم اسهل من HTML .
- اساسيات الكوتلن و الاندرويد.
متطلبات التشغيل :
dependencies{
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
implementation 'com.github.kittinunf.fuel:fuel-android:1.12.1'
}
اضف الى ملف manifest.xml
ليعطيك الصلاحية لاستعمال الانترنيت :
<uses-permission android:name="android.permission.INTERNET"/>
كيف يتم الامر
الاسهم الرمادية تبين طريقة ارسال البيانات الى السيرفر .
الاسهم الزرقاء تبين طريقة الحصول على البيانات
اول ما سنقوم به هو انشاء قاعدة بيانات تتضمن معرف و الاسم و اسم المستخدم و كلمة المرور :
الاسهم الرمادية تبين طريقة ارسال البيانات الى السيرفر .
الاسهم الزرقاء تبين طريقة الحصول على البيانات
اول ما سنقوم به هو انشاء قاعدة بيانات تتضمن معرف و الاسم و اسم المستخدم و كلمة المرور :
+----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(25) | YES | | NULL | | | username | varchar(25) | YES | | NULL | | | password | varchar(25) | YES | | NULL | | +----------+-------------+------+-----+---------+----------------+نقوم باضافة مستخدمين عن طريق اوامر sql
+----+--------+--------------+----------+ | id | name | username | password | +----+--------+--------------+----------+ | 1 | ismail | abellaismail | 123456 | | 2 | hassan | Mr. Q | 98765 | +----+--------+--------------+----------+اولا ملف للاتصال بقاعدة البيانات
DB_Connect.php:
<?php
class DB_Connect {
private $conn;
public function connect() {
// الاتصال بقاعدة البيانات
$this->conn = new mysqli("localhost", "root", "root", "users");
// ارجاع قاعدة البيانات
return $this->conn;
}
}
?>
ملف الدوال و هو من سيتحقق من وجود اليوزر و ارجاع القيم .
DB_Functions.php
بعد ذلك سنقوم بانشاء ملف login.php .
هذا الملف دوره تحويل البيانات في قاعدة البيانات الى فورم جيسون لكي تكون المعلومات مرتبة على الاندرويد :
حسنا الان الى الاندرويد side :
يمكنك الوصول الى localhost عبر المحاكي من خلال هذا الرابط :
DB_Functions.php
<?php
/**
* @author Ismail Bella
* @link https://www.androidbella.com
/2018/03/connect-android-with-mysql
* @source https://www.androidhive.info/2012/01/android-login-and-registration-with-php-mysql-and-sqlite/ Complete tutorial
*/
class DB_Functions {
private $conn;
// constructor
function __construct() {
require_once 'DB_Connect.php';
// الاتصال بقاعدة البيانات
$db = new Db_Connect();
$this->conn = $db->connect();
}
// destructor
function __destruct() {
}
/**
* التحقق من صحة اسم المستخدم و الباسورد
* هذه الطريقة للفهم استعمل الطرق السليمة لحماية
*/
public function getUser($username, $password) {
$stmt = $this->conn->prepare("SELECT * FROM user WHERE username = ? AND password=? ");
$stmt->bind_param("ss", $username,$password);
if ($stmt->execute()) {
$user = $stmt->get_result()->fetch_assoc();
$stmt->close();
//التحقق من وجود اعمدة
if($user!=null){
// المعلومات صحيحة
return $user;
}
}else{
return NULL;
}
}
}
?>
بعد ذلك سنقوم بانشاء ملف login.php .
هذا الملف دوره تحويل البيانات في قاعدة البيانات الى فورم جيسون لكي تكون المعلومات مرتبة على الاندرويد :
login.php
<?php
require_once 'DB_Functions.php';
$db = new DB_Functions();
// json response array
$response = array("error" =>FALSE);
if (isset($_POST['username']) && isset($_POST['password'])) {
// اخد كل من الاسم و كلمة المرور
$username = $_POST['username'];
$password = $_POST['password'];
// التقاط معلومات المستخذم من خلال الباسوورد و اسم المستخدم
$user = $db->getUser($username, $password);
if ($user != false) {
// ثم ايجاد المستخذم
$response["error"] = FALSE;
$response["uid"] = $user["id"];
$response["user"]["name"] = $user["name"];
$response["user"]["username"] = $user["username"];
echo json_encode($response);
} else {
// لا يوجد مستخدم بهذه المعلومات
$response["error"] = TRUE;
$response["error_msg"] = "Login credentials are wrong. Please try again!";
echo json_encode($response);
}
} else {
// لا يتم ارسال البيانات المطلوبة
$response["error"] = TRUE;
$response["error_msg"] = "Required parameters username or password is missing!";
echo json_encode($response);
}
?>
حسنا الان الى الاندرويد side :
يمكنك الوصول الى localhost عبر المحاكي من خلال هذا الرابط :
http://10.0.0.2/
loginAc.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageButton android:id="@+id/imageButton" android:layout_width="100dp" android:layout_height="100dp" android:layout_marginBottom="8dp" android:layout_marginTop="8dp" android:scaleType="centerCrop" app:layout_constraintBottom_toTopOf="@+id/usernameP" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/logo" /> <android.support.design.widget.TextInputLayout android:id="@+id/usernameP" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toTopOf="parent"> <android.support.design.widget.TextInputEditText android:id="@+id/username" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="اسم المستخدم" /> </android.support.design.widget.TextInputLayout> <android.support.design.widget.TextInputLayout android:id="@+id/passP" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" app:layout_constraintTop_toBottomOf="@+id/usernameP"> <android.support.design.widget.TextInputEditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="44dp" android:hint="كلمة المرور" /> </android.support.design.widget.TextInputLayout> <Button android:id="@+id/loginBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:text="تسجيل الدخول" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/passP" /> </android.support.constraint.ConstraintLayout>
اولا الواجهة رغم انني لم اعد استعمل xml انتقلت الى انكو يمكنك الاطلاع على اهم المميزات هنا.
الان سنستعمل دالة مكتبة fuel (واحدة من اقوى المكتبات في مجال الشبكات) لجلب محتوى ملف login.php و الذي هو على شكل Json :
الان سنستعمل دالة مكتبة fuel (واحدة من اقوى المكتبات في مجال الشبكات) لجلب محتوى ملف login.php و الذي هو على شكل Json :
login.kt
package com.androidbella.blog
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.github.kittinunf.fuel.Fuel
import com.github.kittinunf.result.Result
import kotlinx.android.synthetic.main.activity_main.*
import org.json.JSONObject
import java.nio.charset.Charset
import android.widget.Toast
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//منغير سيحمل اسم المستخدم
var usr:String
//منغير سيحمل كلمة المرور
var pass:String
//عند الظغط على زر تسجيل الدخول
loginBtn.setOnClickListener{
//اخد المعلومات من الحقول
usr=username.text.toString()
pass=password.text.toString()
//ارسال طلب الى السيرفر
Fuel.post("http://10.0.2.2/~pro/login.php",
//ارسال اسم المستخدم و كلمة المرور الى السيرفر بطريقة امنة
listOf("username" to usr,"password" to pass))
.response { _, _, result ->
when (result) {
is Result.Failure >> {
//في حالة فشل الاتصال
val ex = result.getException()
}
is Result.Success >> {
//نجاح الاتصال
try {
//اخد الرد من السيرفر و تحليله محتواه باستعمال jsonObject
val data = result.get()
val jsonObj = JSONObject(data.toString(Charset.defaultCharset()))
val error = jsonObj.getBoolean("error")
if (!error) {
//ثم التحقق من هوية المستخدم
//اخد id
Toast.makeText(applicationContext, "Your id is ${jsonObj.getString("uid")}", Toast.LENGTH_LONG).show()
//اخد الاسم
val user = jsonObj.getJSONObject("user")
Toast.makeText(applicationContext, "So your name is ${user.getString("name")}", Toast.LENGTH_LONG).show()
} else {
//لم يتم التحقق
val errorMsg = jsonObj.getString("error_msg")
Toast.makeText(applicationContext,
errorMsg, Toast.LENGTH_LONG).show()
}
}catch (e:Exception){
//مشاكل بالجيسون
Log.e("e",e.message)
Toast.makeText(applicationContext,"حدث خطا غير متوقع" , Toast.LENGTH_LONG).show()
}
}
}
}
}
}
}
ملاحظة هذا الدرس لا يكفي لانه لا يحمي قاعدة بياناتك من الاختراق. لكن يمكنني ان اتحدث عنها ما دامت هناك تعليقات
اترك لنا تعليقا