PHP Data Object یک کتابخانه Database Connection Abstraction برای PHP 5 است.
PDO چیست؟
· Extension ی برای PHP 5 که با زیان C/C++ نوشته شده است.
· Lightweigh Connection Abstraction Library
جرا PDO؟
· پایگاه های داده پشتیبانی شده توسط PHP را پشتیبانی می کند.
· لازم نیست برای هر پایگاه داده کدی جدا بنویسید. یکبار بنوبسید همه جا استفاده کنید.
· سرعت بالاتری دارد. PHP با زبان های کامپایل شده نوشته شده، برخلاف کتابخانه های PHP (مانند ADOdb) که با زیان های تفسیری نوشته شده است.
چه موقع از PDO استفاده کنیم؟
· هنگامی که به برنامه ای پرتابل نیاز دارید که از بیشتر پایگاه های داده پشتیبانی می کند.
· سرعت بالاتر می خواهید.
PDO یک Extension برای PHP 5 است که یک کتابخانه DBMS connection abstraction (data access abstraction library هم گفته می شود) را تعریف می کند. ADOdb برای PHP 4 نوشته شده است. PDO توابعی مانند ADOdb دارد با قابلیت های بسیار.
کتابخانه data access abstraction چیست؟ همانطور که می دانید، PHP از بیشتر پایگاه های داده اصلی مانند MySQL، MSSQL و غیره پشتیبانی می کند. کد اتصال به هرکدام از این پایگاه های داده مخصوص و متفاوت است. مثلا برای اتصال به پایگاه داده MySQL از کد زیر استفاده می کنیم:
| 1 | mysql_connect($host, $user, $password); |
اگر بخواهیم به SQLite متصل شویم:
برای Postgresql:
| 1 | pg_connect("host=$host dbname=$db user=$user password=$password"); |
ما برنامه ای مثلا بر اساس mysql نوشته ایم. هنگامی که لازم می شود مشتری به پایگاه داده SQLite مهاجرت کند، تمام برنامه را باید rebuild کنیم. اگر کدمان یک میلیون خطی باشد چه؟
لایه Data access Abstraction این تفاوت ها را حل می کند. ما فقط یکبار کدمان را می نویسیم و همه جا استفاده می کنیم (مانند جاوا).
فعالسازی PHP Data Objects Extension
ابتدا این Extension را فعال می کنیم. مراحل فعال سازی و یا برسی وجود این Extension به این شکل است:
برای استفاده از PDO، برسی کنید که ایا PDO extension وجود دارد یا نه؟ پوشه extension مربوط به PHP تان را باز کنید. برای مثال دایرکتوری app/php5/ext است.

سپس، فایل php.ini را باز کنید. معمولا در پوشه c:\windows است. خط های زیر را از حالت کامنت خارج کنید (; اول خط را بردارید):
extension = php_pdo.dll
extension=php_pdo_mysql.dll
اگر وجود ندارند انها را بسازید.

سرور آپاچی را ری استارت کنید. از داخل سرویس ها می توانید این کار را انجام دهید. اگر از ویندوز XP استفاده می کنید، از طریق زیر می توانید به ان دسترسی داشته باشید:
start > control panel > Performance and Maintenance > Administrative Tools > Services
apache را پیدا و انرا restart کنید.

اتصال با استفاده از PHP Data Objects
حالا به یک پایگاه داده متصل می شویم. از سرور mysql استفاده می کنیم. اول، یک پایگاه داده به نام test بسازید و جدولی به نام books:
| 1 | CREATE TABLE `books` ( |
| 2 | `id` int(11) NOT NULL auto_increment, |
| 3 | `title` varchar(150) NOT NULL, |
| 4 | `author` varchar(150) NOT NULL, |
| 5 | `description` varchar(255) NOT NULL, |
| 6 | `on_sale` tinyint(1) NOT NULL, |
| 7 | PRIMARY KEY (`id`) |
| 8 | ); |
داده های نمونه را وارد کنید:
| 1 | INSERT INTO `books` (`id`, `title`, `author`, `description`, `on_sale`) VALUES (1, 'PHP AJAX', 'Andreas', 'This is good book for learning AJAX', 1); |
| 2 | INSERT INTO `books` (`id`, `title`, `author`, `description`, `on_sale`) VALUES (2, 'PHP Eclipse ', 'George', 'Nice book', 0); |
| 3 | INSERT INTO `books` (`id`, `title`, `author`, `description`, `on_sale`) VALUES (3, 'PHP Prado', 'Junyian', '-', 1); |
| 4 | INSERT INTO `books` (`id`, `title`, `author`, `description`, `on_sale`) VALUES (4, 'PHP Zend Framework', 'Ozulian', 'great', 0); |
| 5 | INSERT INTO `books` (`id`, `title`, `author`, `description`, `on_sale`) VALUES (5, 'PHP Web Services', 'Bobi', '', 0); |
| 6 | INSERT INTO `books` (`id`, `title`, `author`, `description`, `on_sale`) VALUES (6, 'PHP API', 'Hugo', '', 1); |
| 7 | INSERT INTO `books` (`id`, `title`, `author`, `description`, `on_sale`) VALUES (7, 'PHP SEO', 'Monteo', '', 1); |
حالا با کد زیر به این پایگاه داده متصل می شویم:
| 01 | <?php |
| 02 | $host = "localhost"; |
| 03 | $db = "test"; |
| 04 | $user = "root"; |
| 07 | $conn = new PDO("mysql:host=$host;dbname=$db",$user,$pass); |
| 08 | |
| 09 | $sql = "SELECT * FROM books"; |
| 10 | $q = $conn->query($sql) or die("failed!"); |
| 11 | while($r = $q->fetch(PDO::FETCH_ASSOC)){ |
| 12 | echo $r['title']; |
اتصال پرتابل به پایگاه داده
برای اتصال به پایگاه داده یک خط کد می نویسیم. هنگام عوض کردن پایگاه داده، فقط یک خط کد را بازنویسی می کنیم. در زیر کد PDO برای اتصال به چند پایگاه داده امده است:
| 1 | // for MySQL |
| 2 | $conn = new PDO("mysql:host=$host;dbname=$db", $user, $pass); |
| 5 | $conn = new PDO("sqlite:$db"); |
| 6 | |
| 7 | // for postgreSQL |
| 8 | $conn = new PDO("pgsql:host=$host dbname=$db", $user, $pass); |
به کد زیر نگاه کنید:
| 01 | <?php |
| 02 | // configuration |
| 03 | $dbtype = "sqlite"; |
| 04 | $dbhost = "localhost"; |
| 05 | $dbname = "test"; |
| 06 | $dbuser = "root"; |
| 07 | $dbpass = "admin"; |
| 08 | $dbpath = "c:/test.db"; |
| 11 | switch($dbtype){ |
| 12 | case "mysql": |
| 13 | $dbconn = "mysql:host=$dbhost;dbname=$dbname"; |
| 14 | break; |
| 17 | $dbconn = "sqlite:$dbpath"; |
| 18 | break; |
| 21 | $dbconn = "pgsql:host=$host dbname=$db"; |
| 22 | break; |
| 25 | // database connection |
| 26 | $conn = new PDO($dbconn,$user,$pass); |
این روش راحت تر و پرتابل تر است. برای تغییر پایگاه داده فقط یک خط (خط 3) را تغییر می دهیم.
حالات Fetch
در این قسمت، حالات مختلف آوردن داده را می بینیم. در MySQL، می دانیم توابع زیر وجود دارد:
mysql_fetch_row()
mysql_fetch_array()
mysql_fetch_assoc()
در PDO چطور؟
کد زیر به صورت عمومی بدون تعیین حالت اوردن داده کار می کند:
| 01 | <?php |
| 02 | // configuration |
| 03 | $dbtype = "sqlite"; |
| 04 | $dbhost = "localhost"; |
| 05 | $dbname = "test"; |
| 06 | $dbuser = "root"; |
| 09 | // database connection |
| 10 | $conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass); |
| 13 | $sql = "SELECT title FROM books ORDER BY title"; |
| 14 | $q = $conn->query($sql); |
| 17 | while($r = $q->fetch()){ |
| 18 | print_r($r); |
| 21 | // result |
| 22 | //Array ( [title] => PHP AJAX [0] => PHP AJAX ) |
| 23 | //Array ( [title] => PHP API [0] => PHP API ) |
| 24 | //Array ( [title] => PHP Eclipse [0] => PHP Eclipse ) |
| 25 | //Array ( [title] => PHP Prado [0] => PHP Prado ) |
| 26 | //Array ( [title] => PHP SEO [0] => PHP SEO ) |
| 27 | //Array ( [title] => PHP Web Services [0] => PHP Web Services ) |
| 28 | //Array ( [title] => PHP Zend Framework [0] => PHP Zend Framework ) |
Fetch Association
| 01 | // query |
| 02 | $sql = "SELECT title FROM books ORDER BY title"; |
| 03 | $q = $conn->query($sql); |
| 04 | $q->setFetchMode(PDO::FETCH_ASSOC); |
| 07 | while($r = $q->fetch()){ |
| 08 | print_r($r); |
| 11 | // result |
| 12 | //Array ( [title] => PHP AJAX) |
| 13 | //Array ( [title] => PHP API) |
| 14 | //Array ( [title] => PHP Eclipse) |
| 15 | //Array ( [title] => PHP Prado) |
| 16 | //Array ( [title] => PHP SEO) |
| 17 | //Array ( [title] => PHP Web Services) |
| 18 | //Array ( [title] => PHP Zend Framework) |
Fetch Num (مانند mysql_fetch_row() در MySQL)
| 01 | $q->setFetchMode(PDO::FETCH_NUM); |
| 02 | |
| 03 | // fetch |
| 04 | while($r = $q->fetch()){ |
| 09 | //Array ( [0] => PHP AJAX ) |
| 10 | //Array ( [0] => PHP API ) |
| 11 | //Array ( [0] => PHP Eclipse ) |
| 12 | //Array ( [0] => PHP Prado ) |
| 13 | //Array ( [0] => PHP SEO ) |
| 14 | //Array ( [0] => PHP Web Services ) |
| 15 | //Array ( [0] => PHP Zend Framework ) |
Fetch Both (پیش فرض)
| 01 | $q->setFetchMode(PDO::FETCH_BOTH); |
| 02 | $q = $conn->query($sql); |
| 05 | while($r = $q->fetch()){ |
| 06 | print_r($r); |
| 09 | // result |
| 10 | //Array ( [title] => PHP AJAX [0] => PHP AJAX ) |
| 11 | //Array ( [title] => PHP API [0] => PHP API ) |
| 12 | //Array ( [title] => PHP Eclipse [0] => PHP Eclipse ) |
| 13 | //Array ( [title] => PHP Prado [0] => PHP Prado ) |
| 14 | //Array ( [title] => PHP SEO [0] => PHP SEO ) |
| 15 | //Array ( [title] => PHP Web Services [0] => PHP Web Services ) |
| 16 | //Array ( [title] => PHP Zend Framework [0] => PHP Zend Framework ) |
پردازش خطا(Error Handling)
هنگام باز کردن اتصال به پایگاه داده، انتخاب پایگاه داده و اجرای پرس و جوها باید خطا ها را چک کنیم.
در PDO اینگونه خطا ها را پردازش می کنیم:
| 01 | <?php |
| 02 | // configuration |
| 03 | $dbtype = "sqlite"; |
| 04 | $dbhost = "localhost"; |
| 05 | $dbname = "test"; |
| 06 | $dbuser = "root"; |
| 09 | try{ |
| 10 | // database connection |
| 11 | $conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass); |
| 12 | } |
| 13 | catch(PDOException $pe) |
| 14 | { |
| 15 | die('Connection error, because: ' .$pe->getMessage()); |
| 16 | } |
| 19 | // query |
| 20 | $sql = "SELECT title FROM books ORDER BY title"; |
| 21 | $q = $conn->query($sql); |
| 22 | |
| 25 | die("Execute query error, because: ". $conn->errorInfo()); |
| 26 | } |
| 27 | |
| 28 | $q->setFetchMode(PDO::FETCH_BOTH); |
| 31 | while($r = $q->fetch()){ |
| 32 | print_r($r); |
دستورهای آماده(Prepared Statements)
اگر با ویژوال استودیو کار کرده باشید، احتمالا از دستورات اماده استفاده کرده اید. PHP Extension برای MySQL و SQLite این قابلیت را ندارد. از مثال زیر مفهوم دستورات آماده را خواهید فهمید:
| 01 | <?php |
| 02 | // configuration |
| 03 | $dbtype = "sqlite"; |
| 04 | $dbhost = "localhost"; |
| 05 | $dbname = "test"; |
| 06 | $dbuser = "root"; |
| 09 | // database connection |
| 10 | $conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass); |
| 11 | |
| 12 | $title = 'PHP AJAX'; |
| 15 | $sql = "SELECT * FROM books WHERE title = ?"; |
| 16 | $q = $conn->prepare($sql); |
| 17 | $q->execute(array($title)); |
| 18 | |
| 19 | |
| 20 | $q->setFetchMode(PDO::FETCH_BOTH); |
| 23 | while($r = $q->fetch()){ |
| 24 | print_r($r); |
در این مثال، پرس و جو به یک متغیر (که با علامت ? مشخص کرده ایم) بستگی دارد.
| 1 | $sql = "SELECT * FROM books WHERE title = ?"; |
حالا، این پرس و جو را دستکاری می کنیم تا یک دستور آماده ساخته و اجرا کنیم:
| 1 | $q = $conn->prepare($sql); |
| 2 | $q->execute(array($title)) |
مثالی دیگر:
| 1 | $title = 'PHP%'; |
| 2 | $author = 'Bobi%'; |
| 3 | // query |
| 4 | $sql = "SELECT * FROM books WHERE title like ? AND author like ? "; |
| 5 | $q = $conn->prepare($sql); |
| 6 | $q->execute(array($title,$author)); |
Placeholder های اسمی و موقعیتی (Positional and Named Placeholder)
Placeholder های موقعیتی
این پرس و جو را ببینید:
| 1 | $title = 'PHP%'; |
| 2 | $author = 'Bobi%'; |
| 3 | // query |
| 4 | $sql = "SELECT * FROM books WHERE title like ? AND author like ? "; |
| 5 | $q = $conn->prepare($sql); |
| 6 | $q->execute(array($title,$author)); |
پرس و جوی بالا برای مشخص کردن محل مقادیر دستور آماده را با علامت ? مشخص کرده است. این علامت سوال ها placeholder موقعیتی نامیده می شوند. هنگام ارسال پارامتر ها به تابع execut() باید مواظب ترتیب انها در آرایه ارسالی باشیم.
Placeholder های اسمی
این مثال را ببینید:
| 1 | $title = 'PHP%'; |
| 2 | $author = 'Bobi%'; |
| 3 | // query |
| 4 | $sql = "SELECT * FROM books WHERE title like :title AND author like :author "; |
| 5 | $q = $conn->prepare($sql); |
| 6 | $q->execute(array(':author'=>$author, |
در اینجا به جای علامت سوال از دونقطه بعلاوه یک اسم استفاده کرده ایم. در اینجا موقعیت پارامتر های ارسالی مهم نیست. برای همین به ان Placeholder اسمی می گویند.
دستور Insert و Delete با استفاده از دستورهای اماده (Prepared statements)
در اینجا برای افزودن و حذف داده از دستورات اماده استفاده می کنیم.
مثال:
| 01 | <?php |
| 02 | // configuration |
| 03 | $dbtype = "sqlite"; |
| 04 | $dbhost = "localhost"; |
| 05 | $dbname = "test"; |
| 06 | $dbuser = "root"; |
| 09 | // database connection |
| 10 | $conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass); |
| 13 | $title = 'PHP Security'; |
| 14 | $author = 'Jack Hijack'; |
| 17 | $sql = "INSERT INTO books (title,author) VALUES (:title,:author)"; |
| 18 | $q = $conn->prepare($sql); |
| 19 | $q->execute(array(':author'=>$author, |
| 20 | ':title'=>$title)); |
مثال برای آپدیت کردن داده:
| 01 | <?php |
| 02 | // configuration |
| 03 | $dbtype = "sqlite"; |
| 04 | $dbhost = "localhost"; |
| 05 | $dbname = "test"; |
| 06 | $dbuser = "root"; |
| 09 | // database connection |
| 10 | $conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass); |
| 13 | $title = 'PHP Pattern'; |
| 14 | $author = 'Imanda'; |
| 17 | $sql = "UPDATE books |
| 18 | SET title=?, author=? |
| 19 | WHERE id=?"; |
| 20 | $q = $conn->prepare($sql); |
| 21 | $q->execute(array($title,$author,$id)); |
| 22 | |
دستورهای آماده و مقادیر Bound (بسته شده)
هر جا که بتوانید یک مقدار یا متغیر را به یک placeholder اسمی یا موقعیتی Bind کنید، PDO از دستورات bound هم پشتیبانی می کند. مثال زیر را ببینید:
| 01 | <?php |
| 02 | // configuration |
| 03 | $dbtype = "sqlite"; |
| 04 | $dbhost = "localhost"; |
| 05 | $dbname = "test"; |
| 06 | $dbuser = "root"; |
| 09 | // database connection |
| 10 | $conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass); |
| 15 | $sql = "SELECT * FROM books"; |
| 16 | $q = $conn->prepare($sql); |
| 19 | $q->bindColumn(1, $id); |
| 20 | $q->bindColumn(2, $title); |
| 21 | $q->bindColumn(3, $author); |
| 22 | |
| 23 | while($q->fetch()) |
| 24 | { |
| 25 | echo "$title, $author <br/>"; |
| 26 | } |
برای Insert کردن داده:
| 1 | // query |
| 2 | $sql = "INSERT INTO books (title,author) values(?,?)"; |
| 3 | |
| 4 | $q = $conn->prepare($sql); |
| 5 | $q->bindColumn(1, $title); |
| 6 | $q->bindColumn(2, $title); |
کار با BLOB ها
می توانیم عکس ها یا دیگر اسناد را در پایگاه داده ذخیره کنیم. برای این منظور، با نوع داده BLOB کار می کنیم.
اول، جدولی به نام books، می سازیم که دارای یک BLOB است.
| 1 | CREATE TABLE `books` ( |
| 2 | `id` int(11) NOT NULL auto_increment, |
| 3 | `title` varchar(150) NOT NULL, |
| 4 | `author` varchar(150) NOT NULL, |
| 5 | `description` varchar(255) NOT NULL, |
| 6 | `on_sale` tinyint(1) NOT NULL, |
| 7 | `cover` blob NOT NULL, |
| 8 | PRIMARY KEY (`id`) |
نمونه داده جدول را اضافه می کنیم:
| 01 | <?php |
| 02 | // configuration |
| 03 | $dbtype = "sqlite"; |
| 04 | $dbhost = "localhost"; |
| 05 | $dbname = "test"; |
| 06 | $dbuser = "root"; |
| 09 | // database connection |
| 10 | $conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass); |
| 13 | $title = "ZEND FRAMEWORK TUTORIAL"; |
| 14 | $author = "PHP Everyday"; |
| 15 | $cover = fopen('7.png','rb'); |
| 16 | // query |
| 17 | $sql = "INSERT INTO books (title,author,cover) values(?,?,?)"; |
| 18 | |
| 19 | $q = $conn->prepare($sql); |
| 20 | $q->bindParam(1, $title); |
| 21 | $q->bindParam(2, $author); |
| 22 | $q->bindParam(3, $cover, PDO::PARAM_LOB); |
حالا داده را بازیابی می کنیم:
| 01 | <?php |
| 02 | // configuration |
| 03 | $dbtype = "sqlite"; |
| 04 | $dbhost = "localhost"; |
| 05 | $dbname = "test"; |
| 06 | $dbuser = "root"; |
| 09 | // database connection |
| 10 | $conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass); |
| 13 | $sql = "SELECT id,title,author,cover FROM books"; |
| 14 | $q = $conn->prepare($sql); |
| 17 | $q->bindColumn(1, $id); |
| 18 | $q->bindColumn(2, $title); |
| 19 | $q->bindColumn(3, $author); |
| 20 | $q->bindColumn(4, $cover, PDO::PARAM_LOB); |
| 23 | { |
| 24 | file_put_contents($id.".png",$cover); |
| 25 | echo "$title, $author, <img src='".$id.".png'> <br/>"; |
| 26 | } |
تعیین پارامترهای Connection
در PDO ویژگی وجود دارد که انرا connection attribute می نامیم. این قابلیت پیشرفته را می توان برای تغییر نام ستون ها، تبدیل case (بزرگی کوچکی حرف ها)، و غیره استفاده کرد. مثال زیر را ببینید:
| 01 | <?php |
| 02 | // configuration |
| 03 | $dbtype = "sqlite"; |
| 04 | $dbhost = "localhost"; |
| 05 | $dbname = "test"; |
| 06 | $dbuser = "root"; |
| 09 | // database connection |
| 10 | $conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass); |
| 13 | $conn->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER); |
| 14 | $sql = "SELECT * FROM books"; |
| 15 | $q = $conn->prepare($sql); |
| 16 | $q->execute(); |
| 17 | |
| 18 | $r = $q->fetch(PDO::FETCH_ASSOC); |
| 23 | //Array ( [ID] => 1 |
| 24 | // [TITLE] => PHP AJAX |
| 25 | // [AUTHOR] => Andreas |
| 26 | // [DESCRIPTION] => This is good book for learning AJAX |
| 27 | // [ON_SALE] => 1 |
| 28 | // [COVER] => ) |
حالا خط 13 را ببینید:
| 1 | $conn->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER); |
از ویژگی PDO::ATTR_CASE استفاده کرده ایم. این ویژگی case نام ستون هایی که با دستور PDOStatement::fetch() برگردانده می شود را کنترل می کند. این روش فقط زمانی کار می کند که حالت اوردن داده (Fetch mode) برابر PDO::FETCH_ASSOC یا PDO::FETCH_BOTH باشد. از کد بالا این داده ها را دریافت می کنیم:
| 1 | Array ( [ID] => 1 |
| 2 | [TITLE] => PHP AJAX |
| 3 | [AUTHOR] => Andreas |
| 4 | [DESCRIPTION] => This is good book for learning AJAX |
| 5 | [ON_SALE] => 1 |
| 6 | [COVER] => ) |
دیگر مقادیر این ویژگی PDO::CASE_LOWER و PDO::CASE_NATURAL است.
ویژگی حالت خطا(Error Mode Attributes)
درباره PDO::ERRMODE صحبت خواهیم کرد. این ویژگی حالت گزارش خطا را کنترل می کند. سه مقدار می تواند داشته باشد:
PDO::ERRMODE_SILENT
PDO::ERRMODE_WARNING
PDO:ERRMODE_EXCEPTION
PDO::ERRMODE_SILENT
هنگامی که خطایی رخ می دهد، کد خطا را می توان با PDO::errorCode() یا PDO::errorInfo() بدست آورد. این مقدار پیش فرض برای PDO::ERRMODE است.
| 01 | <?php |
| 02 | // configuration |
| 03 | $dbtype = "sqlite"; |
| 04 | $dbhost = "localhost"; |
| 05 | $dbname = "test"; |
| 06 | $dbuser = "root"; |
| 09 | // database connection |
| 10 | $conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass); |
| 13 | $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); |
| 14 | $sql = "SELECT * FROM booksa"; |
| 15 | $q = $conn->query($sql) or die("ERROR: " . implode(":", $conn->errorInfo())); |
| 16 | |
| 17 | $r = $q->fetch(PDO::FETCH_ASSOC); |
| 18 | |
| 21 | //result: |
| 22 | //ERROR: 42S02:1146:Table 'test.booksa' doesn't exist |
PDO::ERRMODE_WARNING
هیچ کاری انجام نمی شود ولی خطایی با درجه E_Warning صادر می شود.
| 01 | // query |
| 02 | $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); |
| 03 | $sql = "SELECT * FROM booksa"; |
| 04 | $q = $conn->query($sql) or die("ERROR: " . implode(":", $conn->errorInfo())); |
| 05 | |
| 06 | $r = $q->fetch(PDO::FETCH_ASSOC); |
| 11 | //Warning: PDO::query() [function.PDO-query]: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.booksa' doesn't exist in |
| 12 | //C:\AppServ5\www\test\pdo\test.php on line 15 |
| 13 | //ERROR: 42S02:1146:Table 'test.booksa' doesn't exist |
PDO::ERRMODE_EXCEPTION
کد های خطا را قرار می دهد (مانند PDO::ERRMODE_SILENT) و یک exception از کلاس PDOException صادر می شود.
| 01 | // query |
| 02 | $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); |
| 03 | $sql = "SELECT * FROM booksa"; |
| 04 | $q = $conn->query($sql) or die("ERROR: " . implode(":", $conn->errorInfo())); |
| 05 | |
| 06 | $r = $q->fetch(PDO::FETCH_ASSOC); |
| 11 | //Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.booksa' doesn't exist' in |
| 12 | //C:\AppServ5\www\test\pdo\test.php:15 Stack trace: #0 C:\AppServ5\www\test\pdo\test.php(15): PDO->query('SELECT * FROM b...') #1 {main} thrown in |
| 13 | //C:\AppServ5\www\test\pdo\test.php on line 15 |
بهبود کارایی با اتصالات مانا (persistent connection)
از اتصال های مانا می توان برای بالابردن کارایی استفاده کرد. هنگامی که یک اتصال مانا درخواست می شود، PHP برسی می کند که ایا اتصالی "همانند" و باز از قبل وجود دارد یا نه. اگر وجود داشته باشد، از ان استفاده می شود. اتصال باز (مانا) به چه معناست؟ اتصال مانا لینکی است که بعد از اتمام اجرای اسکریپت بسته نمی شوند. اتصال های "همانند"، اتصالهایی هستند که ،با استفاده از یک نام کاربری و پسورد، به یک هاست (Host) باز شده اند.
در PDO چگونه از اتصال مانا استفاده کنیم؟ PDO دارای ویژگی PDO::ATTR_PERSISTENT است. انرا در سازنده PDO اعمال می کنیم:
| 01 | <?php |
| 02 | // configuration |
| 03 | $dbtype = "sqlite"; |
| 04 | $dbhost = "localhost"; |
| 05 | $dbname = "test"; |
| 06 | $dbuser = "root"; |
| 09 | // database connection |
| 10 | $conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass, array(PDO::ATTR_PERSISTENT => true)); |
| 13 | $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); |
| 14 | $sql = "SELECT * FROM books"; |
| 15 | $q = $conn->query($sql) or die("ERROR: " . implode(":", $conn->errorInfo())); |
| 16 | |
| 17 | $r = $q->fetch(PDO::FETCH_ASSOC); |
| 18 | |
خط 10 را ببینید.
دسترسی به ویژگی های Connection
با استفاده از متد getAttribute() می توانیم به ویژگی های اتصال دسترسی پیدا کنیم. مثال زیر را ببینید:
PDO:ATTR_DRIVER_NAME: نام درایور پایگاه داده را بر می گرداند. | 01 | <?php |
| 02 | // configuration |
| 03 | $dbtype = "sqlite"; |
| 04 | $dbhost = "localhost"; |
| 05 | $dbname = "test"; |
| 06 | $dbuser = "root"; |
| 09 | // database connection |
| 10 | $conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass, array(PDO::ATTR_PERSISTENT => true)); |
| 11 | |
| 12 | echo $conn->getAttribute(PDO::ATTR_DRIVER_NAME); |
| 13 | // result: mysql |
| 14 | ?> |
مثال 2:
| 01 | <?php |
| 02 | // configuration |
| 03 | $dbtype = "sqlite"; |
| 04 | $dbhost = "localhost"; |
| 05 | $dbname = "test"; |
| 06 | $dbuser = "root"; |
| 09 | // database connection |
| 10 | $conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass, array(PDO::ATTR_PERSISTENT => true)); |
| 11 | |
| 12 | echo $conn->getAttribute(PDO::ATTR_DRIVER_NAME); |
| 13 | echo "<br>"; |
| 14 | echo $conn->getAttribute(PDO::ATTR_CLIENT_VERSION); |
| 15 | echo "<br>"; |
| 16 | echo $conn->getAttribute(PDO::ATTR_SERVER_VERSION); |