• 0
ahmedsaoud31

الدرس العاشر : قواعد البيانات ولغة PHP

سؤال

الحمد لله والصلاة والسلام على رسول الله

 

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

 

 

هذا الدرس ضمن سلسة دروس الدورة التالية لتعلم لغة 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'")

 

والتالي رابط تنزيل الملفات السابقة مجمعة

databases.zip

 

دمتم في أمان الله

 

الدرس السابق | الإنتقال للموضوع الأساسي

تم تعديل بواسطه ahmedsaoud31
3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

6 إجابة على هذا السؤال .

  • 0

بارك الله فيك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جزاك الله خيراً أخي عبد اللطيف
عندي استفسار حول هذا الدرس : 

هل يجب أن أغلق الاتصال مع قاعدة المعطيات في نهاية كل عملية و إن لم يكن كذلك فما هو المكان الأفضل لغلق الاتصال؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
هل يجب أن أغلق الاتصال مع قاعدة المعطيات في نهاية كل عملية و إن لم يكن كذلك فما هو المكان الأفضل لغلق الاتصال؟

- لا لأن عملية عمل إتصال بقاعدة البيانات أمر يتطلب وقت وسيؤدي هذا لتبطيء التطبيق الخاص بك لاسيما لو كان لديك الكثير من العمليات على قاعدة البيانات , فالأفضل إغلاق الإتصال بقاعدة البيانات بعد إنهاء جميع إجراءاتك على قاعدة البيانات , في برمجة الكائنات يمكنك وضع كود إغلاق الإتصال بقاعدة البيانات في هادم الفئة وهو أخر دالة يتم تنفيذها تلقائياً في الفئة , كما سنتحدث عن نمط من أنماط التصميم وهو النمط المفرد وكتطبيق عليه عملية الإتصال بقاعدة البيانات ووظيفته فتح اتصال واحد فقط بقاعدة البيانات .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

عندي أستفسار أستادي الفاضل..................الاتصال بالقاعده في حالة ان الموقع سيرفع على الشبكه هل كود الاتصال هو نفسه ام نغير كلمة localhost

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

المرجو أخذ الجانب الأمني بجدية 

فمثلا وضع إستعلام كهذا

[ltr]$query = "SELECT * FROM users WHERE user_name='{$_POST['username']}'";[/ltr]

في موقعك سيؤدي لإختراقه بكل تأكيد

يجب التأكد من سلامة البيانات قبل عمل الإستعلام

 

حل سريع وفعال للمشكل

[ltr]$_POST['username'] = mysql_real_escape_string($_POST['username']);[/ltr][ltr]$query = "SELECT * FROM users WHERE user_name='{$_POST['username']}'";[/ltr]
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

 

عندي أستفسار أستادي الفاضل..................الاتصال بالقاعده في حالة ان الموقع سيرفع على الشبكه هل كود الاتصال هو نفسه ام نغير كلمة localhost

- إن كانت الإستضافة التي تستخدمها تستخدم سرفر غير localhost بالطبع عليك تغييره بالإضافة لتغيير اسم المستخدم وكلمة المرور واسم قاعدة البيانات .
 

 

المرجو أخذ الجانب الأمني بجدية 

فمثلا وضع إستعلام كهذا

$query = "SELECT * FROM users WHERE user_name='{$_POST['username']}'";

في موقعك سيؤدي لإختراقه بكل تأكيد

يجب التأكد من سلامة البيانات قبل عمل الإستعلام

 

- شكراً أخي العزيز على مداخلتك , تم الحديث عن فلترة المدخلات في درس سابق وهو  تنسيق JSON لتخزين وجلب البيانات وكمثال عملية تسجيل الدخول , ولكن الأفضل كما ذكرت أخذ الإحتياط حتى لا يستخدم أحد الكود مباشراً في تطبيقاته .

 

- وبما أننا هنا نستخدم دوال mysqli وليس mysql سيتم استخدام mysqli_real_escape_string أو فلترة المدخلات .

- حيث أن mysql سيتم إيقاف استخدمها قريباً بالإضافة لأن mysqli تعالج المشاكل الأمنية في mysql

تم تعديل بواسطه ahmedsaoud31
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .