Skip to content

7. استخدام SGBD MySql

سنقوم بكتابة نصوص برمجية PHP باستخدام قاعدة بيانات MySQL:

يتم تضمين SGBD MySQL في الحزمة WampServer (انظر الفقرة 2.1.1). نوضح كيفية إنشاء قاعدة بيانات ومستخدم MySQL.

  • بمجرد تشغيله، يمكن إدارة WampServer من خلال أيقونة [1] الموجودة في أسفل يمين شريط المهام.
  • في [2]، يتم تشغيل أداة إدارة MySQL

يتم إنشاء قاعدة بيانات [dbpersonnes]:

Image

نقوم بإنشاء مستخدم [admpersonnes] بكلمة المرور [nobody]:

  • في [1]، اسم المستخدم
  • في [2]، الجهاز SGBD الذي تم منحه حقوقًا عليه
  • في [3]، كلمة المرور الخاصة به
  • في [4]، نفس الشيء
  • في [5]، لا تُمنح أي صلاحيات لهذا المستخدم
  • في [6]، يتم إنشاؤه
  • في [7]، نعود إلى الصفحة الرئيسية لـ phpMyAdmin
  • في [8]، يتم استخدام الرابط [Privileges] الموجود في هذه الصفحة للانتقال لتعديل حقوق المستخدمين [admpersonnes] و[9].

1011

Image

  • في [10]، نحدد أننا نريد منح المستخدم [admpersonnes] حقوقًا على قاعدة البيانات [dbpersonnes]
  • في [11]، يتم تأكيد الاختيار
  • مع الرابط [12] في [Tout cocher]، يتم منح المستخدم [admpersonnes] جميع الحقوق على قاعدة البيانات [dbpersonnes] في [13]
  • نقوم بالتحقق في [14]

والآن لدينا:

  • قاعدة بيانات MySQL [dbpersonnes]
  • مستخدم [admpersonnes / nobody] يتمتع بجميع الصلاحيات على قاعدة البيانات هذه

سنقوم بكتابة نصوص برمجية PHP لاستغلال قاعدة البيانات. يتوفر في PHP العديد من المكتبات لإدارة قواعد البيانات. سنستخدم مكتبة PDO (PHP Data Objects) التي تعمل كواجهة بين كود PHP و SGBD:

تسمح المكتبة PDO للبرنامج النصي PHP بالتجريد من الطبيعة الدقيقة لـ SGBD المستخدم. وبالتالي، يمكن استبدال SGBD MySQL بـ SGBD Postgres مع تأثير ضئيل على كود البرنامج النصي PHP. هذه المكتبة غير متوفرة بشكل افتراضي. يمكن التحقق من توفرها بالطريقة التالية:

  • 1: من أيقونة إدارة WampServer، نختار الخيار [PHP / PHP extensions]
  • 2: تظهر الملحقات المختلفة المتاحة PDO وتلك النشطة: [PHP_pdo_mysql] لـ SGBD MySQL، [PHP_pdo_sqlite] لـ SGBD SQL Lite. لتفعيل ملحق، يكفي النقر عليه. عندها يتم إعادة تشغيل المترجم PHP مع تفعيل الملحق الجديد.

7.1. الاتصال بقاعدة بيانات MySQL – 1 (mysql_01)

يتم الاتصال بـ SGBD عن طريق إنشاء كائن PDO. يقبل منشئ الكائن معلمات مختلفة:

$dbh=new PDO($dsn,$user,$passwd,$driver_options)

معاني المعلمات هي كما يلي:

$dsn
(Data Source Name) هي سلسلة تحدد طبيعة كائن SGBD وموقعه على الإنترنت. تشير السلسلة
"mysql:host=localhost" تشير إلى أننا نتعامل مع SGBD MySQL يعمل على الخادم المحلي. قد
قد تتضمن معلمات أخرى، لا سيما منفذ الاستماع لـ SGBD واسم قاعدة البيانات التي
نريد الاتصال بها: "mysql:host=localhost:port=3306:dbname=dbpersonnes".
$user
معرف المستخدم الذي يقوم بالاتصال
$passwd
كلمة المرور الخاصة به
$driver_options
جدول خيارات لبرنامج تشغيل SGBD

المعلمة الأولى هي الوحيدة الإلزامية. وسيكون الكائن الذي تم إنشاؤه بهذه الطريقة هو الداعم لجميع العمليات التي يتم إجراؤها على قاعدة البيانات التي تم الاتصال بها. إذا تعذر إنشاء الكائن PDO، يتم إصدار استثناء من النوع PDOException.

فيما يلي مثال على الاتصال:


<?php

// اتصال بقاعدة بيانات MySql
// هوية المستخدم هي (admpersonnes,nobody)
$ID = "admpersonnes";
$PWD = "nobody";
$HOTE = "localhost";

try {
  // تسجيل الدخول
  $dbh = new PDO("mysql:host=$HOTE", $ID, $PWD);
  print "Connexion réussie\n";
  // إغلاق
  $dbh = null;
} catch (PDOException $e) {
  print "Erreur : " . $e->getMessage() . "\n";
  exit();
}

النتائج:

Connexion réussie

تعليقات

  • السطر 11: يتم الاتصال بـ SGBD عن طريق إنشاء كائن PDO. يتم استخدام المنشئ هنا مع المعلمات التالية:
    • سلسلة تحدد طبيعة SGBD وموقعه على الإنترنت. تشير السلسلة "mysql:host=localhost" إلى أننا نتعامل مع SGBD MySQL يعمل على الخادم المحلي. لم يتم تحديد المنفذ. لذلك يتم استخدام المنفذ 3306 بشكل افتراضي. كما لم يتم تحديد اسم قاعدة البيانات. سيتم عندئذ الاتصال بـ SGBD MySQL، على أن يتم اختيار قاعدة بيانات محددة لاحقًا.
    • اسم مستخدم
    • وكلمة المرور الخاصة به
  • السطر 14: يتم إغلاق الاتصال عن طريق إتلاف الكائن PDO الذي تم إنشاؤه في البداية.
  • السطر 15: قد يفشل الاتصال بـ SGBD. في هذه الحالة، يتم إطلاق استثناء من النوع PDOException.

7.2. إنشاء جدول MySQL (mysql_02)


<?php

// تسجيل الدخول إلى قاعدة البيانات MySql
// هوية المستخدم
$ID = "admpersonnes";
$PWD = "nobody";
// هوية القاعدة
$DSN = "mysql:host=localhost;dbname=dbpersonnes";

// اتصال
list($erreur, $connexion) = connecte($DSN, $ID, $PWD);
if ($erreur) {
  print "Erreur lors de la connexion à la base [$DSN] sous l'identité ($ID,$PWD) : $erreur\n";
  exit;
}

// حذف جدول «الأشخاص» إن وجد
$requête = "drop table personnes";
$erreur = exécuteRequête($connexion, $requête);
//هل حدث خطأ؟
if ($erreur)
  print "$requête : Erreur ($erreur)\n";
else
  print "$requête: Exécution réussie\n";
// إنشاء جدول الأشخاص
$requête = "create table personnes (prenom varchar(30) NOT NULL, nom varchar(30) NOT NULL, age integer NOT NULL, primary key(nom,prenom))";
$erreur = exécuteRequête($connexion, $requête);
//هل حدث خطأ؟
if ($erreur)
  print "$requête : Erreur ($erreur)\n";
else
  print "$requête: Exécution réussie\n";
// يتم قطع الاتصال والخروج
déconnecte($connexion);
exit;

// ---------------------------------------------------------------------------------
function connecte($dsn, $login, $pwd) {
  // تسجيل الدخول ($login، $pwd) إلى قاعدة البيانات $dsn
  // يعرض معرّف الاتصال بالإضافة إلى رمز الخطأ
  try {
    // اتصال
    $dbh = new PDO($dsn, $login, $pwd);
    // العودة بدون خطأ
    return array("", $dbh);
  } catch (PDOException $e) {
    // العودة مع وجود خطأ
    return array($e->getMessage(), null);
  }
}

// ---------------------------------------------------------------------------------
function déconnecte($connexion) {
  // يغلق الاتصال المحدد بـ $connexion
  $connexion = null;
}

// ---------------------------------------------------------------------------------
function exécuteRequête($connexion, $sql) {
  // تنفيذ الطلب $sql على الاتصال $connexion
  try {
    $connexion->exec($sql);
    // يعود دون أخطاء
    return "";
  } catch (PDOException $e) {
    // يعود مع خطأ
    return $e->getMessage();
  }
}

النتائج:

drop table personnes: Exécution réussie
create table personnes (prenom varchar(30) NOT NULL, nom varchar(30) NOT NULL, age integer NOT NULL, primary key(nom,prenom)): Exécution réussie

في PHPMyAdmin، يمكن ملاحظة وجود الجدول:

 

تعليقات

  • الأسطر 38-50: تقوم الدالة connecte بإنشاء اتصال بـ SGBD. وهي تُرجع مصفوفة ($erreur، $connexion) حيث $connexion هو الاتصال الذي تم إنشاؤه أو null إذا تعذر إنشاؤه. في الحالة الأخيرة، تكون $erreur عبارة عن رسالة خطأ.
  • الأسطر 53-56: تغلق الدالة déconnecte اتصالاً
  • السطر 59: تسمح الدالة exécuteRequête بتنفيذ أمر SQL على اتصال. الاتصال هو كائن PDO. الطريقة المستخدمة لتنفيذ أمر SQL على كائن PDO هي الطريقة exec (السطر 63). قد يؤدي تنفيذ الاستعلام إلى تشغيل PDOException. لذلك يتم إدارة هذا الأمر أيضًا. تعرض الدالة رسالة خطأ في حالة حدوث خطأ، وإلا تعرض سلسلة فارغة.

7.3. ملء جدول الأشخاص (mysql_03)

ينفذ البرنامج النصي التالي أوامر SQL الموجودة في الملف النصي [creation.txt] التالي:

drop table personnes
create table personnes (prenom varchar(30) not null, nom varchar(30) not null, age integer not null, primary key (nom,prenom))
insert into personnes values('Paul','Langevin',48)
insert into personnes values ('Sylvie','Lefur',70)
insert into personnes values ('Pierre','Nicazou',35)
insert into personnes values ('Geraldine','Colou',26)
insert into personnes values ('Paulette','Girond',56)

<?php

// اتصال بقاعدة البيانات MySql
// هوية المستخدم
$ID = "admpersonnes";
$PWD = "nobody";
// هوية قاعدة البيانات
$DSN = "mysql:host=localhost;dbname=dbpersonnes";
// معرف ملف الأوامر النصية SQL المطلوب تنفيذه
$TEXTE = "creation.txt";

// تسجيل الدخول
list($erreur, $connexion) = connecte($DSN, $ID, $PWD);
if ($erreur) {
  print "Erreur lors de la connexion à la base [$DSN] sous l'identité ($ID,$PWD) : $erreur\n";
  exit;
}

// إنشاء الجدول وتعبئته
$erreurs = exécuterCommandes($connexion, $TEXTE, 1, 0);
//عرض عدد الأخطاء
print "il y a eu $erreurs[0] erreurs\n";
for ($i = 1; $i < count($erreurs); $i++)
  print "$erreurs[$i]\n";

// قطع الاتصال والخروج
déconnecte($connexion);
exit;

// ---------------------------------------------------------------------------------
function connecte($dsn, $login, $pwd) {
...
}

// ---------------------------------------------------------------------------------
function déconnecte($connexion) {
 ...
}

// ---------------------------------------------------------------------------------
function exécuteRequête($connexion, $sql) {
  // تنفيذ الاستعلام $sql على الاتصال $connexion
  // إرجاع رسالة خطأ واحدة في حالة وجود خطأ، وإرجاع سلسلة فارغة في حالة عدم وجود خطأ
  ...
}

// ---------------------------------------------------------------------------------
function exécuterCommandes($connexion, $SQL, $suivi=0, $arrêt=1) {
  // يستخدم الاتصال $connexion
  // ينفذ الأوامر SQL الموجودة في الملف النصي $SQL
  // هذا الملف هو ملف أوامر SQL يتم تنفيذها بواقع أمر واحد في كل سطر
  // إذا كان $suivi=1، فإن كل تنفيذ لأمر SQL يُعرض مع إشارة إلى نجاحه أو فشله
  // إذا كانت قيمة $arrêt تساوي 1، تتوقف الدالة عند أول خطأ تصادفه، وإلا فإنها تنفذ جميع أوامر SQL
  // تُرجع الدالة مصفوفة (عدد الأخطاء، الخطأ 1، الخطأ 2، ...)
  
  // يتم التحقق من وجود الملف $SQL
  if (! file_exists($SQL))
    return array(1, "Le fichier $SQL n'existe pas");

  // تنفيذ الاستعلامات SQL الموجودة في $SQL
  // يتم وضعها في مصفوفة
  $requêtes = file($SQL);
  // يتم تنفيذها - في البداية لا توجد أخطاء
  $erreurs = array(0);
  for ($i = 0; $i < count($requêtes); $i++) {
    //هل لدينا استعلام فارغ
    if (preg_match("/^\s*$/", $requêtes[$i]))
      continue;
    // تنفيذ الاستعلام $i
    $erreur = exécuteRequête($connexion, $requêtes[$i]);
    //هل حدث خطأ؟
    if ($erreur) {
      // خطأ آخر
      $erreurs[0]++;
      // رسالة خطأ
      $msg = "$requêtes[$i] : Erreur ($erreur)\n";
      $erreurs[] = $msg;
      // هل يتم متابعة الشاشة أم لا؟
      if ($suivi)
        print "$msg\n";
      // هل نتوقف؟
      if ($arrêt)
        return $erreurs;
    } else
    if ($suivi)
      print "$requêtes[$i] : Exécution réussie\n";
  }//من أجل
  // العودة
  return $erreurs;
}

نتائج العرض:

drop table personnes : Exécution réussie
create table personnes (prenom varchar(30) not null, nom varchar(30) not null, age integer not null, primary key (nom,prenom)) : Exécution réussie
insert into personnes values('Paul','Langevin',48) : Exécution réussie
insert into personnes values ('Sylvie','Lefur',70) : Exécution réussie
insert into personnes values ('Pierre','Nicazou',35) : Exécution réussie
insert into personnes values ('Geraldine','Colou',26) : Exécution réussie
insert into personnes values ('Paulette','Girond',56) : Exécution réussie
il y a eu 0 erreurs

يمكن رؤية الإدخالات التي تمت باستخدام PhpMyAdmin:

 

تعليقات

الجديد هو الوظيفة exécuterCommandes في الأسطر 48-90. تقوم هذه الوظيفة بتنفيذ الأوامر SQL الموجودة في الملف النصي المسمى $SQL على الاتصال $connexion. وهي تُرجع مصفوفة أخطاء ($nbErreurs، $msg1، $msg2، …) حيث $nbErreurs هو عدد الأخطاء، و $msgi هو رقم رسالة الخطأ i.. إذا لم تكن هناك أخطاء، فإن المصفوفة التي يتم إرجاعها هي المصفوفة array(0).

7.4. تنفيذ أي استعلامات SQL (mysql_04)

يُظهر البرنامج النصي التالي تنفيذ الأوامر SQL من الملف النصي [sql.txt] التالي:

select * from personnes
select nom,prenom from personnes order by nom asc, prenom desc
select * from personnes where age between 20 and 40 order by age desc, nom asc, prenom asc
insert into personnes values('Josette','Bruneau',46)
update personnes set age=47 where nom='Bruneau'
select * from personnes where nom='Bruneau'
delete from personnes where nom='Bruneau'
select * from personnes where nom='Bruneau'
xselect * from personnes where nom='Bruneau'

من بين هذه الأوامر SQL، هناك الأمر select الذي يعرض نتائج من قاعدة البيانات، والأوامر insert و update و delete التي تعدل قاعدة البيانات دون عرض نتائج، وأخيرًا الأوامر الخاطئة مثل الأمر الأخير (xselect).


<?php

// اتصال بالقاعدة MySql
// هوية المستخدم
$ID = "admpersonnes";
$PWD = "nobody";
// هوية قاعدة البيانات
$DSN = "mysql:host=localhost;dbname=dbpersonnes";
// هوية ملف الأوامر النصي SQL المطلوب تنفيذه
$TEXTE = "sql.txt";

// الاتصال
list($erreur, $connexion) = connecte($DSN, $ID, $PWD);
if ($erreur) {
  print "Erreur lors de la connexion à la base [$DSN] sous l'identité ($ID,$PWD) : $erreur\n";
  exit;
}

// تنفيذ الأوامر SQL
$erreurs = exécuterCommandes($connexion, $TEXTE, 1, 0);
//عرض عدد الأخطاء
print "il y a eu $erreurs[0] erreur(s)\n";
for ($i = 1; $i < count($erreurs); $i++)
  print "$erreurs[$i]\n";

// يتم قطع الاتصال والخروج
déconnecte($connexion);
exit;

// ---------------------------------------------------------------------------------
function connecte($dsn, $login, $pwd) {
  // تقوم بتوصيل ($login، $pwd) بقاعدة البيانات $dsn
  // يعرض معرّف الاتصال بالإضافة إلى رسالة خطأ
  ...
}

// ---------------------------------------------------------------------------------
function déconnecte($connexion) {
  ...
}

// ---------------------------------------------------------------------------------
function exécuteRequête($connexion, $sql) {
  // يُنفذ الاستعلام $sql على الاتصال $connexion
  // يعرض مصفوفة من عنصرين ($erreur,$résultat)
  
  // يتم تحديد ما إذا كان الأمر عبارة عن «select» أم لا
  $commande = "";
  if (preg_match("/^\s*(\S+)/", $sql, $champs)) {
    $commande = $champs[0];
  }
  // تنفيذ الأمر
  try {
    if (strtolower($commande) == "select") {
      $res = $connexion->query($sql);
    } else {
      $res = $connexion->exec($sql);
      if($res===FALSE){
        $info=$connexion->errorInfo();
        return array($info[2],null);
      }
    }
    // العودة بدون أخطاء
    return array("", $res);
  } catch (PDOException $e) {
    // العودة مع وجود خطأ
    return array($e->getMessage(), null);
  }
}

// ---------------------------------------------------------------------------------
function exécuterCommandes($connexion, $SQL, $suivi=0, $arrêt=1) {
  // يستخدم الاتصال $connexion
  // تنفيذ الأوامر SQL الموجودة في الملف النصي $SQL
  // هذا الملف هو ملف أوامر SQL لتنفيذها بمعدل أمر واحد في كل سطر
  // إذا كان $suivi=1، فإن كل عملية تنفيذ لأمر SQL تُعرض مع إشارة إلى نجاحها أو فشلها
  // إذا كانت قيمة $arrêt تساوي 1، تتوقف الدالة عند أول خطأ تصادفه، وإلا فإنها تنفذ جميع أوامر SQL
  // تُرجع الدالة مصفوفة (عدد الأخطاء، الخطأ 1، الخطأ 2، ...)
  // يتم التحقق من وجود الملف $SQL
  if (!file_exists($SQL))
    return array(1, "Le fichier $SQL n'existe pas");

  // تنفيذ الاستعلامات SQL الموجودة في $TEXTE
  // يتم وضعها في مصفوفة
  $requêtes = file($SQL);
  // يتم تنفيذها - في البداية لم تكن هناك أخطاء
  $erreurs = array(0);
  for ($i = 0; $i < count($requêtes); $i++) {
    //هل لدينا استعلام فارغ
    if (preg_match("/^\s*$/", $requêtes[$i]))
      continue;
    // تنفيذ الاستعلام $i
    list($erreur, $res) = exécuteRequête($connexion, $requêtes[$i]);
    //هل حدث خطأ؟
    if ($erreur) {
      // خطأ آخر
      $erreurs[0]++;
      // رسالة خطأ
      $msg = "$requêtes[$i] : Erreur ($erreur)\n";
      $erreurs[] = $msg;
      // هل يتم متابعة الشاشة أم لا؟
      if ($suivi)
        print "$msg\n";
      // هل نتوقف؟
      if ($arrêt)
        return $erreurs;
    } else
    if ($suivi) {
      print "$requêtes[$i] : Exécution réussie\n";
      // معلومات عن نتيجة الاستعلام الذي تم تنفيذه
      afficherInfos($res);
    }
  }//for
  // العودة
  return $erreurs;
}

// ---------------------------------------------------------------------------------
function afficherInfos($résultat) {
  // يعرض نتيجة $résultat لاستعلام SQL
  // هل كان هذا استعلام SELECT؟
  if ($résultat instanceof PDOStatement) {
    // يتم عرض أسماء الحقول
    $titre = "";
    $nbColonnes = $résultat->columnCount();
    for ($i = 0; $i < $nbColonnes; $i++) {
      $infos = $résultat->getColumnMeta($i);
      $titre.=$infos['name'] . ",";
    }
    // يتم حذف الحرف الأخير ،
    $titre = substr($titre, 0, strlen($titre) - 1);
    // نعرض قائمة الحقول
    print "$titre\n";
    // خط فاصل
    $séparateurs = "";
    for ($i = 0; $i < strlen($titre); $i++) {
      $séparateurs.="-";
    }
    print "$séparateurs\n";
    // البيانات
    foreach ($résultat as $ligne) {
      $data = "";
      for ($i = 0; $i < $nbColonnes; $i++) {
        $data.=$ligne[$i] . ",";
      }

      // يتم حذف الحرف الأخير ،
      $data = substr($data, 0, strlen($data) - 1);
      // يتم عرض
      print "$data\n";
    }
  } else {
    // لم يكن هذا اختيارًا
    print " $résultat lignes(s) a (ont) été modifiée(s)\n";
  }
}

نتائج العرض:

select * from personnes
 : Exécution réussie
prenom,nom,age
--------------
Geraldine,Colou,26
Paulette,Girond,56
Paul,Langevin,48
Sylvie,Lefur,70
Pierre,Nicazou,35
select nom,prenom from personnes order by nom asc, prenom desc : Exécution réussie
nom,prenom
----------
Colou,Geraldine
Girond,Paulette
Langevin,Paul
Lefur,Sylvie
Nicazou,Pierre
select * from personnes where age between 20 and 40 order by age desc, nom asc, prenom asc : Exécution réussie
prenom,nom,age
--------------
Pierre,Nicazou,35
Geraldine,Colou,26
insert into personnes values('Josette','Bruneau',46) : Exécution réussie
 1 lignes(s) a (ont) é modifiée(s)
update personnes set age=47 where nom='Bruneau' : Exécution réussie
 1 lignes(s) a (ont) é modifiée(s)
select * from personnes where nom='Bruneau' : Exécution réussie
prenom,nom,age
--------------
Josette,Bruneau,47
delete from personnes where nom='Bruneau' : Exécution réussie
 1 lignes(s) a (ont) é modifiée(s)
select * from personnes where nom='Bruneau' : Exécution réussie
prenom,nom,age
--------------
xselect * from personnes where nom='Bruneau' : Erreur (You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'xselect * from personnes where nom='Bruneau'' at line 1)

il y a eu 1 erreur(s)
xselect * from personnes where nom='Bruneau' : Erreur (You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'xselect * from personnes where nom='Bruneau'' at line 1)

تعليقات

يتم تنفيذ كل أمر من أوامر الملف النصي [sql.txt] بواسطة الدالة exécuteRequête في السطر 43.

  • السطر 43: المعلمتان للدالة هما الاتصال ($connexion) الذي يجب تنفيذ الأوامر SQL عليه، والأمر sql ($sql) المطلوب تنفيذه. تُرجع الدالة مصفوفة من قيمتين ($erreur، $résultat) حيث
    • $erreur هي رسالة خطأ قد تكون فارغة في حالة عدم وجود خطأ
    • $résultat: النتيجة التي تم إرجاعها من تنفيذ الأمر SQL. تختلف هذه النتيجة حسب ما إذا كان الأمر هو select أم أنه أحد الأوامر التالية: insert، update، delete.
  • الأسطر 48-51: يتم استرداد العنصر الأول من الطلب SQL لمعرفة ما إذا كان الأمر يتعلق بطلب select أم بطلب insert، أو update، أو delete.
  • السطر 55: في حالة الأمر select، يتم تنفيذه باستخدام الطريقة [PDO]->query("أمر select"). والنتيجة التي يتم إرجاعها هي كائن من النوع PDOStatement.
  • السطر 57: في حالة أمر الإدراج أو التحديث أو الحذف، يتم تنفيذه باستخدام الطريقة [PDO]->exec("الأمر SQL"). والنتيجة المعروضة هي عدد الأسطر التي تم تعديلها بواسطة الأمر SQL. وبالتالي، إذا حذفت الأوامر SQL و delete سطرين، فإن النتيجة المعروضة هي العدد الصحيح 2. إذا حدث خطأ أثناء التنفيذ، فإن النتيجة المعروضة هي القيمة المنطقية false. في هذه الحالة، توفر الطريقة [PDO]->errorinfo() معلومات عن الخطأ في شكل مصفوفة من القيم. العنصر ذو المؤشر 2 في هذه المصفوفة هو رسالة الخطأ.
  • الأسطر 58-60: معالجة الخطأ المحتمل في العملية [PDO]->exec("ordre SQL").
  • الأسطر 65-68: معالجة الاستثناء المحتمل
  • السطر 72: تقوم الدالة exécuterCommandes بتنفيذ الأوامر SQL المخزنة في الملف النصي $SQL على الاتصال $connexion. هذا كود سبق أن صادفناه باستثناء تفصيل واحد: السطر 111.
  • السطر 111: أرجعت الدالة exécuteRequête مصفوفة ($erreur، $résultat) أو أن $résultat هي نتيجة تنفيذ أمر SQL. تختلف هذه النتيجة حسب ما إذا كان الأمر SQL هو أمر select أم أمر insert أو update أو delete. تعرض الدالة afficherInfos معلومات حول هذه النتيجة.
  • السطر 122: إذا كان الأمر SQL هو أمر select، فإن النتيجة تكون من النوع PDOStatement. يمثل هذا النوع جدولًا مكونًا من أسطر وأعمدة.
  • السطر 125: تعرض الطريقة [PDOStatement]->getColumnCount() عدد أعمدة الجدول الناتج عن select
  • السطر 127: تعرض الطريقة [PDOStatement]->getMeta(i) تُرجع قاموسًا يحتوي على معلومات عن العمود رقم i في جدول النتائج الناتج عن select.. في هذا القاموس، القيمة المرتبطة بالمفتاح 'name' هي اسم العمود.
  • الأسطر 127-129: يتم ربط أسماء أعمدة جدول نتائج select في سلسلة أحرف.
  • الأسطر 141-145: يمكن تصفح كائن من النوع PDOStatement باستخدام حلقة foreach. في كل تكرار، يكون العنصر الناتج هو سطر من جدول نتائج select في شكل مصفوفة قيم تمثل قيم الأعمدة المختلفة في السطر. يتم عرض جميع هذه القيم باستخدام حلقة for.
  • السطر 154: نتيجة تنفيذ الأمر insert، update، delete هي عدد الأسطر التي تم تعديلها بواسطة الأمر.