کد PHP ذخیره اطلاعات ورودی اندروید

درس بعدی ||||| درس قبلی

در این آموزش قصد دارم با استفاده از ساختار شی گرایی صفحه وبی برای ثبت اطلاعات کاربر در MySQL ایجاد کنیم بطوریکه بتوان از فرم های مختلف در وب و اندروید اطلاعات را در آن ذخیره کرد. برای این منظور ابتدا یکسری توضیحات در مورد ساختار شی گرایی داده می شود:

تعریف کلاس: کلاس با استفاده از کلمه کلیدی class تعریف می شود و محتویات کلاس که شامل خصوصیات و متدها هستند در داخل آکولاد قرار می گیرند:

<?php
class DBConncect {
  // code goes here...
}
?>

تعریف سازنده (Constructor):

یک سازنده به شما امکان می دهد تا خصوصیات یک شی را در هنگام ایجاد شی آغاز کنید. اگر یک تابع __construction () ایجاد کنید ، PHP هنگام ایجاد یک شی از یک کلاس به طور خودکار این تابع را فراخوانی می کند. توجه داشته باشید که عملکرد سازه با دو زیر خط (__) شروع می شود! مثال:

function __construct()
	{
		
	}

تابع prepare و bind_param
تابع prepare برای اجرای همان عبارات SQL (یا مشابه) به طور مکرر با بازده بالا استفاده می شود.

تابع prepare اساساً مانند این عمل می کنند:

آماده سازی: یک الگوی دستور SQL ایجاد شده و به پایگاه داده ارسال می شود. مقادیر با برچسب ؟ مشخص می شوند . مثال:

INSERT INTO MyGuests VALUES(?, ?, ?)


پایگاه داده پرس و جو را در الگوی دستور SQL کامپایل می کند و نتیجه را بدون اجرای آن ذخیره می کند.
اجرا: در زمان بعدی ، برنامه مقادیر را به پارامترها متصل می کند و پایگاه داده دستور را اجرا می کند. برنامه ممکن است دستور را هر چند بار که بخواهد با مقادیر مختلف اجرا کند
در مقایسه با اجرای مستقیم عبارات SQL ، دستورات تهیه شده دارای سه مزیت اصلی هستند:

دستورات آماده شده زمان تجزیه را کاهش می دهند زیرا آماده سازی روی پرس و جو فقط یک بار انجام می شود (اگرچه دستور چندین بار اجرا می شود)
پارامترهای Bound پهنای باند را به سرور کاهش می دهند زیرا شما باید هر بار فقط پارامترها را ارسال کنید ، و نه کل پرس و جو
دستورات آماده شده در برابر تزریق SQL بسیار مفید هستند ، زیرا از مقادیر پارامترهایی که بعداً با استفاده از پروتکل دیگری منتقل می شوند ، نیازی به درست فرار نیست. اگر الگوی بیانیه اصلی از ورودی خارجی مشتق نشده باشد ، تزریق SQL امکان پذیر نیست.

ابتدا بانک اطلاعاتی با نام user ایجاد می کنیم. سپس در آن یک جدول با مشخصات زیر می سازیم:

پس از معرفی مطالب گفته شده قصد داریم برنامه را ایجاد کنیم. ابتدا یک پوشه با نام Android ایجاد می کنیم. در آن یک پوشه دیگر به نام includes می سازیم. در پوشه includes فایل constansts.php را می سازیم. کدهای اولیه مقداردهی به پایگاه داده را در آن قرار می دهیم.


<?php
	define('DB_NAME', 'user');
	define('DB_USER', 'root');
	define('DB_PASSWORD', '');
	define('DB_HOST', '127.0.0.1');
?>

جهت برقرار ارتباط با بانک اطلاعاتی ، یک فایل دیگر در پوشه includes با نام DBConnector.php ایجاد می کنیم. محتوی این کلاس یک خصوصیت با نام con است که به صورت زیر تعریف می شود:

private $con;

سازنده نیز به صورت زیر تعریف می شود:

function __construct()
	{
		
	}

یک متد به نام connect جهت اتصال با بانک اطلاعاتی ساخته می شود. جهت اتصال به مقادیر موجود در فایل constant.php نیاز است. برای این منظور از دستور inclue_once استفاده می شود:

include_once dirname(__FILE__).'/constant.php';

سپس با تابع mysqli درخواست اتصال زده می شود:

$this->con=new mysqli(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME);

کد کامل کلاس DBConnect به صورت زیر است:

<?php

class DBConnect
{
	private $con;
	
	function __construct()
	{
		
	}

	function connect(){
		include_once dirname(__FILE__).'/constant.php';
		
		$this->con=new mysqli(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME);

		if (mysqli_connect_errno()) {
			echo "failed to connect";
		}
		return $this->con;
	}


}
?>

یک فایل دیگر در پوشه ی includes با نام DBOperations.php ایجاد می کنیم. در این فایل قصد داریم متدی قرار دهیم که رکورد جدید به جدول اضافه می کند. ابتدا در سازنده کلاس به بانک اطلاعاتی متصل می شویم:

private $con;
function __construct(){

    require_once dirname(__FILE__).'/DBConnect.php';
    $db=new DBConnect();
    $this->con=$db->connect();
}

متد createUser جهت اضافه کردن یک رکورد جدید به کلاس DBOperations اضافه می شود. برای این منظور از طریق سه آرگومان سه مقدار دریافت می شود. ابتدا پسورد رمزگذاری می شود. سپس به کمک تابع prepare به صورت زیر دستور SQL وارد می شود:

$password=md5($password);
$stmt=$this->con->prepare("INSERT INTO `tbl_user`(`id`,`username`,`password`,`email`)values(null,?,?,?)");

در مرحله بعد پارامترها به کمک تابع bind_param داده می شود. چون سه مقدار باید قرار بگیرند(بجای هر علامت سوال) بنابراین sss تعیین می شود و آرگومان ها به عنوان نام کاربری رمز عبور و ایمیل مشخص می شوند:

$stmt->bind_param("sss",$username,$password,$email);

در انتها باید رشته SQL اجرا شود. چنانچه مشکلی نداشت متد createUser مقدار true و در غیراینصورت مقدار false را برمی گرداند:

if ($stmt->execute()) {
	
	return true;

}else
{
	return false;
}

کل کد مربوط به فایل DBOperations به صورت زیر است:

<?php
	
	/**
	 * 
	 */
	class DbOperations{

		private $con;
		function __construct(){

			require_once dirname(__FILE__).'/DBConnect.php';
			$db=new DBConnect();
			$this->con=$db->connect();
		}

		function createUser($username,$password,$email){
			$password=md5($password);
			$stmt=$this->con->prepare("INSERT INTO `tbl_user`(`id`,`username`,`password`,`email`)values(null,?,?,?)");
			$stmt->bind_param("sss",$username,$password,$email);
			if ($stmt->execute()) {
				
				return true;

			}else
			{
				return false;
			}

		}
	}

?>

حالا یک پوشه به نام v1 در پوشه ی Android می سازیم و در آن فایل registerUser.php را قرار می دهیم. ابتدا به محتویات DBOperations باید دسترسی داشته باشیم تا از طریق آن رکورد جدید به جدول اضافه شود:

include_once '../includes/DbOperations.php';

یک آرایه بنام response تعریف می کنیم. محتوای این آرایه یک صفت بنام error از نوع بولین است که برای تعیین خطا بکار می رود. صفت دیگر متنی است که به کاربر نشان داده می شود و با message مشخص می شود:

$response=array();

ابتدا بررسی می شود اطلاعات با متد POST باشد. سپس نام پسورد و ایمیل بدرستی وارد شده باشد.

if ($_SERVER['REQUEST_METHOD']=='POST') {
	if (isset($_POST['username'])
		and isset($_POST['password'])
		and isset($_POST['email'])) {

اتصال برقرار می شود و متد createUser فراخوانی می شود در صورتیکه مشکلی پیش نیامده باشد مقدار error false می شود و مقدار message پیغام user registered successfully می باشد:

$db=new DbOperations();
if ($db->createUser($_POST['username'],$_POST['password'],$_POST['email'])) {
	$response['error']=false;
	$response['message']="user registered successfully";
}

در انتها محتویات آرایه ی respone به صورتJSON توسط تابع json_encode نشان داده می شود:

echo json_encode($response);

کد کامل فایل registerUser.php بصورت زیر می باشد:

<?php
	
	include_once '../includes/DbOperations.php';
	$response=array();
	if ($_SERVER['REQUEST_METHOD']=='POST') {
		if (isset($_POST['username'])
			and isset($_POST['password'])
			and isset($_POST['email'])) {
			
			$db=new DbOperations();
			if ($db->createUser($_POST['username'],$_POST['password'],$_POST['email'])) {
				$response['error']=false;
				$response['message']="user registered successfully";
			}else{
				$response['error']=true;
				$response['message']="Undefined error ";
			}
		}else{
			$response['error']=true;
			$response['message']="Requied fields are invalid";
		}
	}else{
		$response['error']=true;
		$response['message']="Invalid request method";
	}
	echo json_encode($response);
?>

جهت تست خروجی از نرم افزار Postman استفاده می شود که تنظیمات را بصورت شکل زیر در آن تنظیم می کنیم و خروجی در صورتیکه خطایی نباشد بصورت شکل نشان داده می شود: