بسم الله الرحمن الرحيم
شرح التعامل مع مكتبة PDO [الجزء الأول]
يتناول هذا الجزء ما يلي:
= إرشادات قبل البدء
= مقدمة
= ماهية الأخطاء التي من الممكن أن تواجهك
= مستويات إرسال الخطأ في المكتبة والتحكم فيها
= كيفية استقبال أخطاء ال SQL والاستفادة منها
= 7 تطبيقات على ما تم تناوله إلى الآن
= خاتمة
= إرشادات قبل البدء:
* ملحوظة1: هذا الدرس يعتمد بشكل كبير على التجربة وملاحظة النتائج.
* ملحوظة2: إذا وجدت ثقل في محتوى الشرح.. اقرأ فقط المقدمة ثم توجه للتطبيقات العملية ثم الخاتمة.
* ملحوظة3: هذا الدرس يعتمد على علم القارئ المسبق بماهية ال error_reporting الخاص ب php ومستوياته PHP: error_reporting - Manual
* ملحوظة4 نستخدم بنية الجدول الموجود في الجزء الأول من الشرح... ومعلومات قاعدة البيانات على سيرفري الشخصي
كود:
host: localhost
user: root
pass: 123456
dbname: test
= مقدمة: يجب لفت النظر إلى أن استخدام مكتبة مدمجة في الphp مثل pdo يعتبر اخف وأسرع من أي مكتبة يتم استخدامها
على شكل كود php وهذا على الإطلاق .. لذلك أنصح من لا يستخدمها بأن يفكر في استخدامها مستقبلا.
= ماهية الأخطاء التي قد تواجهك:
- أخطاء ترجعها المكتبة مثلا عند فشل الاتصال بقاعدة البيانات.
- أخطاء الكود المترتبة على الفشل في جلب النتيجة مثلا استخدام foreach لعرض نتائج الاستعلام ب SELECT
= مستويات إرسال الخطأ في المكتبة والتحكم فيها: هناك 3 مستويات للتحكم في نظام إرجاع الخطأ بالمكتبة:
-ERRMODE_EXCEPTION: هنا يتم عرض الخطأ حتى إذا كان نظام عرض الأخطاء في php مغلقا... مثال
كود PHP:
$SQL = new PDO('mysql:host=localhost;dbname=test','root','123456',array(PDO::ATTR_PERSISTENT=>true));
echo 'Connected to db';
$SQL->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$SQL->exec("INSERT INTO article (name,bdy) VALUES ('$name','$body')");
echo 'Query executed successfully';
تم إدخال اسم الحقل body بشكل خاطئ مما ينتج رسالة خطأ ويوقف تنفيذ الكود الذي يلي موضع الخطأ.
وهو مفيد جدا لاستعماله أثناء مرحلتي التطوير والتعديل على الكود.
-ERRMODE_WARNING: هنا يتم إرجاع خطأ من نوع E_WARNING أي انه سيعرض من خلال محرك الخطأ الخاص بال php .. مثال
كود PHP:
try{
$SQL = new PDO('mysql:host=localhost;dbname=test','root','123456',array(PDO::ATTR_PERSISTENT=>true));
echo 'Connected to db';
$SQL->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
$SQL->exec("INSERT INTO article (name,bdy) VALUES ('$name','$body')");
echo 'Query executed successfully';
}catch(PDOException $e){
echo $e->getMessage();
}
تم إدخال اسم الحقل body بشكل خاطئ مما ينتج رسالة خطأ warning مع متابعة تنفيذ الكود . وهنا سيخضع عرض الخطأ
لإعدادات ال error_reporting .. مفيد في مرحلة التعديل على الكود و مرحلة الاختبار
-ERRMODE_SILENT: هذا هو الوضع الافتراضي حيث لا يتم عرض أي خطأ وسيتم العمل بصمت
مع الاستمرار بتنفيذ باقي الكود التالي لمكان حدوث الخطأ ..مثل التعامل مع دوال mysql العادية
كود PHP:
try{
$SQL = new PDO('mysql:host=localhost;dbname=test','root','123456',array(PDO::ATTR_PERSISTENT=>true));
echo 'Connected to db';
$SQL->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT);
$SQL->exec("INSERT INTO article (name,bdy) VALUES ('$name','$body')");
echo 'Query executed successfully';
}catch(PDOException $e){
echo $e->getMessage();
}
تم إدخال اسم الحقل body بشكل خاطئ ومع ذلك لن يتم طبع أي خطأ وسيستمر تنفيذ الكود وكأن شيئا لم يحدث
* نلاحظ في الحالات السابقة طباعة سطر في نهاية الكود بمعلومات عن الخطأ وهذا ناتج عن echo $e->getMessage()
وتختلف طرق التعامل مع الخطأ فمن الممكن أن تعرض رسالة معينة للزائر بناء عليه أو ترسله على الايميل ... أو أي شيء حسب تفضيلك.
= كيفية استقبال أخطاء ال SQL والاستفادة منها: عندما يحدث خطأ في استعمالنا العادي مثلا ل mysql فإننا نقوم بإظهار الرقم الخاص به
كود PHP:
echo mysql_errno($link_identifier);
أو طبع رسالة الخطأ كاملة ب
كود PHP:
echo mysql_error($link_identifier);
أيضا PDO تمكننا من فعل ذلك بكل سهولة: نستعمل دالتي errorCode التي تحمل كود الخطأ أو errorInfo
التي تحمل مصفوفة ببيانات موسعة عن الخطأ
كود PHP:
$result = $SQL->query("SELECT name,bdy FROM article WHERE id = 1");
echo $result->errorCode();
print_r($result->errorInfo());
كود PHP:
$SQL->exec("INSERT INTO article (name,bdy) VALUES ('$name','$body')");
echo $SQL->errorCode();
print_r($SQL->errorInfo());
= تطبيقات على ما تم تناوله إلى الآن: الغرض منها توصيل المعلومة والتعود على التعامل و لك الحرية في عمل أكواد أكثر فاعلية
ويفضل وضعها هنا حتى تعم الاستفادة.
-تحديد وعرض المقالات الموجودة في جدول article
كود PHP:
try{
$SQL = new PDO('mysql:host=localhost;dbname=test','root','123456',array(PDO::ATTR_PERSISTENT=>true));
$result = $SQL->query('SELECT * FROM article ORDER BY id DESC');
if($SQL->rowCount() > 0){
while($row = $SQL->fetch(PDO::FETCH_ASSOC)){
echo '<h2>',$row['name'],'</h2><p>',$row['body'],'</p>';
}
}else{
echo 'no articles found';
}
}catch(PDOException $e){
echo $e->getMessage();
// you can mail the error message to review your sql errors later
// you can also add it to a log file to analyze it later
}
- طريقة أخرى لتحديد وعرض المقالات من جدول article
كود PHP:
try{
$SQL = new PDO('mysql:host=localhost;dbname=test','root','123456',array(PDO::ATTR_PERSISTENT=>true));
$rows = $SQL->query('SELECT name, body FROM article WHERE id = 1')->fetchAll();
print_r($rows);
}catch(PDOException $e){
echo $e->getMessage(),'<br />error code:'.PDO::errorCode();
// you can mail the error message to review your sql errors later
// you can also add it to a log file to analyze it later
}
-تحديد وعرض اسم ومحتوى مقالة واحدة في جدول article
كود PHP:
try{
$SQL = new PDO('mysql:host=localhost;dbname=test','root','123456',array(PDO::ATTR_PERSISTENT=>true));
$result = $SQL->query('SELECT name, body FROM article WHERE id = 1');
$name = $result->fetchColumn(0);
$body = $result->fetchColumn(1);
echo '<h2>',$name,'</h2><p>',$body,'</p>';
}catch(PDOException $e){
echo $e->getMessage();
// you can mail the error message to review your sql errors later
// you can also add it to a log file to analyze it later
}
- إدخال مقالة جديدة
كود PHP:
try{
$SQL = new PDO('mysql:host=localhost;dbname=test','root','123456',array(PDO::ATTR_PERSISTENT=>true));
$count = $SQL->exec("INSERT INTO article (name, body) VALUES ($name, $body)");
echo 'insert success';
}catch(PDOException $e){
echo $e->getMessage();
// you can mail the error message to review your sql errors later
// you can also add it to a log file to analyze it later
}
- تعديل مقالة موجودة
كود PHP:
try{
$SQL = new PDO('mysql:host=localhost;dbname=test','root','123456',array(PDO::ATTR_PERSISTENT=>true));
$count = $SQL->exec("UPDATE article SET name = '$name', body = '$body' WHERE id = 1");
echo 'update success';
}catch(PDOException $e){
echo $e->getMessage();
// you can mail the error message to review your sql errors later
// you can also add it to a log file to analyze it later
}
- حذف مقالة
كود PHP:
try{
$SQL = new PDO('mysql:host=localhost;dbname=test','root','123456',array(PDO::ATTR_PERSISTENT=>true));
$count = $SQL->exec("DELETE FROM article WHERE id = 1");
echo 'delete success';
}catch(PDOException $e){
echo 'delete failed';
echo $e->getMessage();
// you can mail the error message to review your sql errors later
// you can also add it to a log file to analyze it later
}
- حذف مقالة (أو أي عملية أخرى) باستخدام الاتصال المتقطع >> لإغلاق الاتصال فقط غير نوع المتغير الذي يحمل نسخة كائن object المكتبة
كود PHP:
try{
$SQL = new PDO('mysql:host=localhost;dbname=test','root','123456');
$count = $SQL->exec("DELETE FROM article WHERE id = 1");
echo 'delete success';
$SQL = null;
}catch(PDOException $e){
echo $e->getMessage();
// you can mail the error message to review your sql errors later
// you can also add it to a log file to analyze it later
}
= خاتمة: تم الانتهاء من الجزء الثاني للشرح .. حقيقة في أول الأمر كنت أنوي وضع مدخل مبسط..
لكن الآن بإذن الله سنبدأ سلسلة شروحات أولهم يتناول هذه المكتبة بجميع أدواتها التي قد يحتاجها المبرمج .
ثم فتح المجال لطلب أي جزء آخر في PHP ليتم شرحه.
قد يكون الأسلوب معقد أو غير واضح بعض الشيء فتحملوه وأعطونا نصائحكم
. أيضا المساعدة بوضع الطلبات لشرح النقط الغامضة
أو بأية أمثلة أخرى أو بالمناقشة في الكود حتى تعم الفائدة. أرجو منكم دعوة بظهر الغيب.
يتبع ،،