الاتصال بقاعدة بيانات MySQL من خلال الاندرويد

قبل مدة ليست بالبعيدة و بعد انتهائي من معرفة جل اساسيات برمجة الويب بواسطة php و js بدون فريمات قررت الانتقال الى الاندرويد بعد انتهائي من الدورة تبادر الى دهنى سؤال و هو كيف يمكنني الاتصال بقاعدة بيانات Mysql من خلال الاندرويد و بعد البحث صدمت انه غير ممكن لكن هناك بديل يسمى Rest api .

فيديو يوضح النتيجة التي سنصل اليها


المتطلبات:
  1. اساسيات php .
  2. الاتصال بقاعدة البيانات sql .
  3. جيسون Json هو سهل التعلم اسهل من HTML .
  4. اساسيات الكوتلن و الاندرويد.

متطلبات التشغيل :

اضف التالي الى dependencies:

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

<?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 :
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()
        }
       }
      }
     }
  }
 }
}


ملاحظة هذا الدرس لا يكفي لانه لا يحمي قاعدة بياناتك من الاختراق. لكن يمكنني ان اتحدث عنها ما دامت هناك تعليقات
هل ترغب في مثل هذه التدوينات

اسماعيل ايت بلا

ببساطة ارغب في تجربة جديدة من التعلم من خلال مشاركة ما تعلمه يجبرني ذلك على البحث لمدة طويلة مما يجعل الموقع جديرا بالثقة

اترك لنا تعليقا

الاشتراك بالقائمة البريدية

توصل باحدث مواضيعنا و كن على اطلاع باخر اخبار وتقنيات الاندرويد