الحمد لله والصلاة والسلام على رسول الله
السلام عليكم ورحمة الله وبركاته
هذا الدرس ضمن سلسة دروس الدورة التالية لتعلم لغة php !
* التعامل مع قواعد البيانات في لغة PHP :
اليوم بإذن الله سنتحدث عن أحد وسائط تخزين البيانات وهي قواعد البيانات , لغة PHP من اللغات المرنة جداً التي تدعم التعامل مع نطاق واسع من أنواع قواعد البيانات .
ما سنتناوله اليوم هو التعامل مع قواعد بيانات mySQL من خلال لغة PHP .
قبل أن نبدأ في التعامل مع قواعد البيانات فرجاء تنفيذ الآتي:
1- الإطلاع على قواعد إنشاء قواعد البيانات العلاقية وستجد شرح جيد لها على هذا الرابط يإسلوب ممتع .
2- دراسة التعامل مع أوامر اللغة الهيكلية SQL من إنشاء وحذف وتعديل الجداول وإدخال والتعديل على البيانات وخلافه من أوامر اللغة ويمكن الإطلاع على أحد الكتب لها على هذا الرابط .
الآن نريد إنشاء إتصال بقاعدة البيانات فيجب أن تتوفر لنا أربعة أشياء وهي :
1- مستضيف قواعد البيانات : وغالباً ما يكون localhost أو مستضيف خارجي كما في بعض الإستضافات على شبكة الويب .
2- اسم مستخدم قاعدة البيانات : يمكنك الرجوع للخادم الذي تستخدمه للحصول عليه .
3- كلمة المرور لمستخدم قاعدة البيانات : يمكنك الرجوع للخادم الذي تستخدمه للحصول عليه .
4- اسم قاعدة البيانات : وهو الاسم الذي ستقوم بإنشاءه أنت لقواعد البيانات أو اسم قاعدة موجودة مسبقاً .
*وبمعرفة البيانات 1 و 2 و 3 على حسب الخادم الذي تستخدمه تبقى لنا اسم قاعدة البيانات سنقوم بإنشائها قم بالدخول لمدير قواعد البيانات phpMyAdmin ثم إختار database وأكتب اسم قاعدة البيانات وإختار ترميز القاعدة Collation وهو utf8_general_ci لأننا سنتعامل مع اللغة العربية وهو ترميز يدعم عدة لغات ضمن قاعدة واحدة ثم قم بإنشاء قاعدة البيانات create
- فرضاً أننا أنشأنا قاعدة بيانات باسم test وكنا نستخدم الخادم easyPHP ستكون البيانات كالتالي :
1- مستضيف قواعد البيانات : localhost
2- اسم مستخدم قاعدة البيانات : root
3- كلمة المرور لمستخدم قاعدة البيانات : أتركها فارغة
4- اسم قاعدة البيانات : test
- الأن سنقوم بتعريف مصفوفة باسم database وحفظ هذه القيم بها كالتالي :
$database['host'] = 'localhost'; $database['username'] = 'root'; $database['userpass'] = ''; $database['name'] = 'test';
- الآن لعمل إتصال بقاعدة البيانات سنستخدم دالة mysqli_connect وهي تأخذ أربع وسائط هي البيانات الأربع السابقة وتعيد ما يعرف برابط الإتصال بقاعدة البيانات في حالة نجاح الإتصال ويكون الكود كالتالي :
$conn_link = mysqli_connect($database['host'],$database['username'],$database['userpass'],$database['name']) or die(mysqli_connect_error());
- ففي حالة عدم المقدرة على تكوين رابط الإتصال سيتم الخروج بإستخدام دالة die وطباعة خطأ الإتصال بقاعدة البيانات من خلال دالة mysqli_connect_error تجد أن الدالة die لا تعمل بسبب إظهار الأخطاء مباشراً بواسطة مترجم اللغة على المتصفح ولكن لتجربة عملها قم بإيقاف إظهار الأخطاء على المتصفح بإستخدام الكود التالي:
error_reporting(0);
* تمت عملية الإتصال وجلب رابط الإتصال والآن سنقوم بتفيذ أوامر SQL على قاعدة البيانات وكتطبيق سنقوم بتنفيذ عملية الدخول وتسجيل الدخول التي تم شرحها في الدرس السادس و السابع ولكن بإستخدام قواعد البيانات
- سنقوم بإنشاء جدول وليكن باسم users به معرف المستخدم id واسم المستخدم username وكلمة المرور password والبريد الإلكتروني سيكون نص أمر SQL لتنفيذ هذا كالتالي :
CREATE TABLE users (
user_id INT(10) UNSIGNED AUTO_INCREMENT,
user_name VARCHAR(100) NOT NULL,
user_pass VARCHAR(100) NOT NULL,
user_email VARCHAR(100) NOT NULL,
UNIQUE (user_name),
PRIMARY KEY (user_id)
)* شرح كود SQL السابق :
- CREATE هو أمر الإنشاء و CREATE TABLE أي قم بإنشاء جدول ثم اسم الجدول المراد إنشاءه ثم نضع الحقول ضمن الأقواس ()
- User_id الرقم التعريفي للمستخدم , INT(10) أي عدد صحيح بطول 10 خانات وبما أننا لا نحتاج للأرقام السالبة معنا جعنا هذا الحقل UNSIGNED لنستفيد من مداه , AUTO_INCREMENT أي أن هذا الحقل يتم زيادته تلقائياً بمقدار 1
- user_name اسم المستخد , VARCHAR(100) أي سلسلة نصية بطول 100 عنصر , NOT NULL أي لا يقبل هذا الحقل القيمة الفارغة null .
- user_pass كلمة المرور للمستخدم , VARCHAR(100) أي سلسلة نصية بطول 100 عنصر , NOT NULL أي لا يقبل هذا الحقل القيمة الفارغة null .
- user_email البريد الإلكتروني للمستخدم , VARCHAR(100) أي سلسلة نصية بطول 100 عنصر , NOT NULL أي لا يقبل هذا الحقل القيمة الفارغة null .
- UNIQUE (user_name) أي أجعل حقل اسم المستخدم فريد لا يتكرر .
- PRIMARY KEY (user_id) جعل الرقم التعريفي للمستخدم هو المفتاح الأساسي للجدول .
* سنقوم بوضع الكود السابق بين علامتي إقتباس وإسناده لمتغير وليكن باسم $query كالتالي:
$query = "CREATE TABLE users (
user_id INT(10) UNSIGNED AUTO_INCREMENT,
user_name varchar(100) NOT NULL,
user_pass varchar(100) NOT NULL,
user_email varchar(100) NOT NULL,
UNIQUE (user_name),
PRIMARY KEY (user_id)
)DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci";
- تم إضافة السطر الأخير لضبط ترميز هذا الجدول إلى utf-8 إن لم تكن قاعدة البيانات التي تستخدمها بهذا الترميز -يمكن لقاعدة البيانات أن تحوي جداول بترميزات مختلفة-
* ملاحظة : إذا كان ترميز قاعدة البيانات هو utf-8 فلا حاجة لكتابة هذا السطر لأن قاعدة البيانات إفتراضياً تنشئ الجداول بنفس ترميز قاعدة البيانات .
- سنقوم بتفيذ هذا الإستعلام على قاعدة البيانات بإستخدام دالة mysqli_query وتأخذ وسيطين الأول هو رابط الإتصال والثاني هو نص أمر الـ SQL ويصبح كاملاً كالتالي :
<?php
// مستضيف قاعدة البيانات
$database['host'] = 'localhost';
// اسم المستخدم لقاعدة البيانات
$database['username'] = 'root';
// كلمة المرور لمستخدم قاعدة البيانات
$database['userpass'] = '';
// اسم قاعدة البيانات
$database['name'] = 'test';
// كود عمل رابط الإتصال بقاعدة البيانات
$conn_link = mysqli_connect($database['host'],$database['username'],$database['userpass'],$database['name']) or die(mysqli_connect_error());
// أوامر SQL
$query = "CREATE TABLE users (
user_id INT(10) UNSIGNED AUTO_INCREMENT,
user_name varchar(100) NOT NULL,
user_pass varchar(100) NOT NULL,
user_email varchar(100) NOT NULL,
UNIQUE (user_name),
PRIMARY KEY (user_id)
)DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci";
// تنفيذ الإستعلام
if (mysqli_query($conn_link,$query) === true)
{
echo '<h3>تم إنشاء الجدول بنجاح</h3>';
}
else
{
echo '<h3>خطأ لم يتم إنشاء الجدول</h3>';
}
?>
* ملاحظة : تم إستخدام معاملات المساواة الثلاثية === لأن دالة mysqli_query تعيد إما القيمة false في حالة فشل تنفيذ الإستعلام أو تعيد كائن في حالة الإستعلامات التي تعود بقيم من قاعدة البيانات أو تعيد القيمة true في حالة تنفيذ الإستعلام الذي لا يعود ببيانات كما في حالتنا , حيث أن الكائن يعتبر قيمة صحيحة إذا استخدمنا معامل المساواة الثنائي ==
- سنقوم بإنشاء صفحة باسم database_connect.php لعملية الإتصال بقاعدة البيانات لتضمين الملف عند الحاجة له ونضع به الكود التالي:
<?php // مستضيف قاعدة البيانات $database['host'] = 'localhost'; // اسم المستخدم لقاعدة البيانات $database['username'] = 'root'; // كلمة المرور لمستخدم قاعدة البيانات $database['userpass'] = ''; // اسم قاعدة البيانات $database['name'] = 'test'; // كود عمل رابط الإتصال بقاعدة البيانات $conn_link = mysqli_connect($database['host'],$database['username'],$database['userpass'],$database['name']) or die(mysqli_connect_error()); ?>
* ملاحظة: لا ننسى عند تضمين هذا الملف خارج الدوال أن نعرف المتغير $conn_link على أنه global .
- ونقوم أيضاً بإنشاء ملف باسم database_close.php ونضع به كود إغلاق الإتصال بقاعدة البيانات كالتالي :
<?php mysqli_close($conn_link);?>
*ملاحظة : سنقوم بالعمل على ملفات الدرس السابع لعملية التسجيل وتسجيل الدخول .
- الآن نريد تنفيذ عملية التسجل على قاعدة البيانات سنقوم بتغير دالتي checkUser و signUp فقط في ملف signup.php وسنقوم بتضين ملف database_connect.php في بداية الملف وملف database_close.php في نهايته
أولاً: دالة checkUser ستصبح كالتالي :
function checkUser() {
global $conn_link;
$query = "SELECT * FROM users WHERE user_name='{$_POST['username']}'";
if ($result = mysqli_query($conn_link,$query))
{
if(mysqli_num_rows($result) == '1')
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
- الدالة واضحة واستخدمنا دالة mysqli_num_rows لحساب عدد الحقول التي تم جلبها من قاعدة البيانات ونحن نعلم أن اسم المستخدم لا يتكرر أي أن عدد الحقول إما أن يكون 1 أو 0
- ومعنى إستعلام SQL هو إختيار جميع الجقول التي يكون فيها اسم المستخدم مساوي لقيمة اسم المستخدم التي تم جلبها من النموذج .
ثانياً: دالة signUp :
function signUp() {
global $conn_link;
$query = "INSERT INTO users (user_name,user_pass,user_email) VALUES ('{$_POST['username']}','{$_POST['password']}','{$_POST['email']}')";
if (mysqli_query($conn_link,$query) === true)
{
return true;
}
else
{
return false;
}
}- - ومعنى إستعلام SQL قم بإضافة العناصر إلى الجدول - يمكنك مراجعة أحد كتب أوامر mySQL -
والآن سنعدل دالة login في ملف تسجيل الدخول login.php وتصبح كالتالي :
function login($username, $password) {
global $conn_link;
$query = "SELECT * FROM users WHERE user_name='$username' and user_pass='$password'";
if ($result = mysqli_query($conn_link,$query))
{
if(mysqli_num_rows($result) == '1')
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
ولا ننسي أيضاً تضمين كلاً من ملف الإتصال بالقاعدة في البداية وملف إنهاء الإتصال في نهاية الملف .
ملاحظة : قبل أي عملية على قواعد البيانات سواء جلب بيانات أو إرسال بيانا يرجى تنفيذ الأمر التالي من خلال دالة mysqli_query حتى يتم ضبط الترميز إلى utf-8 وتظهر اللغة العربية بشكل جيد ويتم تخزينها أيضاً بترميز utf-8 .
mysqli_query($conn_link,"SET NAMES 'utf8'")
والتالي رابط تنزيل الملفات السابقة مجمعة
دمتم في أمان الله
