بسم الله الرحمن الرحيم والصلاة والسلام على اشرف الانبياء والمرسلين اما بعد ، ففي هذا الدرس بمشيئة الله تعالى سنتطرق الى مفاهيم عامة عن قواعد البيانات عموما وعن الـ Mysql خصوصاً ، لتكون بداية فهم لقواعد البيانات الهامة لأي لغة برمجة .
في البداية سنتعرف على مصطلح الـ RDBMS ، ونعني بذلك قواعد البيانات العلائقية ، والتي من خصائصها سهولة الوصول الى البيانات المخزنة فيها ، وسرعة اتمام عمليات الاستعلام المختلفة ، وبالاضافة الى المميزات الأخرى فان هذه النوع يعتبر الأكثر استخداماً في جميع التطبيقات سواء المستخدمة فيي الانترنت أو ذات الطابع البرمجي الخاص ، وبطبيعة الحال فإن الـ Mysql من هذا النوع .
ومن المهم معرفة بعض الاساسيات في الـ RDBMS ، والتي من شأنها تسهيل عملية فهمك التام لطريقة عملها والتعامل معها ..
1- الجداول Tables :
تعتبر أكبر جزء في قاعد البيانات ، وهي عبارة عن أعمدة وصفوف تحتوي على قيم معينة .
2- الأعمدة Columns :
لكل عمود في الجدول أسم خاص يختلف عن أسماء الأعمدة الأخرى في نفس الجدول ، ويجب ان يكون لكل عمود نوع خاص به يصف نوع البيانات التي ستخزن فيه ، وكم يظهر في الصورة ، فان عمود الرقم من النوع الرقمي Integer ، اما الحقلين الآخرين فهي نصوص Text .
3- الصفوف Rows :
كل صف من صفوف الجدول يحتوي على قيم مختلفة ويمثل معلومات متكاملة عن قطاع معين ، وفي مثالنا يمثل معلومات متكاملة عن سخص معين .
4- القيم Values :
وهي ما تحتوي عليه تقاطعات الصفوف بالاعمدة .
5- المفاتيح Keys :
وتعتبر من اساليب تسهيل الوصول الى المعومات في قواعد البيانات ، وفي مثالنا السابق نرى أن العمود Id يحتوي على ارقام متسلسلة لا تتكرر نهائياً بل أنها تتكون بشكل تلقائي عند ادراج أي صف جديد للجدول ، وبالتالي فإنها تعتبر المفتاح المناسب لكل صف من صفوف الجدول لضمان عدم الالتباس في اختيار الصفوف .
فلو افترضنا أن لدينا جدولين في قاعدة بيانات ، يحتوي الجدول الأول على معلومات عن الدروس مفصلة على عدة حقول لتلك الدروس ، على سبيل المثال :
الرقم ( id ) ، الدرس ( lesson ) ، رقم الكاتب ( Key_author ) ..
ويحتوي الجدول الثاني على بيانات الأعضـاء كما يلي :
الرقم ( Key_author ) ، الاسم ( name ) ..
والمطلوب هو طريقة لربط الجدولين ، بحيث أن رقم الكاتب في جدول الدروس ( Key_author ) يدل على اسم الكاتب في جدول الاعضـاء ( name ) .
بالتدقيق في المثال يتضح أن الحقلين ( أو العمودين ) Key_author في كلا الجدولين هو مفتاح الربط بينهما ، ولذلك يمكن الوصول الى اسم الكاتب اعتماداً على رقمه من جدول الدروس ، وبالتالي الربط بين الجدولين .
لن اتحدث طويلاً عن مقدمات قواعد البيانات Mysql ، ولكن بهذه المقدمة البسيطة يمكن على الاقل تصور بعض الاساسيات حول قواعد البيانات عموماً والـ Mysql خصوصاً ، ومن وجهة نظري فالاهم هو كيفية التعامل مع قواعد البيانات بما يخدم احتاجاتنا مع الـ PHP ، ولذلك ساتطرق في هذ الدرس الى نقطة هامة جداً وهي ادارة قواعد البيانات ، وأعني بذلك عملية انشاء قواعد البيانات والجداول والتحكم في الحقول والبيانات وغيرها ، لتكون الاسـاس للتعامل مع قواعد البيانات لاحقاً عن طريق الـ PHP ، ولعمل ذلك يوجد عدة طرق من اهمها الطريقة التقليدية المباشرة بالاعتماد على نظام الدوس في ذلك وبدون استخدام أي برامج أخرى للادارة .
الاتصال بالـ Mysql ، والتعامل معها :
كما قلنا أن الطريقة التقليدية هي الاتصال بقواعد البيانات عن طريق سيرفر الـ Mysql وبدون استخدام أي مكونات أخرى ، ولعمل ذلك نحتاج أن نعرف مسار سيرفر الـ Mysql على الجهاز المستخدم بعد عملية التثبيت ، كما قمنا بذلك في درس المقدمة ، وعادة يكون المسـار كالتالي ( C:\mysql\bin ) ، وبذلك يمكن تشغيل البرنامج mysql.exe من داخل الـ Dos .
عموماً طريقة الاتصال بقاعدة البيانات هي كالتالي :
mysql –h HostName –u UserName –p
مع استبدال الـ HostName باسم السيرفر لديك ، سواء كان السيرفر على نفس الجهاز وفي هذه الحالية تكتب localhost ، أو أن السيرفر الذي تود الاتصال به ليس على نفس الجهاز وبذلك تكتب المسار الكامل لاسم الـسيرفر ( HostName ) ، ومع استبدال الـ UserName باسم المستخدم الخاص بالـ Mysql لديك ، بعد ذلك سيتم طلب كلمة المرور الخاصة بقاعدة البيانات بعد الضغط على Enter ، قم بادخالها وسيتم فتح الاتصال بالـ Mysql ، كما يمكن كتابة mysql فقط ليتم فتح الاتصال بقاعدة البيانات فقط اذا كنت تعمل على نفس الجهاز وليس جهاز أخر .
سيظهر المؤشر الخاص باوامر الـ Mysql كالتالي :
mysql>
وبهذا نكون وصلنا الى المكان المطلوب لكتابة اوامر الـ Mysql والتحكم بها .
الأمر الأول الذي سنقوم بكتابته يقوم باستعراض قواعد البيانات الموجودة على السيرفر والامر هو :
show databases;
بعد كتابة هذا الأمر ( بعد مؤشر الـ mysql> ) ، سيتم استعراض قواعد البيانات في السيرفر الذي قمنا بالاتصال به ، وفي حالة عدم وجود أي قاعدة بيانات قمت باعدادها من قبل ، فان من الطبيعي أن تجد قاعدتي بيانات موجودة بشكل تلقائي عند تثبيت السيرفر Mysql ، وتلك القاعدتان هي test – mysql .
ولمحاولة فهم الموضوع بشكل أكبر ، سنقوم بالتطرق الى مثـال يبين كيفية انشاء قاعدة بيانات ، وكيفية الدخول لها والتعامل معها وانشاء الجداول ، ومن ثم حذفها ..
بعد استعراض قواعد البيانات بالأمر السابق ، سنقوم بانشاء قاعدة بيانات باسم PHP ، ولعمل ذلك قم بكتابة الأمر التالي :
create database PHP;
لو قمنا بكتابة الأمر السابق ( show database ) سنرى أن قواعد البيانات أصبحت 3 باضافة القاعدة PHP الى القاعدتين mysql – test ، ولاستخدام اي منها نقوم بكتابة الأمر التالي في مثالنا مع القاعدة PHP :
use PHP;
وهذه يعني الدخول في قاعدة البيانات PHP واستخدام المؤشر ( mysql> ) لكتابة الأوامر المتعلقة بالتعامل مع قاعدة بيانات بعينها .
أول هذه الاوامر هو أمر انشاء جدول في قاعدة البيانات ، وهذه الأمر يحتاج الى تفصيل دقيق لبعض الخصائص مثل اسماء الحقول وانواع البيانات فيها ، وبعض الاشياء الأخرى ، عموماً قم بكتابة الأمر التالي وساقوم بشرح كافة التفاصيل بعد المثال :
create table users (
id Int not null auto_increment Primary Key,
name text not null,
counter int
);
شرح المثال :
- قمنا بكتابة ( create table users ) وهذا يعني انشاء جدول باسم users .
- القوس ) يعني بداية تسمية حقول الجدول وخصائص تلك الحقول .
- السطر الأول من اسماء الحقول هو ( id ) والرمز ( int ) يعني وصف نوع البيانات التي ستخزن في الـحقل ( id ) ، وهي في هذه الحالة تعني نوع البيانات الرقمية ، اما الرمز ( not null ) فيعني عدم امكانية أن يكون هذا الحقل فـارغاً ، بل يجب أن يحتوي على قيمة ، والـ ( auto_increment ) يجعل الحقل يحتوي على قيم متسلسلة يستحيل تكرارها ، وسيبدأ من الرقم 1 ويبدأ بالزيادة بمقدار واحد في كل مرة يتم ادخال صف جديد الى هذا الجدول ، وفي النهاية الرمز ( Primary Key ) يعني أن الحقل هو المفتاح الرئيسي لهذا الجدول أو بمعني أنه سيتم التفريق بين صفوف الجدول اعتماداً على هذا الحقل ولهذا وضعنا ( auto_increment ) لضمان عدم اختلاط البيانات .
- السطر الثاني يحتوي على اسم الحقل ( name ) ونوع البيانات ( text ) أي نصي ، ونفس الرمز السابق الذي ذكرناه وهو ( not null ) .
- السطر الثالث يحتوي على اسم الحقل ( counter ) ونوع البيانات ( int ) ، ولاحظ أننا لم نذكر ( not null ) وبالتالي يمكن أن يكون هذا الحقل فارغاً لا يحتوي على أي قيمة ، ولن يكون هناك أي تعارض أو مشكلة بعكس الحقلين السابقتين .
- في السطر قبل الأخير ، أي قبل علامة الاغلاق ( ، سيكون بدون فاصلة .
- السطر الأخير يحتوي على اقفال عملية انشاء الجدول بالعلامة ); .
عموماً هذا المثال يعطي نبذة بسيطة عن كيفية اجراء مثل هذه الاوامر ، وسنتطرق الى بقية الأوامر في الأسطر القليلة القادمة .
يمكنك استعراض الجداول الموجودة في قاعدة بيانات عن طريق الأمر :
show tables;
ولو قمت بتطبيق ذلك على المثال السابق فسترى أن الجدول users موجود في قاعدة البيانات PHP التي قمنا بانشاءها .
يمكن كذلك استعراض خصائص الجدول السابق users الذي قمنا بانشاءه في المثال السابق ، عن طريق الأمر التالي :
describe users;
سترى أن حقول الجدول وخصائص كل جدول ظهرت لك بشكل واضح .
- التعامل مع بيانات الجداول :
بقي أن نذكر الطرق التي يمكن من خلالها ادخال البيانات الى الجدول users ، بل وكيفية التعامل مع تلك البيانات بالتعديل والحذف وغير ذلك ، وكما قلنا سابقاً أن هذه الاساسيات مفيدة جداً في البرمجة بلغة الـ PHP ، بل إن فهم هذه الطرق هو المفتاح الاساسي للتعامل مع قواعد البيانات عن طريق البي اتش بي ،
عموماً أول تلك الأوامر هو اضافة صف جديد الى الجدول ، وهذا ما يبينه المثال التالي :
insert into users set
name = “Ahmad”;
counter = 3
;
مع ملاحظة أن users هو اسم الجدول ، name اسم الحقل ( العمود ) الأول ، counter اسم الحقل ( العمود ) الثاني ، كما تلاحظ أن الحقل id لم نتطرق له ، لاننا في اعدادنا للجدول ذكرنا أن الحقل id ( auto_increment ) أي ستضاف اليه القيم بشكل تلقائي وبشكل منظم ، كما قلنا في كل مرة يزيد العداد بقيمة 1 ، و بطبعية الحال يمكنك القياس على هذا المثال باستبدال ما يجب استبداله من اسم الجدول ( users ) واسماء الحقول ( name – counter ) وكذلك البيانات بما يناسب الذي تريد القيام به .
هذا بالنسبة لاضافة بيانات جديدة الى جدول معين ، اما بالنسبة لاستعراض البيانات في الجدول فكما يلي :
select * from users;
ومعني select ( اختر ) ، ولذلك ستجد أن جميع البيانات التي في الجدول users قد تم سردها ، واذا كنت ملتزماً بالمثال السابق حرفياً فستجد أن البيانات التي اضفناها في المثال السابق ظهرت على شكل صف من صفوف الجدول ، وبالتالي كلما اضفت صفاً جديداً الى الجدول وقمت باستعراض البيانات تجد أن بياناتك قد تم تخزينها ، وينطبق الكلام السابق حول الاستبدال هنا ايضا ، فيمكن استبدال اسم الجدول users باي اسم لجدول في قاعدة البيانات المستخدمة ، وللتاكد من اسماء الجداول قم باستخدام الطريقة السابق ذكرها وهي ( show tables ) .
النقطة الأخيرة التي ساتطرق لها هي ما يجب معرفته حول الأمر select وهو كثرت استخدامه في التعامل عن طريق البي اتش بي ، وبالتالي يجب عليك فهم طريقة كتابته بشكل كامل ، بالاضافة الى خيارات الاختيار إن صح التعبير ، وهي ما يتم كتابته بعد الجملة السابقة من خيارات تحدد طريقة اختيار البيانات من شروط وترتيب وحدود وهذا ما ساذكره في الاسطر القليلة القادمة .
فلفترض أن الجدول السابق يحتوي على أكثر من صف من البيانات بالشكل التالي :
اما البيانات التي نود جلبها فهي كما يلي لكل نقطة على حدة :
1- بيانات الاعضاء الذين ليس لهم أي موضوع .
2- بيانات الاعضاء الذين لهم مواضيع أكثر من 5 مرتبين من الاكثر الى الاقل .
3- بيانات العضو Ahmed .
4- بيانات جميع الاعضاء مرتبين حسب الاسم .
5- بيانات العضو الأكثر مواضيعاً .
سنأخذ كل حالة على حدة ، أما الحالة الأولى فيمكن التعامل معها كما يلي :
select * from users where counter=0;
الزيـادة التي قمنا بوضعها هي ( where counter=0 ) أي بحيث أن الحقل ( counter ) يساوي صفر ، وبالتالي سيتم اهمال أي صف من البيانات التي لا يحتوي الحقل ( counter ) فيها على القيمة صفر ، وسيتم جلب البيانات التي يحتوي هذا الحقل فيها على صفر .
الحالة الثانية :
select * from users where counter >= 5 order by counter;
في هذا المثال اضفنا الشرط ( where counter >= 5 ) وهو واضح كما في المثال السابق ولكن تم تغيير الشرط لا اقل ولا اكثر ، اما الاضافة الأخرى فهي طريقة الترتيب وهي ( order by counter ) وتعني ( قم بترتيب البيانات المختارة بحسب الحقل counter ) ، وهناك طريقة أخرى للتحكم في الترتيب اما تصاعدي أو تنازلي وذلك باضافة كلمة asc ليكون الترتيب تنازلياً كما هو الحال في المثال السابق ، فسواء ذكرت ذلك أو سيتم اعتبارها تنازلياً بشكل تلقائي ، اما الاهم فهو طريقة الترتيب التصاعدي من الاقل الى الاكبر ويتم ذلك عن طريق كتابة الكلمة desc بعد الترتيب مباشرة لتصبح كما يلي :
select * from users where counter >= 5 order by counter desc;
الحالة الثالثة :
select * from users where name = “Ahmed”;
لاحظ أن الفرق الوحيد هنا هو استخدام علامات التنصيص ، لان نوع البيانات نصية .
الحالة الرابعة :
select * from users order by name;
وقد أوردت هذا المثال لبيان أنه يمكن استخدام أحد الخيارات لجلب البيانات وترك باقي الخيارات ، فيمكن كما في المثال استخدام خيار الترتيب ( order ) وعدم استخدام الخيارات الباقية ( where – limit ) ، اما الخيار where فقد تطرقنا لنا سابقاً وتعرفنا على فائدته ، والخيـار الأخر limit هي ما سيتم التطرق اليه في المثال التالي الخاص بالحالة الخامسة :
الحالة الخامسة :
select * from users order by counter limit 1;
والـ limit تعني عدد الصفوف المختارة ، أي لو قمنا بكتابة المثال السابق بدون الـ limit ستجد أن جميع البيانات سيتم اختيارها ، ولكن باستخدام الـ limit نقوم بتحديد عدد الصفوف التي سيتم اختيارها استناداً على طريقة ترتيبنا للبيانات ، فكما تلاحظ قمنا بترتيب البيانات بحسب الحقل counter ولم نذكر ( desc ) ولذلك فالبيانات يتم ترتيبها من الاكبر الى الاصغر ، وبالتالي فاختيارنا للحقل الأول يقضي باختيار بيانات الشخص الأكثر كتابة للمواضيع .
بقي أن نذكر طريقي التعديل والحذف ليكتمل الدرس ، وسنبدأ بطريقة التعديل على البيانات الموجودة في الجدول users من قاعدة البيانات PHP ، والمثال التالي يوضح الطريقة التي سيتم شرحها بعد المثال :
update users set
name = “Naser”,
counter = 30
where name=”Ahmad”;
الجملة update تعني تحدبث أو ( قم بتحديث ) ، والـ users هو اسم الجدول الذي نعمل عليه ، وفي السطر الثاني قمنا باسناد القيمة Naser الى الحقل name ، والسطر الذي يليه قمنا باسناد القيمة 30 الى الحقل counter ، ولكن لو توقفنا هنا بدون ذكر الصف الذي سيتم التعديل عليه ، سيتم تعديل كافة الصفوف في الجدول مهما كان عددها ، ولذلك كتبنا في النهاية where name=”Ahmad” ، بمعنى أن التغيرات السابقة ستحدث فقط على الصف من البيانات التي يحتوي فيها الحقل name على القيمة Ahmad .
ربما يكون المثال غير واضح بشكل كافي ، ولكن مع التمرس والمحاولة ستجد أن المسألة منطقية وواضحة بشكل كبير ، عموماً لم يبقى لدينا الا طريقة الحذف ، سواء كان لكل البيانات في الجدول ، أو لصف معين من البيانات وسنرى ذلك في المثالين التاليين ، وهما ما سنختم به هذا الدرس :
delete from users;
الأمر السابق كفيل بالغاء جميع الصفوف في الجدول users كما هو واضح ، ولذلك كن متأكداً من أن التجارب التي تقوم بها هي على بيانات غير هامة .
delete from users
where id = 1 ;
وهذا الحذف سيتم على الصف الذي يتحقق عليه الشرط ، وفي هذه الحالة على الصف من البيانات التي يحتوي فيها الحقل id على القيمة 1 .