PHP یک زبان اسکریپت نویسی متن باز و منبع باز است که به طور گسترده‌ای برای ایجاد صفحات وب پویا و دارای تعاملی استفاده می‌شود. PHP می‌تواند به طیف وسیعی از سیستم‌های مدیریت پایگاه داده مانند MYSQL ، SQLite و PostgreSQL دسترسی پیدا کند. نسخه PHP 5.1 کتابخانه‌ای انتزاعی است که اتصال پایگاه داده جدیدی را ارائه می‌دهد. در این مقاله به نحوه اتصال به دیتابیس در Php با PDO می‌پردازیم.

PDO چیست؟

PDO به PHP Data Object اشاره دارد که پسوند PHP است و یک رابط سبک و سازگار را برای دسترسی به یک پایگاه داده در PHP تعریف می‌کند. این رابط مجموعه‌ای از پسوندهای PHP است که به گونه‌ای PDO درایور مخصوص پایگاه داده را ارائه می‌دهد.

در نحوه اتصال به دیتابیس در Php با PDO، تمرکز PDO عمدتا بر انتزاع دسترسی داده‌ها است تا انتزاع پایگاه داده‌ها؛ بدین معنی که صرف نظر از اینکه از کدام پایگاه داده استفاده می‌کنیم، مجبوریم از همان توابع ارائه شده توسط آن پایگاه داده برای صدور نمایش داده‌ها استفاده کنیم. PDO انتزاع داده را ارائه نمی‌دهد، همانطور که SQL را دوباره نمی‌نویسد یا ویژگی‌های از دست رفته را تقلید نمی‌کند.

مزیت‌های PDO در اتصال به دیتابیس در Php با PDO

PDO روش‌های مختلفی را برای کار با Obejcts فراهم می‌کند و گزاره‌های تهیه شده را بازیابی می‌کند که باعث می‌شود کار توسعه‌دهنده بسیار راحت‌تر شود. این یک ابزار دسترسی به پایگاه داده در PHP است که از طریق آن دسترسی یکنواخت را از طریق چندین پایگاه داده امکان‌پذیر می‌کنیم.

PDO امکان سوئیچینگ نسبتاً یکپارچه‌ای را بین پایگاه داده‌ها و سیستم عامل‌های مختلف فراهم می‌کند که با تغییر رشته اتصال به راحتی انجام می‌شود.

نکته
دوره پیشنهادی: آموزش PHP مقدماتی

برخی از این مزیت‌ها عبارت‌اند از:

  • پشتیبانی از اکثر پایگاه‌های داده
  •  اتصال به انواع پایگاه‌های داده
  • مدیریت خطا
  • درج و به روزرسانی

فواید استفاده از PDO

PDO درایوری برای پایگاه‌های داده عمومی است. اتصال به دیتابیس در Php با PDO فوایدی دارد که عبارت‌اند از:

1- قابلیت استفاده

این درایور، شامل بسیاری از توابع کمکی برای انجام عملیات معمول به شیوه خودکار است.

2- قابلیت استفاده مجدد

این API یکپارچه را برای دسترسی به چندین پایگاه داده ارائه می دهد.

3- امنیت

امنیت- از گزاره‌ی آماده شده، که از تزریق SQL محافظت می‌کند، استفاده می‌کند. عبارت SQL به گونه‌ای دستور آماده شده است که از قبل تدوین شده است و دستورات SQL را از داده‌ها جدا می‎کند.

نکته
مقاله پیشنهادی: آموزش MySQL در Php

کلاس PDO

در نحوه اتصال به دیتابیس در Php با PDO، سه کلاس وجود دارد که عبارت‌اند از:

1- PDO

این کلاس PDO ، ارتباط بین PHP و پایگاه داده را نشان می‌دهد.

2- PDOStatement

این کلاس PDO بیانات آماده شده را نشان می‌دهد و پس از اجرای آن‌ها، نتیجه مرتبط را تعیین‌ می‌کند.

3- PDOException

این کلاس خطاهای مطرح شده توسط PDO را نشان می‌دهد.

بین PDO یا MySQLi، کدام یک را باید ترجیح داد؟

PDO و MySQLi هر دو مزایای خاص خود را دارند:

  • همانطور که قبلاً دیده‌ایم PDO می‌تواند روی 12 سیستم پایگاه داده مختلف کار کند؛ در حالی که MySQL فقط با پایگاه داده MySQL کار می‌کند. بنابراین، اگر می‌خواهیم پروژه خود را به پایگاه داده دیگری تغییر دهیم، نحوه اتصال به دیتابیس در Php با PDO مناسب‌تر است. در MySQLi، ما باید کل کد را دوباره بنویسیم.
  • PDO و MySQLi هر دو شی‌گرا هستند، اما MySQLi همچنین API رویه‌ای را ارائه می‌دهد. همینطور هر دو از بیانیه‌های آماده پشتیبانی می‌کنند. بیانیه‌های آماده برای امنیت برنامه‌های وب مهم هستند، زیرا از تزریق SQL محافظت می‌کند.

مراحل نصب PDO جهت اتصال به دیتابیس در Php

1- جدیدترین سرور XAMPP را از https://www.apachefriends.org/download.html برای سیستم عامل‌های مختلف مانند ویندوز، لینوکس و MacOS بارگیری کنید.

اتصال به دیتابیس در Php با PDO

2- با دنبال کردن این مراحل سرور XAMPP را روی سیستم خود نصب کنید.

مرحله اول نصب XAMPP
مرحله اول نصب XAMPP

3- اجزایی را که قصد دارید نصب کنید انتخاب کرده و بر روی دکمه Next کلیک کنید.

مرحله دوم نصب XAMPP
مرحله دوم نصب XAMPP

4- پوشه جدیدی را با نام XAMPP، در محلی که می‌خواهید برنامه را نصب کنید، ایجاد کنید.

مرحله سوم نصب XAMPP
مرحله سوم نصب XAMPP

5- NEXT را کلیک کنید و به جلو بروید. نصب سرور XAMPP از اینجا شروع می‌شود.

مرحله چهارم نصب XAMPP
مرحله چهارم نصب XAMPP

6- XAMPP با موفقیت نصب شد. روی دکمه Finish کلیک کنید.

اتمام نصب

7- زبان مورد نظر را انتخاب کنید.

اتصال به دیتابیس در Php با PDO
انتخاب زبان

8- سرور Apache و MySQL را از اینجا اجرا کنید. (مطابق تصویر ارائه شده).

 اجرای سرور Apache و MySQL
اجرای سرور Apache و MySQL

9- اکنون، php.ini را از C: /xampp/php/php.ini (جایی که XAMPP را در آنجا نصب کرده‌اید) باز کنید و پسوند “php_pdo_mysql.dll” و “php_pdo.dll” را از حالت کامنت خارج کنید (اگر با پایگاه داده MySQL کار می کنید)و یا “php_pdo_oci.dll” را از حالت کامنت خارج کنید (اگر با پایگاه داده Oracle کار می‌کنید). اکنون، کار با پایگاه داده را شروع کنید.

نحوه کار با PDO

1- ایجاد پایگاه داده

برای اتصال به دیتابیس در Php با PDO، ابتدا باید یک پایگاه داده ایجاد کنیم؛ بنابراین با توجه به تصویر زبر، یک پایگاه داده با نام myDB ایجاد کنید.

اتصال به دیتابیس در Php با PDO
ایجاد پایگاه داده

2- اتصال پایگاه داده

برای تعامل با پایگاه داده، اتصال پایگاه داده همیشه مورد نیاز است. بنابراین، برای دسترسی به پایگاه داده، نام پایگاه داده، نام کاربری و رمز عبور باید شناسه را بدانیم.

اکنون، برنامه اتصال پایگاه داده را با استفاده از PDO در هر ویرایشگر متنی مانند notepad یا notepad ++ ایجاد کنید و آن را با نام coonection.php ذخیره کنید. با استفاده از localhost / 80 آن را بر روی سرور XAMPP اجرا کنید.

<?php  
    $dbHost="localhost";  
    $dbName="myDB";  
    $dbUser="root";      //by default root is user name.  
    $dbPassword="";     //password is blank by default  
    try{  
        $dbConn= new PDO("mysql:host=$dbHost;dbname=$dbName"<?php  
    $dbHost="localhost";  
    $dbName="myDB";  
    $dbUser="root";      //by default root is user name.  
    $dbPassword="";     //password is blank by default  
    try{  
        $dbConn= new PDO("mysql:host=$dbHost;dbname=$dbName",$dbUser,$dbPassword);  
        Echo "Successfully connected with myDB database";  
    } catch(Exception $e){  
    Echo "Connection failed" . $e->getMessage();  
    }  
?>  ,$dbUser,$dbPassword);  
        Echo "Successfully connected with myDB database";  
    } catch(Exception $e){  
    Echo "Connection failed" . $e->getMessage();  
    }  
?>  

3- اجرا بر روی سرور

با استفاده از آدرس محلی localhost / Xampp / pdoexample / connection.php / یا جایی که برنامه خود را ذخیره کرده‌اید ، آن را بر روی سرور اجرا کنید.

اجرا بر روی سرور
اجرا بر روی سرور

4- مدیریت خطای اتصال

در صورت وجود هر گونه خطای اتصال، PDOException فعال خواهد شد. اگر بخواهیم شرایط خطا را کنترل کنیم، می‌توانیم خطا را به کلی تصحیح کنیم، یا می‌توانیم آن را به کنترل‌کننده جهانی که می تواند توسط تابع (set_exception_handler)  تنظیم شود نیز بسپاریم.

برای مثال، در نمونه زیر، dbUser (شناسه کاربر) اشتباه است، بنابراین یک مورد خطا ایجاد می‌کند؛ همانطور که در خروجی مشاهده می‌کنیم.

<?php  
    $dbHost="localhost";  
    $dbName="myDB";  
    $dbUser="rroot";          
    $dbPassword="";       
    try{  
        $dbConn= new PDO("mysql:host=$dbHost;dbname=$dbName",$dbUser,$dbPassword);  
          
        //Set the PDO error mode to exception.  
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  
        Echo "Successfully connected with myDB database";  
    } catch(Exception $e){  
    Echo "Connection failed" . $e->getMessage();  
    }  
?>  

5- بستن اتصال پایگاه داده

برای بستن اتصال به دیتابیس در Php با PDO، باید اطمینان حاصل کنید که تمامی منابع باقیمانده به اتصال پاک شده‌اند، این کار را با اختصاص دستور NULL، به متغیری که شی را نگه داشته است انجام می‌دهید. اگر این کار را صریح انجام ندهید، PHP با پایان یافتن اسکریپت شما، به طور خودکار، اتصال را قطع می‌کند.

<?php  
    $dbHost="localhost";  
    $dbName="myDB";  
    $dbUser="root";      //by default root is user name.  
    $dbPassword="";     //password is blank by default  
    try{  
        $dbConn= new PDO("mysql:host=$dbHost;dbname=$dbName",$dbUser,$dbPassword);  
        Echo "Successfully connected with myDB database";  
    } catch(Exception $e){  
    Echo "Connection failed" . $e->getMessage();  
    }  
// this command close the connection.  
    $dbConn = null;   
?>  

چگونگی کار با کتابخانه PDO و نحوه خواندن و نمایش و خروجی (دستور fetch در pdo ، دستور insert در pdo)

ابتدا باید یک آبجکت از روی کلاس بسازیم و برای این منظور متغیری تحت عنوان connection$ در نظر گرفته و با استفاده از کلیدواژه new یک آبجکت جدید ایجاد می‌کنیم:

$connection = new PDO('mysql:host=host;dbname=Database','username', 'password');

آبجکت ساخته‌شده از روی این کلاس سه پارامتر ورودی می‌گیرد که اولین پارامتر مربوط به نوع سیستم مدیریت دیتابیس، نام دیتابیس و سرور آن است و پارامتر دوم هم مربوط به نام کاربری و پارامتر سوم هم مربوط به پسورد است. نسخهٔ تکمیلی کد بالا برای ارتباط با MySQL به صورت زیر است:

$connection = new PDO('mysql:host=localhost;dbname=example','root', 'root');

همان‌طور که در کد بالا می‌بینیم، ابتدا نام سیستم مدیریت دیتابیس که mysql است را عنوان کردیم سپس نام هاست را localhost در نظر گرفته و دلیل انتخاب localhost این است که هم دیتابیس و هم اسکریپت‌های ما قرار است که روی یک سرور اجرا شوند و در نهایت هم نام دیتابیس که در این مثال example است را در نظر گرفته ایم. پارامتر دوم مربوط به نام کاربری اتصال به MySQL است که در این مثال نام کاربری مربوط به PhpMyAdmin نصب شده روی سیستم root است و پارامتر آخر هم مربوط به پسورد است که آن هم root در نظر گرفته شده است.

$connection = new PDO('mysql:host=localhost;dbname=example',$myUsername, $myPassword);

در زبان برنامه‌نویسی PHP زمانی که اقدام به استفاده از قابلیت شی گرای این زبان می‌کنیم، اگر آبجکت ساخته‌شده تحت عنوان connection$ مشکلی داشته باشد، این مشکل را متوجه نخواهیم شد مگر آنکه راه‌کاری در نظر داشته باشیم. استفاده از دستورات catch و try برای مدیریت کردن اِکسپشن‌ها راه‌کار رایجی بین برنامه‌نویسان است:

try {

$connection = new PDO('mysql:host=localhost;dbname=example', 'root', 'root');

} catch(PDOException $e) {

echo 'Opps, Something bad just happened!' . '<br>';

echo $e->getMessage();

}

تا این مرحله ،توانسته‌ایم با موفقیت با دیتابیس مد نظر خود ارتباط برقرار کنیم و در ادامه با فراخوانی داده‌ها از دیتابیس آشنا می‌شویم. برای این منظور از دو روش مختلف می‌توان استفاده کرد که یکی استفاده از متد ()query و دیگری متد ()execute است. متد ()query را بررسی می‌کنیم:

try {

$connection = new PDO('mysql:host=localhost;dbname=example', 'root', 'root');

$result = $connection->query('SELECT * FROM users');

foreach ($result as $row) {

print_r($row);

}

} catch(PDOException $e) {

echo 'Opps, Something bad just happened!' . '<br>';

echo $e->getMessage();

}

همان‌طور که در کد فوق ملاحظه می‌شود، ابتدا یک متغیر جدید ساخته‌ایم تحت عنوان result$ و مقدار آن را برابر با آبجکت ساخته‌شده از روی کلاس PDO قرار داده‌ایم که روشی تحت عنوان ()query به آن اضافه شده است. داخل این روش هم یک دستور بسیار سادهٔ SQL قرار داده‌ایم به این صورت که این اسکریپت باید کلیهٔ داده‌های قرار گرفته در جدولی تحت عنوان users را در متغیر result$ ذخیره کند. سپس با استفاده از یک حلقه تمامی ردیف‌های قرار گرفته در جدول users را به متغیری تحت عنوان row$ اختصاص داده و با استفاده از روشی تحت عنوان ()print_r آن‌ها را نمایش خواهیم داد.

این روش را با استفاده از حلقهٔ while نیز می‌توان به صورت زیر اجرا کرد:

try {

$connection = new PDO('mysql:host=localhost;dbname=example', 'root', 'root');

$query = $connection->query('SELECT * FROM users');

while ($row = $query->fetch()) {

var_dump($row);

}

} catch (PDOException $e) {

echo $e->getMessage();

}

شرط حلقه while را متغیری تحت عنوان row$ قرار داده‌ایم که مقدار آن برابر است با متغیر query$ که متدی تحت عنوان ()fetch به آن اضافه شده است. این حلقه آن‌قدر گردش می‌کند تا تمامی ردیف‌های موجود در جدول به متغیر row$ اختصاص یابند. اگر بخواهیم تا خروجی حلقهٔ ما یک آرایه از جنس عددی باشد، باید پارامتری معادل با PDO::FETCH_NUM را برای متد ()fetch در نظر بگیریم و اگر هم بخواهیم یک آرایه با پیشوندهای غیرعددی دریافت کنیم، باید پارامتر PDO::FETCH_ASSOC را برای این روش در نظر بگیریم:

try {

$connection = new PDO('mysql:host=localhost;dbname=example', 'root', 'root');

$query = $connection->query('SELECT * FROM users');

while ($row = $query->fetch(PDO::FETCH_ASSOC)) {

var_dump($row);

}

} catch (PDOException $e) {

echo $e->getMessage();

}

توجه داشته باشیم که دستور fetch در pdo تحت عنوان ()fetchAll این امکان را در اختیار ما قرار می‌دهد تا بتوانیم در قالب یک کوئری به دیتابیس، کلیهٔ مقادیر یک جدول به‌خصوص را دریافت کنیم اما لازم است توجه داشته باشیم که نسبت به ()fetch از میزان حافظه بیشتری استفاده خواهد کرد:


try {

$connection = new PDO('mysql:host=localhost;dbname=example', 'root', 'root');

$query = $connection->query('SELECT * FROM users');

$query = $query->fetchAll();

foreach ($query as $row) {

print_r($row);

}

} catch (PDOException $e) {

echo $e->getMessage();

}

بسیاری از برنامه‌های وب از ارتباط مداوم با سرورهای پایگاه داده بهره مند هستند. اتصالات پایدار در پایان اسکریپت بسته نمی‌شوند، اما وقتی اسکریپت دیگری درخواست اتصال می‌کند، از حافظه پنهان شده اعتبارنامه دوباره استفاده می‌شود. خروجی به شکل پایین به ما امکان می‌دهد از ایجاد اتصال جدید اسکریپت، هر زمان که به یک پایگاه داده نیاز دارد، جلوگیری کنیم و در نتیجه یک برنامه وب سریع‌تر ایجاد کنیم.

try {

$connection = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// use the connection here
$sth = $dbh->query('SELECT * FROM foo');

// and now we're done; close it
$sth = null;
$dbh = null;

}

حرف آخر

در مقاله فوق، با مزایای PDO نسبت به MySQL آشنا شدیم و نحوه نصب و کار با آن را نیز یاد گرفتیم. امیدواریم مطلب فوق برای شما مفید بوده باشد. سوالات و نظرات خود را با ما در میان بگذارید.