PHP5中PDO(PHP DATA OBJECT)模塊基礎詳解

PHP5自從2004年發佈以來PDO就有了,但是現在縱觀周邊開發的情況還是4世代的mysql或者mysqli佔據大部分江山,就像ie6一樣。也許改革需要時間的推動,在即將發行的PHP6中PDO會作爲默認的數據庫鏈接工具。這是一個趨勢,不管時間需要多久,運用新的技術是技術人員一項基本要素。搜索網上的PHP的PDO不是太多,一般是一些嘗試性質的簡介,或者概述。總覺得少了點什麼。我這裏補充下自己的一些實例,讓PDO的運用豐滿一些。大部分參考官方文檔例子。

第一部分:開啓PDO支持 這個就不多說了,網上有很多這個文檔。總的來說就是windows下開始 extension linux下重新開啓支持pdo的編譯

第二部分:實例介紹

一:創建鏈接,PDO作爲一個PHP統一的數據庫接口,包括了基本上市場上的數據庫類型。因爲PHP和Mysql一直相互扶持,這裏就用Mysql做實例。

 

  1. define('DB_NAME''wordpress'); 
  2. define('DB_USER''root'); 
  3. define('DB_PASSWORD'''); 
  4. define('DB_HOST''localhost'); 
  5. define('DB_CHARSET''utf8'); 
  6. try { 
  7.     $DBH = new PDO('mysql:host=localhost;dbname=wordpress', DB_USER, DB_PASSWORD); 
  8.     $DBH->exec('SET CHARACTER SET '.DB_CHARSET); 
  9.     $DBH->exec('SET NAMES '.DB_CHARSET); 
  10.     /* 
  11.      * 如果想要在腳本結束的時候不釋放鏈接那麼在參數裏面加上array(PDO::ATTR_PERSISTENT => true)不過一般情況下可以不用常鏈接 
  12.     $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array( 
  13.         PDO::ATTR_PERSISTENT => true 
  14.         )); 
  15.      */ 
  16. } catch (PDOException $e) { 
  17.     print "Error!: " . $e->getMessage() . "<br/>"
  18.     die(); 

二:基本數據操作

 

  1. /* 
  2.  * 第二部分:數據庫的基本操作 增刪改查 這裏先說基本的exec和query 函數 
  3.  */ 
  4.  
  5. //增加數據 
  6.  
  7. $sql_insert = 'INSERT INTO wp_options(blog_id,option_name,option_value,autoload) VALUES (0,'.time().rand(1,100).','.time().rand(1,100).',\'no\')'
  8. $back = $DBH->exec($sql_insert); //返回 bool 的true or fal 
  9. $lastInsertId = $DBH->lastInsertId(); 
  10. //更新數據 
  11. $sql_update = 'UPDATE wp_options SET option_name = \''.time().rand(1,100).'\' WHERE option_id='.$lastInsertId;  
  12. $lastUpdateId = $DBH->lastInsertId(); //返回的對應的操作的id 
  13. //查詢數據 
  14. $sql_select = 'SELECT option_id FROM wp_options ORDER BY option_id DESC LIMIT 4 '
  15. $back = $DBH->query($sql_select); //返回一個對象 這個對象可以用foreach 直接遍歷循環 循環的爲查詢的結果集 
  16. $back = $DBH->query($sql_select)->fetch(); //返回一條數據結果 這個對象可以用foreach 直接遍歷循環 循環的爲查詢的結果集 
  17. $back = $DBH->query($sql_select)->fetchAll(); //返回一個數組 這個對象可以用foreach 直接遍歷循環 循環的爲查詢的結果集 
  18. $back = $DBH->query($sql_select)->fetchColumn(0); //返回一個字段字符串,這個字符串是返回的記錄的第一條記錄的第一個字段 
  19.  
  20. //刪除數據 
  21. $sql_delete = 'DELETE FROM wp_options WHERE option_id='.$lastInsertId
  22. $back = $DBH->exec($sql_delete); //返回 bool 的true or fal 
  23. $lastInsertId = $DBH->lastInsertId(); 

第三部分:事務

 

  1. /* 
  2.  * 第三部分 PDO的事務機制 這裏已經封裝好了 在使用事務的時候最好使用 try 和catch 如果try 返回錯誤 那麼就不會提交的哦 
  3.  */ 
  4. try{ 
  5.     $DBH->beginTransaction();//開啓一個事務 
  6.     //Sql 執行的內容 ...................... 
  7.     $DBH->exec($sql_insert); //執行一系列的操作 
  8.     $DBH->exec($sql_update); 
  9.     $DBH->exec($sql_delete); 
  10.     //等等 
  11.     $DBH->commit(); //如果正確執行完成 那麼確認 commit 
  12. } catch(Exception $e) { 
  13.     $DBH->rollBack();//如果執行中有錯誤的情況下  回滾 

第四部分:預處理Sql 和 存儲過程

 

  1. /* 
  2.  * 第四部分 存儲過程 和預處理Sql 
  3.  */ 
  4. //預處理Sql PDO 提供了預處理Sql 機制 這樣可以重複使用Sql 語句 只要把其中的一些關鍵的變量每次重新賦值就可以了 這裏的變量是引用傳遞的值  
  5. $stmt = $DBH->prepare('INSERT INTO wp_options(blog_id,option_name,option_value,autoload) VALUES (0,:option_name,:option_value,\'no\')'); 
  6. $option_name = $option_value = ''
  7. $stmt->bindParam(':option_name'$option_name); // 
  8. $stmt->bindParam(':option_value'$option_value); 
  9.  
  10. // insert one row 
  11. $option_name = 'name'.time(); 
  12. $option_value = 'value'.time(); 
  13. $stmt->execute(); 
  14.  
  15. // insert another row with different values 
  16. $option_name = 'name_'.time(); 
  17. $option_value = 'value_'.time(); 
  18. $stmt->execute(); 
  19.  
  20. $stmt = $DBH->prepare('INSERT INTO wp_options(blog_id,option_name,option_value,autoload) VALUES (0,?,?,\'no\')'); 
  21. $option_name = $option_value = ''
  22. $stmt->bindParam('1'$option_name); // 
  23. $stmt->bindParam('2'$option_value); 
  24.  
  25. // insert one row 
  26. $option_name = 'name'.time(); 
  27. $option_value = 'value'.time(); 
  28. $stmt->execute(); 
  29.  
  30. // insert another row with different values 
  31. $option_name = 'name_'.time(); 
  32. $option_value = 'value_'.time(); 
  33. $stmt->execute(); 
  34.  
  35.  
  36. $stmt = $DBH->prepare("SELECT * FROM wp_options where option_id = ?"); 
  37. if ($stmt->execute(array(@$_GET['option_id']))) { 
  38.   while (@$row = $stmt->fetch()) { 
  39.     print_r($row); 
  40.   } 
  41. //存儲過程 關於存儲過程的寫法,我回頭再另一篇文章中詳細介紹下。 這裏只是簡單的提下 以便PDO這個功能的描述 
  42. $sql_procedure = ' 
  43.             CREATE PROCEDURE inout_test( 
  44.                 IN in_option_id INT, 
  45.                 OUT out_option_name VARCHAR(255), 
  46.                 OUT out_option_value TEXT 
  47.             ) 
  48.             BEGIN 
  49.                 SELECT option_name INTO out_option_name   FROM wp_options WHERE option_id = in_option_id; 
  50.                 SELECT option_value INTO out_option_value FROM wp_options WHERE option_id = in_option_id; 
  51.             END
  52. '; 
  53. try{ 
  54.     $sql_drop_procedure = 'DROP PROCEDURE inout_test'
  55.     $back = $DBH->exec($sql_procedure); 
  56.     //這裏發覺現在的這一部分總覺得不是太完善和容易上手,可能個人原因吧 這裏還是用原始點的方法 以後如果有新的認知再補充 
  57.     $sql_call_procedure = 'CALL inout_test(100,@out_option_name,@out_option_value)'
  58.     $DBH->exec($sql_call_procedure); 
  59.     $sql_select_procedure = 'SELECT @out_option_name,@out_option_value'
  60.     $back = $DBH->query($sql_select_procedure)->fetch(); 
  61.     $back = $DBH->exec($sql_drop_procedure); 
  62. }catch(Exception $e){ 
  63.     echo $e->getMessage(); 

這些都是示例 數據庫結構是基於wordpress的 wp_options 表來做的測試

表結構如下

  1. CREATE TABLE IF NOT EXISTS `wp_options` ( 
  2.   `option_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
  3.   `blog_id` int(11) NOT NULL DEFAULT '0'
  4.   `option_name` varchar(64) NOT NULL DEFAULT ''
  5.   `option_value` longtext NOT NULL
  6.   `autoload` varchar(20) NOT NULL DEFAULT 'yes'
  7.   PRIMARY KEY (`option_id`), 
  8.   UNIQUE KEY `option_name` (`option_name`) 
  9. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=256 ; 

這些都是基本的入門的,但是可以滿足目前對數據庫的操作。剩下的一些PDO的部分看文檔不解釋,但是現在新手看文檔的習慣。也許是造成這個現在還使用範圍不大的原因吧。

最後整體來一份code

  1. <?php 
  2. /** 
  3.  * 關於PHP5版本引入的PDO(PHP Data Objects)的詳細實例使用 
  4.  */ 
  5.  
  6. /* 
  7.  *第一部分:數據庫鏈接  
  8.  */ 
  9. define('DB_NAME', 'wordpress'); 
  10. define('DB_USER', 'root'); 
  11. define('DB_PASSWORD', ''); 
  12. define('DB_HOST', 'localhost'); 
  13. define('DB_CHARSET', 'utf8'); 
  14. try { 
  15.     $DBH = new PDO('mysql:host=localhost;dbname=wordpress', DB_USER, DB_PASSWORD); 
  16.     $DBH->exec('SET CHARACTER SET '.DB_CHARSET); 
  17.     $DBH->exec('SET NAMES '.DB_CHARSET); 
  18.     /* 
  19.      * 如果想要在腳本結束的時候不釋放鏈接那麼在參數裏面加上array(PDO::ATTR_PERSISTENT => true)不過一般情況下可以不用常鏈接 
  20.     $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array( 
  21.         PDO::ATTR_PERSISTENT => true 
  22.         )); 
  23.      */ 
  24. } catch (PDOException $e) { 
  25.     print "Error!: " . $e->getMessage() . "<br/>"; 
  26.     die(); 
  27.  
  28. /* 
  29.  * 第二部分:數據庫的基本操作 增刪改查 這裏先說基本的exec和query 函數 
  30.  */ 
  31.  
  32. //增加數據 
  33.  
  34. $sql_insert = 'INSERT INTO wp_options(blog_id,option_name,option_value,autoload) VALUES (0,'.time().rand(1,100).','.time().rand(1,100).',\'no\')'; 
  35. $back = $DBH->exec($sql_insert); //返回 bool 的true or fal 
  36. $lastInsertId = $DBH->lastInsertId(); 
  37. //更新數據 
  38. $sql_update = 'UPDATE wp_options SET option_name = \''.time().rand(1,100).'\' WHERE option_id='.$lastInsertId;  
  39. $lastUpdateId = $DBH->lastInsertId(); //返回的對應的操作的id 
  40. //查詢數據 
  41. $sql_select = 'SELECT option_id FROM wp_options ORDER BY option_id DESC LIMIT 4 '
  42. $back = $DBH->query($sql_select); //返回一個對象 這個對象可以用foreach 直接遍歷循環 循環的爲查詢的結果集 
  43. $back = $DBH->query($sql_select)->fetch(); //返回一條數據結果 這個對象可以用foreach 直接遍歷循環 循環的爲查詢的結果集 
  44. $back = $DBH->query($sql_select)->fetchAll(); //返回一個數組 這個對象可以用foreach 直接遍歷循環 循環的爲查詢的結果集 
  45. $back = $DBH->query($sql_select)->fetchColumn(0); //返回一個字段字符串,這個字符串是返回的記錄的第一條記錄的第一個字段 
  46.  
  47. //刪除數據 
  48. $sql_delete = 'DELETE FROM wp_options WHERE option_id='.$lastInsertId; 
  49. $back = $DBH->exec($sql_delete); //返回 bool 的true or fal 
  50. $lastInsertId = $DBH->lastInsertId(); 
  51.  
  52. /* 
  53.  * 第三部分 PDO的事務機制 這裏已經封裝好了 在使用事務的時候最好使用 try 和catch 如果try 返回錯誤 那麼就不會提交的哦 
  54.  */ 
  55. try{ 
  56.     $DBH->beginTransaction();//開啓一個事務 
  57.     //Sql 執行的內容 ...................... 
  58.     $DBH->exec($sql_insert); //執行一系列的操作 
  59.     $DBH->exec($sql_update); 
  60.     $DBH->exec($sql_delete); 
  61.     //等等 
  62.     $DBH->commit(); //如果正確執行完成 那麼確認 commit 
  63. } catch(Exception $e) { 
  64.     $DBH->rollBack();//如果執行中有錯誤的情況下  回滾 
  65. /* 
  66.  * 第四部分 存儲過程 和預處理Sql 
  67.  */ 
  68. //預處理Sql PDO 提供了預處理Sql 機制 這樣可以重複使用Sql 語句 只要把其中的一些關鍵的變量每次重新賦值就可以了 這裏的變量是引用傳遞的值  
  69. $stmt = $DBH->prepare('INSERT INTO wp_options(blog_id,option_name,option_value,autoload) VALUES (0,:option_name,:option_value,\'no\')'); 
  70. $option_name = $option_value = ''
  71. $stmt->bindParam(':option_name', $option_name); // 
  72. $stmt->bindParam(':option_value', $option_value); 
  73.  
  74. // insert one row 
  75. $option_name = 'name'.time(); 
  76. $option_value = 'value'.time(); 
  77. $stmt->execute(); 
  78.  
  79. // insert another row with different values 
  80. $option_name = 'name_'.time(); 
  81. $option_value = 'value_'.time(); 
  82. $stmt->execute(); 
  83.  
  84. $stmt = $DBH->prepare('INSERT INTO wp_options(blog_id,option_name,option_value,autoload) VALUES (0,?,?,\'no\')'); 
  85. $option_name = $option_value = ''
  86. $stmt->bindParam('1', $option_name); // 
  87. $stmt->bindParam('2', $option_value); 
  88.  
  89. // insert one row 
  90. $option_name = 'name'.time(); 
  91. $option_value = 'value'.time(); 
  92. $stmt->execute(); 
  93.  
  94. // insert another row with different values 
  95. $option_name = 'name_'.time(); 
  96. $option_value = 'value_'.time(); 
  97. $stmt->execute(); 
  98.  
  99.  
  100. $stmt = $DBH->prepare("SELECT * FROM wp_options where option_id = ?"); 
  101. if ($stmt->execute(array(@$_GET['option_id']))) { 
  102.   while (@$row = $stmt->fetch()) { 
  103.     print_r($row); 
  104.   } 
  105. //存儲過程 關於存儲過程的寫法,我回頭再另一篇文章中詳細介紹下。 這裏只是簡單的提下 以便PDO這個功能的描述 
  106. $sql_procedure = ' 
  107.             CREATE PROCEDURE inout_test( 
  108.                 IN in_option_id INT, 
  109.                 OUT out_option_name VARCHAR(255), 
  110.                 OUT out_option_value TEXT 
  111.             ) 
  112.             BEGIN 
  113.                 SELECT option_name INTO out_option_name   FROM wp_options WHERE option_id = in_option_id
  114.                 SELECT option_value INTO out_option_value FROM wp_options WHERE option_id = in_option_id
  115.             END; 
  116. '; 
  117. try{ 
  118.     $sql_drop_procedure = 'DROP PROCEDURE inout_test'
  119.     $back = $DBH->exec($sql_procedure); 
  120.     //這裏發覺現在的這一部分總覺得不是太完善和容易上手,可能個人原因吧 這裏還是用原始點的方法 以後如果有新的認知再補充 
  121.     $sql_call_procedure = 'CALL inout_test(100,@out_option_name,@out_option_value)'
  122.     $DBH->exec($sql_call_procedure); 
  123.     $sql_select_procedure = 'SELECT @out_option_name,@out_option_value'
  124.     $back = $DBH->query($sql_select_procedure)->fetch(); 
  125.     $back = $DBH->exec($sql_drop_procedure); 
  126. }catch(Exception $e){ 
  127.     echo $e->getMessage(); 

如果有問題的可以留言或者自己看官方手冊

http://cn.php.net/manual/zh/book.pdo.php

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章