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 را می‌توان با نسخه Postgres SGBD جایگزین کرد، با حداقل تأثیر بر کد اسکریپت PHP. این کتابخانه به طور پیش‌فرض در دسترس نیست. می‌توانید با استفاده از دستور زیر، در دسترس بودن آن را بررسی کنید:

  • ۱: از آیکون مدیریت WampServer، گزینه [PHP / PHP extensions] را انتخاب کنید
  • ۲: شما افزونه‌های مختلف موجود PDO و آنهایی را که فعال هستند مشاهده خواهید کرد: [PHP_pdo_mysql] برای SGBD MySQL، [PHP_pdo_sqlite] برای SGBD و SQL Lite. برای فعال‌سازی یک افزونه، کافی است روی آن کلیک کنید. سپس تفسیرگر PHP با افزونه جدید فعال‌شده مجدداً راه‌اندازی می‌شود.

7.1. اتصال به پایگاه داده MySQL – ۱ (mysql_01)

یک اتصال به SGBD با ایجاد یک شیء PDO برقرار می‌شود. سازنده پارامترهای مختلفی را می‌پذیرد:

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

این پارامترها معانی زیر را دارند:

$dsn
(نام منبع داده) یک رشته است که ماهیت 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

توضیحات

  • خط ۱۱: اتصال به SGBD با ایجاد یک شیء PDO برقرار می‌شود. سازنده در اینجا با پارامترهای زیر استفاده می‌شود:
    • یک رشته که ماهیت SGBD و مکان آن در اینترنت را مشخص می‌کند. رشته "mysql:host=localhost" نشان می‌دهد که این یک SGBD MySQL است که روی سرور محلی اجرا می‌شود. پورت مشخص نشده است. بنابراین پورت ۳۳۰۶ به‌طور پیش‌فرض استفاده می‌شود. نام پایگاه داده نیز مشخص نشده است. سپس یک اتصال به SGBD MySQL برقرار خواهد شد و انتخاب پایگاه دادهٔ خاص بعداً انجام می‌شود.
    • یک شناسه کاربری
    • رمز عبور آنها
  • خط 14: اتصال با از بین بردن شیء PDO که در ابتدا ایجاد شده بود، بسته می‌شود.
  • خط ۱۵: اتصال به 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;
}

// جدول «people» را در صورت وجود حذف کنید
$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";
// جدول «people» را ایجاد کنید
$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، جدول زیر قابل مشاهده است:

 

توضیحات

  • خطوط ۳۸–۵۰: تابع connecte یک اتصال به SGBD برقرار می‌کند. این تابع یک آرایه ($erreur, $connexion) را بازمی‌گرداند که در آن $connexion اتصال ایجادشده است، یا null اگر نتوانسته باشد ایجاد شود. در این حالت، $erreur یک پیام خطا است.
  • خطوط ۵۳–۵۶: تابع déconnecte یک اتصال را می‌بندد
  • خط ۵۹: تابع exécuteRequête اجازه می‌دهد یک فرمان SQL روی یک اتصال اجرا شود. این اتصال یک شیء PDO است. روش استفاده برای اجرای یک دستور SQL روی یک شی PDO، متد exec (خط 63) است. اجرای پرس‌وجو ممکن است یک PDOException را فعال کند. بنابراین این مورد نیز رسیدگی می‌شود. این تابع در صورت رخ دادن خطا، یک پیام خطا بازمی‌گرداند و در غیر این صورت، یک رشته خالی.

7.3. پر کردن جدول «persons» (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 اجرا می‌شوند
  //تابع یک آرایه بازمی‌گرداند (تعداد خطاها، خطا۱، خطا۲، …)
  
  //بررسی می‌کند که آیا فایل $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 در خطوط ۴۸–۹۰ است. این تابع دستورات 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 اجرا می‌شوند
  //تابع یک آرایه بازمی‌گرداند (تعداد خطاها، خطا۱، خطا۲، …)
  //بررسی می‌کند که آیا فایل $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);
    }
  }//برای
  //بازگشت
  return $erreurs;
}

// ---------------------------------------------------------------------------------
function afficherInfos($résultat) {
  //نتیجه پرس‌وجوی SQL را نمایش می‌دهد $résultat
  //آیا این یک پرس‌وجوی 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 در خط ۴۳ اجرا می‌شود.

  • خط ۴۳: دو پارامتر این تابع، اتصال ($connexion) که دستورات SQL باید روی آن اجرا شوند، و دستور SQL ($sql) برای اجرا است. این تابع آرایه‌ای از دو مقدار ($erreur, $résultat) را بازمی‌گرداند که در آن
    • $erreur یک پیام خطا است که در صورت عدم وقوع خطا ممکن است خالی باشد
    • $résultat: نتیجه‌ای که با اجرای دستور SQL بازگردانده می‌شود. این نتیجه بسته به اینکه سفارش از نوع select باشد یا از نوع insert، update یا delete متفاوت است.
  • خطوط ۴۸–۵۱: ما عنصر اول از سفارش SQL را بازیابی می‌کنیم تا مشخص کنیم که آیا با سفارشی از نوع select یا سفارشی از نوع insert سروکار داریم، update, delete.
  • خط ۵۵: در مورد یک فرمان select، این با استفاده از متد [PDO]->query("select command") اجرا می‌شود. نتیجه بازگردانده شده یک شی از نوع PDOStatement است.
  • خط ۵۷: در صورت یک عبارت INSERT، UPDATE یا DELETE، این عبارت با استفاده از متد [PDO]->exec("statement SQL") اجرا می‌شود. نتیجهٔ بازگشتی، تعداد سطرهایی است که توسط دستور SQL تغییر یافته‌اند. بنابراین، اگر یک دستور SQL delete دو سطر را حذف کند، مقدار بازگردانده شده عدد صحیح ۲ خواهد بود. اگر در حین اجرا خطایی رخ دهد، مقدار بازگردانده شده بولین false است. در این مورد، متد [PDO]-&gt;errorinfo() اطلاعاتی در مورد خطا را به صورت یک آرایه از مقادیر ارائه می‌دهد. عنصر با شاخص 2 این آرایه، پیام خطا است.
  • خطوط ۵۸–۶۰: رسیدگی به هرگونه خطا از عملیات [PDO]->exec("order SQL").
  • خطوط ۶۵–۶۸: رسیدگی به هر استثنا
  • خط ۷۲: تابع exécuterCommandes دستورات SQL را که در فایل متنی $SQL ذخیره شده‌اند، روی اتصال $connexion اجرا می‌کند. این کدی است که قبلاً با آن مواجه شده‌ایم، با یک تفاوت جزئی: خط ۱۱۱.
  • خط ۱۱۱: تابع exécuteRequête یک آرایه بازگردانده است ($erreur, $résultat) یا $résultat نتیجه اجرای یک فرمان SQL است. این نتیجه بسته به اینکه فرمان SQL یک فرمان select بوده یا یک فرمان insert، update یا delete باشد، متفاوت است. تابع afficherInfos اطلاعاتی درباره این نتیجه نمایش می‌دهد.
  • خط ۱۲۲: اگر سفارش SQL یک سفارش select بود، نتیجه از نوع PDOStatement می‌بود. این نوع نمایانگر جدولی متشکل از سطرها و ستون‌ها است.
  • خط ۱۲۵: متد [PDOStatement]->getColumnCount() تعداد ستون‌های جدول نتیجه select را برمی‌گرداند
  • خط ۱۲۷: متد [PDOStatement]->getMeta(i) یک دیکشنری حاوی اطلاعات درباره ستون شماره i در جدول نتیجه select. را بازمی‌گرداند. در این دیکشنری، مقدار مرتبط با کلید 'name' نام ستون است.
  • خطوط ۱۲۷–۱۲۹: نام ستون‌ها از جدول نتیجه select در یک رشته کاراکتری الحاق می‌شوند.
  • خطوط 141–145: یک شیء از نوع PDOStatement را می‌توان با استفاده از یک حلقه foreach به‌صورت تکراری پردازش کرد. در هر تکرار، عنصر به‌دست‌آمده یک سطر از جدول نتیجه select است که به‌صورت یک آرایه از مقادیری ارائه می‌شود که نمایانگر مقادیر ستون‌های مختلف آن سطر است. تمام این مقادیر با استفاده از یک حلقه for نمایش داده می‌شوند.
  • خط ۱۵۴: نتیجه اجرای دستور insert، update، delete، تعداد سطرهایی است که توسط دستور تغییر یافته‌اند.