(بناء Web Service تقوم بعمل Login و Register) ربط تطبيق أندرويد مع MySQL و PHP و JSON

السلام عليكم ورحمة الله وبركاته

(جاري تحديث الموضوع)

فهرس سلسلة دروس ربط تطبيق أندرويد مع MySQL و PHP و JSON :

  1. مقدمة وشرح توضيحي عن Web Services وعن المشروع.
  2. إعداد السيرفر المحلي WAMP و بناء قاعدة بيانات MySQL.
  3. التعامل مع PHP لبناء Web Service  تقوم بعمل Login و Register (مع شرح مبسط عن JSON) .
  4. التعامل مع PHP لبناء Web Service  بجلب بيانات المستخدمين الموجودة بقاعدة البيانات.
  5. بناء مشروع أندرويد  جديد و إعداد واجهة تطبيق الأندرويد.
  6. تطوير كلاسات Register و Login وJSONParser في أندرويد.
  7. تطوير UsersActivity و ListViewAdapter لعمل قائمة المستخدمين بالتنسيق الذي نحتاجه.

 

 

كود register.php

<?php
/***
 * @author Ahmed Saleh
 * Created by ahmadssb on 2014-12-13
 * Website: http://www.ahmadssb.com
 * Email: [email protected]
 * Facebook: https://www.facebook.com/ahmadssbblog
 * Twitter: https://twitter.com/ahmadssb
 * YouTube: http://www.youtube.com/user/ahmadssbblog
 */
 
require("config.php");

// في حال عدم وجود طلب POST 
// سنقوم بعرض فورم HTML  الموجود بآخر الكود
if(!empty($_POST)){

    // تأكد من أن المستخدم قام بإدخال جميع الحقول المطلوبة 
	// username , password, displayname  هي الحقول المطلوبة لتنفيذ هذا الكودdisplayname
    if(empty($_POST['username'])||empty($_POST['password'])||empty($_POST['displayname'])){
        
		// في حال عدم تعبئة أحد الحقول سنقوم بعرض رسالة تنبيه للمستخدم
		
		//  إنشاء بعض البيانات ليتم عرضها كـ JSON Object
		/*
		* الهدف من success   
		* التأكد من أن  عملية التسجيل تمت بنجاح ام لا
		* عند الحصول على القيمة صفر ، ذلك يعني لم تتحقق جميع الشروط المطلوبة لتسجيل الدخول 
		*/
		$response["success"] = 0; 
		
	    // الرسالة التي ستظهر للمستخدم أو المطور 
		// (حيث بإمكان المطور لاحقا وضع رسالة خاصة به كل ما يحتاجه فقط قيمة success)
		
        $response["message"] = "All Fields Required";
        
        //  نقوم بإيقاف السكريبت و نطبع رسالة JSON
        /* 
		* الدالة json_encode() 
		* نقوم هذه الدالة بتحويل قيمة response 
		* إلى JSON
        */
        die(json_encode($response));
    }
	
    // في حال عدم وجود أي خطأ سنقوم بتنفيذ الأسطر التالية
    
    // نتأكد من عدم وجود اسم مستخدم آخر في قاعدة البيانات باستخدام COUNT(*)
	// إذا كانت القيمة أكثر من 0 ذلك يعني وجود مستخدم آخر بنفس الإسم
    // ":user" فقط لحجز قيمة username  وتحويلها لنص قبل تنفيذ أمر sql
	// نقوم بعمل ذلك لحماية قاعدة البيانات من SQL injections
	
    $query = "SELECT COUNT(*) AS count 
				   FROM users 
				   WHERE 
				   user_username = :user";
    
    // نقوم بتحديث قيمة :user 
    $query_params = array(
        ':user' => $_POST['username']
    ); 
    
    
    
    // الآن نقوم بتنقيذ أمر SQL
    try{
        // يقوم هذا السطر بإعداد أمر SQL
        $stmt = $db->prepare($query);
		// يقوم هذا السطر بتنفيذ أمر SQL مع المتغيرات التي قمنا بإدخالها
        $result = $stmt->execute($query_params);
		
		// نقوم  الآن بحساب ناتج قيمة count 
		// PDO::FETCH_ASSOC
		// تقوم بإرجاع كل صف ناتج من الأمر كمصفوفة [column] => value
		while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
		$username_count = $row["count"];
		//print_r($row);
		}
			// الآن نتأكد ان كانت قيمة username_count
			// إذا كانت أكبر من 0  ذلك يعني وجود اسم مستخدم مسجل في قاعدة البيانات 
			if ($username_count > 0) {
			
				// نقوم بإعداد بيانات JSON 
				// ورسالة للمستخدم بإن اسم المستخدم متاح مسبقا
				$response["success"] = 0;
				$response["message"] = "That username is already taken. Please try again.";
				
				// نقوم بإيقاف السكريبت و نطبع رسالة JSON
				die(json_encode($response));
				
		}

		
    }catch(PDOException $ex){
        
		// في حال وجود خلل في من قاعدة البيانات 
		// نقوم باعداد بيانات JSON
		// ونعرض رسالة تنبيه للمستخدم
        $response["success"] = 0;
        $response["message"] = "Something went wrong. Please try again later";

		// نقوم بإيقاف السكريبت و نطبع رسالة JSON
        die(json_encode($response));
        
    }
   
	// إذا لم يحصل أي خلل حتى هذا السطر 
	// هذا يعني أنه بإمكانه إدخال بيانات المستخدم في قاعدة البيانات
	
    // الآن نقوم بإعداد أمر SQL  لإدخال بيانات المستخدم في قاعدة البيانات
	// :user, :pass نستخدم نفس الطريقة التي شرحتها بالأعلى لإدخال البيانات في قاعدة البيانات
    $query = "INSERT INTO 
					users (user_username, user_password, user_displayname) 
					VALUES 
					(:user, :pass, :displayname)";
    
    // نقوم بتشفير كلمة المرور 
    $encr_user_pass = md5($_POST['password']);
    
    
    // نقوم بتحديث قيمة المتغيرات :user, :pass ,:displayname
    $query_params = array(
        ':user' => $_POST['username'],
		// :pass قمنا بتحديثه بكلمة المرور المشفرة 
        ':pass' =>  $encr_user_pass,
		':displayname' => $_POST['displayname']
    );
    
    // نقوم بتنفيذ أمر SQL لإدخال اسم المستخدم و كلمة المرور في قاعدة البيانات 
    try {
        $stmt = $db->prepare($query);
        $result = $stmt->execute($query_params);
               
    } catch (PDOException $ex) {
       // في حال وجود خلل في من قاعدة البيانات 
		// نقوم باعداد بيانات JSON
		// ونعرض رسالة تنبيه للمستخدم
		
        $response["success"] = 0;
        $response["message"] = "The username is already in use, please try again later!";
		
		// نقوم بإيقاف السكريبت و نطبع رسالة JSON
        die(json_encode($response));
    }
	
	/*
	* إذا وصلنا إلى هذه السطر بدون أي مشاكل 
	* هذا يعني أنه تم ادخال اسم المسخدم وكلمة المرور بقاعدة البيانات بنجاح 
	*/
    
	// أخيرا سنقوم بتغيير قيمة success = 1
	// و رسالة تفيد بأنه تم ادخال البيانات بنجاح
    $response["success"] = 1;
    $response["message"] = "Username Successfully Added";
	
	// و أخيرا نعرض رسالة JSON  للمستخدم
    echo json_encode($response);
        
}else{
    ?>

<h1>Register</h1>
<form action="register.php" method="post">
    Username: <br/>
    <input type="text" name="username" placeholder="Username"/><br/>
    Password: <br/>
    <input name="password" type="password" placeholder="Password"/><br/>
    Display Name: <br/>
    <input type="text" name="displayname" placeholder="Display Name"/><br/>
    <input type="submit" value="Register User"/>
</form>
<?php
}

?>

 

كود login.php

<?php
/***
 * @author Ahmed Saleh
 * Created by ahmadssb on 2014-12-13
 * Website: http://www.ahmadssb.com
 * Email: [email protected]
 * Facebook: https://www.facebook.com/ahmadssbblog
 * Twitter: https://twitter.com/ahmadssb
 * YouTube: http://www.youtube.com/user/ahmadssbblog
 */
 
require('config.php');

// في حال عدم وجود طلب POST 
// سنقوم بعرض فورم HTML  الموجود بآخر الكود
if(!empty($_POST)){
    
	// تأكد من أن المستخدم قام بإدخال جميع الحقول المطلوبة 
	// username , password  هي الحقول المطلوبة لتنفيذ هذا الكود
    if(empty($_POST['username'])||empty($_POST['password'])){
	// في حال عدم تعبئة أحد الحقول سنقوم بعرض رسالة تنبيه للمستخدم
		
		//  إنشاء بعض البيانات ليتم عرضها كـ JSON Object
		/*
		* الهدف من success   
		* التأكد من أن  عملية التسجيل تمت بنجاح ام لا
		* عند الحصول على القيمة صفر ، ذلك يعني لم تتحقق جميع الشروط المطلوبة لتسجيل الدخول 
		*/
		
        $response["success"] = 0;
		
	    // الرسالة التي ستظهر للمستخدم أو المطور 
		// (حيث بإمكان المطور لاحقا وضع رسالة خاصة به كل ما يحتاجه فقط قيمة success)
		
        $response["message"] = "All Fields Required";
		
		//  نقوم بإيقاف السكريبت و نطبع رسالة JSON
        /* 
		* الدالة json_encode() 
		* نقوم هذه الدالة بتحويل قيمة response 
		* إلى JSON
        */
        die(json_encode($response));
    }
	
	 // في حال عدم وجود أي خطأ سنقوم بتنفيذ الأسطر التالية
    
    // نقوم بكتابة أمر SQL للتأكد من وجود اسم المستخدم
    // ":user" فقط لحجز قيمة username  وتحويلها لنص قبل تنفيذ أمر sql
	// نقوم بعمل ذلك لحماية قاعدة البيانات من SQL injections
    
    $query = "
            SELECT * FROM `users` 
            WHERE
            user_username = :user
             ";
			 
	// نقوم بتحديث قيمة :user
    $query_params = array(
        ':user' => $_POST['username']
    );
	
	// الآن نقوم بتنقيذ أمر SQL
    try {
		// يقوم هذا السطر بإعداد أمر SQL
        $stmt = $db->prepare($query);
		
		// يقوم هذا السطر بتنفيذ أمر SQL مع المتغيرات التي قمنا بإدخالها
        $result = $stmt->execute($query_params);
    } catch (PDOException $ex) {
	
		// في حال وجود خلل في من قاعدة البيانات 
		// نقوم باعداد بيانات JSON
		// ونعرض رسالة تنبيه للمستخدم		
        $response['success'] = 0 ;
        $response['message'] = "Database Error1, Please try Again";
        die(json_encode($response));
    }
	
	/*
	* إذا لم يحصل أي خلل حتى هذا السطر 
	* ذلك يعني ان اسم المستخدم موجود في قاعدة البيانات
	*/
	
	// الآن علينا التأكد من كلمة المرور
	
	// أولا سنقوم بكتابة متغير is_login ليكون قيمته false 
	$is_login = false;
    
	// سنقوم بتشفير الباسوود المدخل بنفس طريقة التشفير المستخدمة في register.php
    $encr_user_pass = md5($_POST['password']);
    
	// سنقوم بجلب جميع الصفوف الناتجة من أمر SQL
	// في هذه الحالة سيكون  هناك صف واحد فقط لأنه لن يكون هناك اسم مستخدم مكرر
	$row = $stmt->fetch();
	
	// في حال وجود صفوف ناتجة من أمر SQL
    if ($row){
        // نقوم بمقارنة كلمة المرور المشفرة مع كلمة المرور الموجودة في قاعدة البيانات
        if($encr_user_pass === $row['user_password']){
			// في حال تطابق كلمة المرور
			// سنقوم بتغيير قيمة is_login الى true
            $is_login = true;
        }
    }
    

	/*
	* أخيرا إن كانت قيمة is_login = true
	* فهذا يعني أن اسم المستخدم و كلمة المرور صحيحة 
	* 
	*  غير ذلك فسنعرض رسالة خطأ للمستخدم
	*/
    if($is_login){
		// في حال تم تحقيق الشرط 
		// سنقوم بتغيير  success = 1
		// و رسالة تفيد بأنه تسجيل الدخول بنجاح
        $response["success"] = 1;
        $response["message"] = "Login Successful";
	
	// و أخيرا نعرض رسالة JSON  للمستخدم
        die(json_encode($response));
    }else{
		// في حال تم تحقيق الشرط 
		// سنقوم بتغيير  success = 0
		// و رسالة بأن اسم المستخدم أو كلمة المرور خاطئة
        $response["success"] = 0;
        $response["message"] = "username or password Incorrect";
		// و أخيرا نعرض رسالة JSON  للمستخدم
        die(json_encode($response));
    }
    
}else{
?>
<h1>Login</h1>
<form action="login.php" method="post">
    Username: <br/>
    <input type="text" name="username" placeholder="Username"/><br/>
    Password:<br/>
    <input type="password" name="password" placeholder="Password"/><br/>
    <input type="submit" value="Login"/>
    <a href="register.php">Register</a>
</form>
<?php
}
?>

بإمكانك تحميل المشروع من خلال GitHub :
https://github.com/ahmadssb/Android-PHP-MySQL-JSON-Tutorial.git

4 Comments

Add a Comment
  1. WordPress › Error

    There has been a critical error on this website.

    Learn more about troubleshooting WordPress.