– ما هو الـ PDO ؟ و ما الفرق بينه و بين الـ Mysqli ؟
يمكن الإتصال بقواعد البيانات في الـ Php و إجراء عمليات على الجداول بطريقتين : الـ PDO و الـ Mysqli، و كليهما جيدين لفعل ذلك بإختلاف الـ Syntax الخاص بهما، لكن لما إخترنا الـ PDO ؟
الـ PDO و هو إختصار لعبارة Php Data Objects له نفوذ أكبر، إذ يمكن الإتصال بقواعد بيانات من أي نوع مثل Mysql, MongoDB, SQL Server و غيرها، على عكس الـ Mysqli الذي لا يسمح لنا إلا بالإتصال بقواعد بيانات من نوع Mysql، كما انه أكثر اريحة حين يتعلق الأمر بهيكلة الكود و إستخدامه بشكل أفضل، كما أنه أكثر توافقا مع مجموعة من النسخ الخاصة بالـ PhpMyAdmin، إذ احيانا سيتوجب عليك تحديث النسخة ان اردت التعامل مع الـ Mysqli .
– صناعة قاعدة البيانات التي سنستخدمها :
قواعد البيانات تلعب دورا مهما في هذه العملية، فهي الحقيبة التي سنخزن فيها كل المعلومات و سنتعامل معها بإستخدام مجموعة من الإستعلامات كذلك، تتكون كل قاعدة بيانات من مجموعة من الجداول، و يتكون الجدول بدوره من مجموعة من الأسطر (Rows) و أعمدة (Columns)، يمكنك مراجعة درسنا الأولي : الـ SQL للمبتدئين : تعلم أساسيات الـ SQL و أوامر الإستعلام ( الجزء الأول ) إن اردت إستيعابها بشكل أفضل و كذلك إجراء بعض الأوامر و الإستعلامات الأساسية في الـ SQL، سنتجه الى منصة MySQL ثم سنقوم بإنشاء قاعدة بيانات بإسم Training ثم جدول بإسم Users، سنضع في هذا الجدول كل من الـ id الذي سيكون Primary Key و كذلك Auto Increment، ثم الـ username أيضا الـ Email و أخيرا Password، مجرد جدول بسيط لنقوم بتطبيق بعض العمليات عليه.
بعد ان قمنا بتطبيق كل ذلك سنحصل على قاعدة بيانات خاصة بنا تحمل كل المعلومات أعلاه، و نحن جاهزين للربط الآن ( ملاحظة مهمة : إن لم تعرف خطوات صناعتها إطلاع على الرابط السابق لدورة SQL فقد شرحنا في البداية كيف تقوم بصناعة قاعدة بيانات و الجداول )
– الإتصال بقاعدة البيانات عن طريق الـ Php :
نقوم بإدراج البيانات الأربعة في متغيرات تحمل إسم host, db, username, password، كل متغير يحمل القيمة الخاصة بقاعدة البيانات، ثم بعدها نقوم بالولوج في تحديد Try Catch، و هو تحديد يسمح لنا بإستخراج المشاكل و الأخطاء أثناء حدوثها و إظهارها في رسالة مخصصة، لأنه في حالة عدم إستخدامه، قد يظهر مشكل او خطأ برمجي و قد يبرز معلومات للمستخدم قد لا نريدها ان تسقط في يده، فمثلا إن كان هناك خطأ في جلب الباسوورد قد يخبرنا ان الباسوورد X فيه مشكل، و بذلك يظهر الباسوورد، لذلك نستخدم خاصية Try Catch من أجل تحديد الـ PDOExceptions او الأخطاء الخاصة بالـ PDO ثم نقوم بإظهارها عن طريق getMessage كما في السطر الـ 10 و الـ 11 من الصورة .
اما في وسط الـ Try نضع الكود الخاص بنا للإتصال، سنقوم بإنشاء كائن من نوع PDO، ثم سنقوم بإدراج كود الإتصال كما في الأعلى بإدراج المتغيرات وسط الـ PDO، ثم نقوم بإظهار رسالة في حالة الإتصال.
– إضافة المعطيات الى قاعدة البيانات :
تنقسم عملية إضافة البيانات الى 3 أقسام :
– أولا تهيئة الـ Statement او الـ Query الذي سيقوم بإضافة البيانات و ذلك عن طريق إستدعاء دالة Prepare ثم إدراج وسطها الـ Query، لأن الـ Id الخاص في قاعدة البيانات هو Auto-increment اي يزداد تلقائيا، فأنا غير مضطر لإضافته، بذلك سأخصص إضافة البيانات في الحقول username, email, password، ثم أدرج القيم الخاصة بها على شكل :username، اي مجرد Reference سنقوم بتحديده لاحقا و ليس القيمة بحد ذاتها، قد تلاحظ اننا اضفنا training.users و ليس users مباشرة، و ذلك لأنه أحيانا قد لا يتعرف على الجدول فوجب تحديد قاعدة البيانات قبلا.
– ثانيا، القيام بعملية الـ Bind Parameters، و هي عملية توجب فعلها لتجنب أي تلاعب بالبيانات المدخلة او خلق ثغرات مثل SQL Injection، إذ في الإستعلام نقوم بإضافة الـ Reference للقيمة ( كما أشرنا هي :username ) و من أجل تحديد تلك القيمة نقوم بإستخدام bindparam() على كل قيمة من القيم، بحيث نقوم بتحديد الـ Reference في المعطى الأول، ثم القيمة في المعطى الثاني.
– ثالثا و أخيرا، نقوم بتنفيذ الـ statement التي تحمل كلا من الإستعلام و كل شيئ، نقوم بتنفيذها عن طريق امر execute()، من أجل التأكد من عملها، نقوم بإظهار رسالة مخصصة، في حالة حدوث أي خطأ سينتقل الى الـ Catch و سيظهر لنا خطأ من نوع PDOException .
– إضافة بيانات الى قاعدة البيانات بإستخدام Form :
– الـ Action : وهو Attribute لوسم Form نقوم من خلاله بتخصيص الصفحة التي سيتوجه إليها المستخدم من أجل تحقيق كود تسجيل البيانات و إضافتها، بالنسبة لنا سنضيف الكود php في نفس الصفحة لذلك سنتركه فارغا لكن توجب إضافته.
– الـ Method : نستخدم مجموعة من الـ Methods من أجل إرسال او إستقبال البيانات من بينها POST و GET، في هذه الحالة سنقوم بإرسال البيانات لذلك سنستخدم POST، إن اردنا إستقبال بيانات من قاعدة البيانات الى صفحة الويب نستخدم GET، يمكن إستخدامهما أيضا لنفس الغرض مثل إستخدام GET للإرسال و الإستقبال، إلا ان GET تقوم بإظهار البيانات المرسلة في رابط الصفحة و هذا قد يسبب خطرا إن كنت ترسل معلومات حساسة مثل الباسوورد.
– و أخيرا الـ Name : و هو Attribute مثل class و id خاص بالـ input، نقوم بتحديده حتى نعرف الخانة او الحقل الذي سنقوم بجلب البيانات داخله و إرسالها.

إن قمنا بتحديث الصفحة سنحصل على الـ form جانبه ( قمنا بإضافة بعض الستايل البسيط من أجل التفرقة بين الحقول ) بعدها سننتقل لعملية الإرسال و تسجيل البيانات، و تنقسم العملية أيضا هنا لأقسام :
– أولا، علي معرفة إن كان المستخدم يرسل شيئا أولا ام فقط تحديث للصفحة، بما انني أستخدم نفس الصفحة فعلي التحقق من أي بيانات مرسلة أم لا، إن كانت هناك أي بيانات مرسلة أقوم بالبدئ في عملية حفظها في قاعدة البيانات، إن لم تكن هناك أي بيانات، أتجاهل الكود، لفعل ذلك نستخدم شرط if() و وسطه دالة isset() التي تتأكد من أن حقلا محددا يحمل قيمة ام لا، سأختار حقل username، لكن كيف أجلب قيمته ؟ اقوم بذلك عن طريق خاصية $_POST، أي اتحقق من أي قيمة تم إرسالها عن طريق الـ $_POST و بالضبط قيمة $_POST[‘username’] ( كما في السطر رقم 26 )، البعض قد يستخدم submit بدل username وهو أمر مباح كذلك و يمكن إستخدامه، فإن كان يحمل قيمة ( اي ان المستخدم ادخل شيئا ثم نقر submit ) سألج الى وسط الكود.
– ثانيا، الكود الخاص بإضافة البيانات هو نفسه المستخدم سابقا، قمنا هذه المرة فقط بتغيير الـ References و قيمتها في الـ bindparam و قمنا بإعطائها القيمة التي يحملها كل حقل، نجلب قيمة الحقل عن طريق $_POST كما أشرنا، و داخله نكتب الـ name الخاص بالحقل.
– حذف البيانات من قواعد البيانات :
بنفس طريقة الـ Create او إضافة البيانات، تقوم عملية حذف البيانات من خلال 3 مراحل، أولا تحديد الـ Statement او الـ Query الذي يقوم بالحذف، و هو كما نعلم في إستعلام الـ SQL هو الإستعلام الموجود في السطر رقم 28، من أجل حماية أنفسنا نقوم بتهيئته كما أشرنا في prepare()، مع تحديد الـ Reference على شكل :id .
ثم ثانيا، نقوم بإعطاء الـ Reference قيمته عن طريق الـ bindparameter، القيمة المستخرج بالطبع ستكون هي القيمة التي أدخلها المستخدم في حقل الـ HTML و نقوم بجلبها عن طريق الـ $_POST ( كما في السطر 31 ).
و أخيرا نقوم بتطبيق كل شيئ عن طريق الـ execute() ، لكن قبلا، علينا التحقق إن كان المستخدم قد أدخل بيانات في الحقل أم لا، و ذلك عن طريق isset() كما في السطر 25 و كما في الفقرة السابقة، إن حدث أي مشكل، فلا نقلق، الـ PDOException سيفي بالغرض و يُظهر لنا خطأ و سنقوم بتصحيحه.
إليك أيضا بعض النصائح الأخرى أثناء حذف البيانات، بالطبع المستخدم لا يعرف الـ ID، لذلك الحذف سيكون عن طريق الإسم او البريد الإلكتروني او حسب نوع المشروع، لذلك إستخدمنا هنا الـ ID فقط كتجربة، إن كنت تريد حذف مستخدم او البريد، فقط تلاعب بالـ Query في السطر 28 في الأعلى، و تغيير الـ Parameter في سطر Bindparameter.
– البحث عن بيانات محددة ( واحدة ) من قواعد البيانات :
إن قمت بالحفظ و تحديث الصفحة بتطبيق هذا الكود، فسيظهر لك في الأسفل كل من USERNAME و EMAIL فارغين، و ذلك لأنني أنا ( الأخرق 😅 ) قد نسيت إضافة الـ isset() من أجل التحقق من مرور البيانات ام لا، فلا تنسى أنت إضافتها، بعد التحقق منها، نمر مباشرة الى التقسيمات الثلاث المعتادة لمرور البيانات، إلا انه هذه المرة ستصير 4 تقسيمات :
– أولا، سنقوم بتهيئة الـ Query عن طريق إستعلام Select * ، إختيار النجمة يعني جلب كل البيانات، ثم بالضبط إجلب البيانات حين يكون الـ id مساويا للقيمة التي نريد تمريرها بالـ Reference.
– ثانيا، سنقوم بإعطاء قيمة الـ Reference عن طريق bindparam، القيمة التي سيُحصِّلها هي القيمة التي ادخلها المستخدم، و نقوم بجلبها عن طريق $_GET.
– ثالثا، نقوم بتنفيذ الإستعلام من أجل جلب البيانات في الكائن stmnt .
– و رابعا، من أجل الحصول على تلك البيانات المستخرجة و إستخدامها، نحتاج الى البحث عنها او جلبها و ذلك عبر fetch() التي تسمح لنا بجلب البيانات، لكنها تحتاج بدورها الى كائن من أجل تخزين تلك القيم، في هذه الحالة قمنا بتخزينها في كائن $data كما في السطر 23 .
الآن لدينا $data التي تعتبر Array تحمل المعطيات او نتيجة الإستعلام على شكل Key => Value، اي ان كل مفتاح لديه قيمة، إذ يحمل في مفتاح username قيمة الـ username، و مفتاح الـ email قيمة الـ email، من أجل إستخراج تلك القيمة نقوم بفتح قوسين و كتابة إسم الـ Column الموجود في قاعدة البيانات الذي نريد إستخراج قيمته.
أيضا و لأننا نقوم هنا فقط بالشرح و ليس بمشروع حقيقي، توجب عليك كتابة جزء من الكود يقوم بإسترجاع رسالة في حالة عدم وجود أي نتائج او ستظهر لك الحقول فارغة، و لا تنسى تحديد isset() قبل الولوج في الكود.
– جلب البيانات من قاعدة البيانات ( كل البيانات ) :
الآن سنحتاج الى طريقة من أجل عرض البيانات بشكل منظم، لا نريد إظهارها بشكل عشوائي في هذا الشرح حتى يتسنى لنا رؤية النتائج بوضوح، لذلك سنستخدم الـ Tables في الـ HTML من أجل اظهار البيانات العائدة بشكل أكثر تنظيما.
يمكننا أثناء كتابة كود برمجي بالـ php إستخدامه و إدراجه بالطريقة التي نريد في وسط الـ HTML عبر إغلاق الوسم و إعادة فتحه، سنقوم بعد جلب البيانات بإغلاق وسم الـ php و إعادة فتحه في الـ catch حتى يتسنى لنا جعل الوسط بين الكودين متاح لكتابة كود html، ثم سنقوم بكتابة كود صناعة Table في الـ HTML كما في الأعلى، عند الـ <tr> الثاني الذي سنضع فيه المحتوى المستخرج، سنقوم بعمل loop او حلقة تكرارية بإستخدام foreach إذ سنأخذ كل عنصر من الـ $data على شكل $row ثم نقوم بطباعة الـ Value او القيمة التي يحملها في الـ <td>، بذلك سنحصل على مجموع <tr> يساوي عدد البيانات، و في كل <td> القيم التي يحملها ذلك السطر.
التعديل على البيانات :
التعديل يشبه كثيرا الإضافة او الـ Create التي بدأنا بها هذا المقال، ستختلف الـ Query الآن لتكون Update ثم نقوم بإعطائها الحقول التي نريد إستبدالها، ثم الـ ID الخاص بالسطر الذي نريد إستبداله، لتظهر لنا في الأخير نتيجة مثل السطر 42 في الصورة الثانية أعلاه، بعدها سنقوم بجلب الـ References الموجودين في الإستعلام و إعطائهم قيمتهم الحقيقية عن طريق الـ POST، لاحظ هنا جيدا ان الـ Form الأول يحمل method = Get بينما الثاني method=Post و التفريق بينهما في الكود سيكون عن طريق isset() الذي سيتحقق من وجود الـ GET او الـ POST و يقوم بتشغيل الكود الملائم، هنا سيدرك النظام اننا نستخدم الـ POST اي الـ form الثاني الخاص بالتعديل، بعدها سيقوم بتشغيل الكود عن طريق execute()، و سيُظهر رسالة تم التعديل بنجاح، إن تحققت من الجدول، ستجد انه تم تعديل البيانات بنجاح.
وصلنا إلى نهاية مقالنا، و قمنا بإستعراض كل عمليات الـ CRUD و كيفية آدائها بإستخدام الـ PHP & Mysql بإستخدام تقنية الـ PDO، إن اردت تحميل ملفات هذا المشروع فقد قمنا برفعه على منصة Github و متاح للتحميل من هنا.

التعليقات 0
شاركنا رأيك أو استفسارك حول الموضوع