PHP5自從2004年釋出以來PDO就有了,但是現在縱觀周邊開發的情況還是4世代的mysql或者mysqli佔據大部分江山,就像ie6一樣。也許改革需要時間的推動,在即將發行的PHP6中PDO會作為預設的資料庫連結工具。這是一個趨勢,不管時間需要多久,運用新的技術是技術人員一項基本要素。搜尋網上的PHP的PDO不是太多,一般是一些嘗試性質的簡介,或者概述。總覺得少了點什麼。我這裡補充下自己的一些例項,讓PDO的運用豐滿一些。大部分參考官方文件例子。
第一部分:開啟PDO支援 這個就不多說了,網上有很多這個文件。總的來說就是windows下開始 extension linux下重新開啟支援pdo的編譯
第二部分:例項介紹
一:建立連結,PDO作為一個PHP統一的資料庫介面,包括了基本上市場上的資料庫型別。因為PHP和Mysql一直相互扶持,這裡就用Mysql做例項。
- define(`DB_NAME`, `wordpress`);
- define(`DB_USER`, `root`);
- define(`DB_PASSWORD`, “);
- define(`DB_HOST`, `localhost`);
- define(`DB_CHARSET`, `utf8`);
- try {
- $DBH = new PDO(`mysql:host=localhost;dbname=wordpress`, DB_USER, DB_PASSWORD);
- $DBH->exec(`SET CHARACTER SET `.DB_CHARSET);
- $DBH->exec(`SET NAMES `.DB_CHARSET);
- /*
- * 如果想要在指令碼結束的時候不釋放連結那麼在引數裡面加上array(PDO::ATTR_PERSISTENT => true)不過一般情況下可以不用常連結
- $dbh = new PDO(`mysql:host=localhost;dbname=test`, $user, $pass, array(
- PDO::ATTR_PERSISTENT => true
- ));
- */
- } catch (PDOException $e) {
- print “Error!: “ . $e->getMessage() . “<br/>”;
- die();
- }
二:基本資料操作
- /*
- * 第二部分:資料庫的基本操作 增刪改查 這裡先說基本的exec和query 函式
- */
- //增加資料
- $sql_insert = `INSERT INTO wp_options(blog_id,option_name,option_value,autoload) VALUES (0,`.time().rand(1,100).`,`.time().rand(1,100).`,`no`)`;
- $back = $DBH->exec($sql_insert); //返回 bool 的true or fal
- $lastInsertId = $DBH->lastInsertId();
- //更新資料
- $sql_update = `UPDATE wp_options SET option_name = “.time().rand(1,100).“ WHERE option_id=`.$lastInsertId;
- $lastUpdateId = $DBH->lastInsertId(); //返回的對應的操作的id
- //查詢資料
- $sql_select = `SELECT option_id FROM wp_options ORDER BY option_id DESC LIMIT 4 `;
- $back = $DBH->query($sql_select); //返回一個物件 這個物件可以用foreach 直接遍歷迴圈 迴圈的為查詢的結果集
- $back = $DBH->query($sql_select)->fetch(); //返回一條資料結果 這個物件可以用foreach 直接遍歷迴圈 迴圈的為查詢的結果集
- $back = $DBH->query($sql_select)->fetchAll(); //返回一個陣列 這個物件可以用foreach 直接遍歷迴圈 迴圈的為查詢的結果集
- $back = $DBH->query($sql_select)->fetchColumn(0); //返回一個欄位字串,這個字串是返回的記錄的第一條記錄的第一個欄位
- //刪除資料
- $sql_delete = `DELETE FROM wp_options WHERE option_id=`.$lastInsertId;
- $back = $DBH->exec($sql_delete); //返回 bool 的true or fal
- $lastInsertId = $DBH->lastInsertId();
第三部分:事務
- /*
- * 第三部分 PDO的事務機制 這裡已經封裝好了 在使用事務的時候最好使用 try 和catch 如果try 返回錯誤 那麼就不會提交的哦
- */
- try{
- $DBH->beginTransaction();//開啟一個事務
- //Sql 執行的內容 ………………….
- $DBH->exec($sql_insert); //執行一系列的操作
- $DBH->exec($sql_update);
- $DBH->exec($sql_delete);
- //等等
- $DBH->commit(); //如果正確執行完成 那麼確認 commit
- } catch(Exception $e) {
- $DBH->rollBack();//如果執行中有錯誤的情況下 回滾
- }
第四部分:預處理Sql 和 儲存過程
- /*
- * 第四部分 儲存過程 和預處理Sql
- */
- //預處理Sql PDO 提供了預處理Sql 機制 這樣可以重複使用Sql 語句 只要把其中的一些關鍵的變數每次重新賦值就可以了 這裡的變數是引用傳遞的值
- $stmt = $DBH->prepare(`INSERT INTO wp_options(blog_id,option_name,option_value,autoload) VALUES (0,:option_name,:option_value,`no`)`);
- $option_name = $option_value = “;
- $stmt->bindParam(`:option_name`, $option_name); //
- $stmt->bindParam(`:option_value`, $option_value);
- // insert one row
- $option_name = `name`.time();
- $option_value = `value`.time();
- $stmt->execute();
- // insert another row with different values
- $option_name = `name_`.time();
- $option_value = `value_`.time();
- $stmt->execute();
- $stmt = $DBH->prepare(`INSERT INTO wp_options(blog_id,option_name,option_value,autoload) VALUES (0,?,?,`no`)`);
- $option_name = $option_value = “;
- $stmt->bindParam(`1`, $option_name); //
- $stmt->bindParam(`2`, $option_value);
- // insert one row
- $option_name = `name`.time();
- $option_value = `value`.time();
- $stmt->execute();
- // insert another row with different values
- $option_name = `name_`.time();
- $option_value = `value_`.time();
- $stmt->execute();
- $stmt = $DBH->prepare(“SELECT * FROM wp_options where option_id = ?”);
- if ($stmt->execute(array(@$_GET[`option_id`]))) {
- while (@$row = $stmt->fetch()) {
- print_r($row);
- }
- }
- //儲存過程 關於儲存過程的寫法,我回頭再另一篇文章中詳細介紹下。 這裡只是簡單的提下 以便PDO這個功能的描述
- $sql_procedure = `
- CREATE PROCEDURE inout_test(
- IN in_option_id INT,
- OUT out_option_name VARCHAR(255),
- OUT out_option_value TEXT
- )
- BEGIN
- SELECT option_name INTO out_option_name FROM wp_options WHERE option_id = in_option_id;
- SELECT option_value INTO out_option_value FROM wp_options WHERE option_id = in_option_id;
- END;
- `;
- try{
- $sql_drop_procedure = `DROP PROCEDURE inout_test`;
- $back = $DBH->exec($sql_procedure);
- //這裡發覺現在的這一部分總覺得不是太完善和容易上手,可能個人原因吧 這裡還是用原始點的方法 以後如果有新的認知再補充
- $sql_call_procedure = `CALL inout_test(100,@out_option_name,@out_option_value)`;
- $DBH->exec($sql_call_procedure);
- $sql_select_procedure = `SELECT @out_option_name,@out_option_value`;
- $back = $DBH->query($sql_select_procedure)->fetch();
- $back = $DBH->exec($sql_drop_procedure);
- }catch(Exception $e){
- echo $e->getMessage();
- }
這些都是示例 資料庫結構是基於wordpress的 wp_options 表來做的測試
表結構如下
- CREATE TABLE IF NOT EXISTS `wp_options` (
- `option_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
- `blog_id` int(11) NOT NULL DEFAULT `0`,
- `option_name` varchar(64) NOT NULL DEFAULT “,
- `option_value` longtext NOT NULL,
- `autoload` varchar(20) NOT NULL DEFAULT `yes`,
- PRIMARY KEY (`option_id`),
- UNIQUE KEY `option_name` (`option_name`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=256 ;
這些都是基本的入門的,但是可以滿足目前對資料庫的操作。剩下的一些PDO的部分看文件不解釋,但是現在新手看文件的習慣。也許是造成這個現在還使用範圍不大的原因吧。
最後整體來一份code
- <?php
- /**
- * 關於PHP5版本引入的PDO(PHP Data Objects)的詳細例項使用
- */
- /*
- *第一部分:資料庫連結
- */
- define(`DB_NAME`, `wordpress`);
- define(`DB_USER`, `root`);
- define(`DB_PASSWORD`, “);
- define(`DB_HOST`, `localhost`);
- define(`DB_CHARSET`, `utf8`);
- try {
- $DBH = new PDO(`mysql:host=localhost;dbname=wordpress`, DB_USER, DB_PASSWORD);
- $DBH->exec(`SET CHARACTER SET `.DB_CHARSET);
- $DBH->exec(`SET NAMES `.DB_CHARSET);
- /*
- * 如果想要在指令碼結束的時候不釋放連結那麼在引數裡面加上array(PDO::ATTR_PERSISTENT => true)不過一般情況下可以不用常連結
- $dbh = new PDO(`mysql:host=localhost;dbname=test`, $user, $pass, array(
- PDO::ATTR_PERSISTENT => true
- ));
- */
- } catch (PDOException $e) {
- print “Error!: ” . $e->getMessage() . “<br/>“;
- die();
- }
- /*
- * 第二部分:資料庫的基本操作 增刪改查 這裡先說基本的exec和query 函式
- */
- //增加資料
- $sql_insert = `INSERT INTO wp_options(blog_id,option_name,option_value,autoload) VALUES (0,`.time().rand(1,100).`,`.time().rand(1,100).`,`no`)`;
- $back = $DBH->exec($sql_insert); //返回 bool 的true or fal
- $lastInsertId = $DBH->lastInsertId();
- //更新資料
- $sql_update = `UPDATE wp_options SET option_name = ``.time().rand(1,100).`` WHERE option_id=`.$lastInsertId;
- $lastUpdateId = $DBH->lastInsertId(); //返回的對應的操作的id
- //查詢資料
- $sql_select = `SELECT option_id FROM wp_options ORDER BY option_id DESC LIMIT 4 `;
- $back = $DBH->query($sql_select); //返回一個物件 這個物件可以用foreach 直接遍歷迴圈 迴圈的為查詢的結果集
- $back = $DBH->query($sql_select)->fetch(); //返回一條資料結果 這個物件可以用foreach 直接遍歷迴圈 迴圈的為查詢的結果集
- $back = $DBH->query($sql_select)->fetchAll(); //返回一個陣列 這個物件可以用foreach 直接遍歷迴圈 迴圈的為查詢的結果集
- $back = $DBH->query($sql_select)->fetchColumn(0); //返回一個欄位字串,這個字串是返回的記錄的第一條記錄的第一個欄位
- //刪除資料
- $sql_delete = `DELETE FROM wp_options WHERE option_id=`.$lastInsertId;
- $back = $DBH->exec($sql_delete); //返回 bool 的true or fal
- $lastInsertId = $DBH->lastInsertId();
- /*
- * 第三部分 PDO的事務機制 這裡已經封裝好了 在使用事務的時候最好使用 try 和catch 如果try 返回錯誤 那麼就不會提交的哦
- */
- try{
- $DBH->beginTransaction();//開啟一個事務
- //Sql 執行的內容 ………………….
- $DBH->exec($sql_insert); //執行一系列的操作
- $DBH->exec($sql_update);
- $DBH->exec($sql_delete);
- //等等
- $DBH->commit(); //如果正確執行完成 那麼確認 commit
- } catch(Exception $e) {
- $DBH->rollBack();//如果執行中有錯誤的情況下 回滾
- }
- /*
- * 第四部分 儲存過程 和預處理Sql
- */
- //預處理Sql PDO 提供了預處理Sql 機制 這樣可以重複使用Sql 語句 只要把其中的一些關鍵的變數每次重新賦值就可以了 這裡的變數是引用傳遞的值
- $stmt = $DBH->prepare(`INSERT INTO wp_options(blog_id,option_name,option_value,autoload) VALUES (0,:option_name,:option_value,`no`)`);
- $option_name = $option_value = “;
- $stmt->bindParam(`:option_name`, $option_name); //
- $stmt->bindParam(`:option_value`, $option_value);
- // insert one row
- $option_name = `name`.time();
- $option_value = `value`.time();
- $stmt->execute();
- // insert another row with different values
- $option_name = `name_`.time();
- $option_value = `value_`.time();
- $stmt->execute();
- $stmt = $DBH->prepare(`INSERT INTO wp_options(blog_id,option_name,option_value,autoload) VALUES (0,?,?,`no`)`);
- $option_name = $option_value = “;
- $stmt->bindParam(`1`, $option_name); //
- $stmt->bindParam(`2`, $option_value);
- // insert one row
- $option_name = `name`.time();
- $option_value = `value`.time();
- $stmt->execute();
- // insert another row with different values
- $option_name = `name_`.time();
- $option_value = `value_`.time();
- $stmt->execute();
- $stmt = $DBH->prepare(“SELECT * FROM wp_options where option_id = ?”);
- if ($stmt->execute(array(@$_GET[`option_id`]))) {
- while (@$row = $stmt->fetch()) {
- print_r($row);
- }
- }
- //儲存過程 關於儲存過程的寫法,我回頭再另一篇文章中詳細介紹下。 這裡只是簡單的提下 以便PDO這個功能的描述
- $sql_procedure = `
- CREATE PROCEDURE inout_test(
- IN in_option_id INT,
- OUT out_option_name VARCHAR(255),
- OUT out_option_value TEXT
- )
- BEGIN
- SELECT option_name INTO out_option_name FROM wp_options WHERE option_id = in_option_id;
- SELECT option_value INTO out_option_value FROM wp_options WHERE option_id = in_option_id;
- END;
- `;
- try{
- $sql_drop_procedure = `DROP PROCEDURE inout_test`;
- $back = $DBH->exec($sql_procedure);
- //這裡發覺現在的這一部分總覺得不是太完善和容易上手,可能個人原因吧 這裡還是用原始點的方法 以後如果有新的認知再補充
- $sql_call_procedure = `CALL inout_test(100,@out_option_name,@out_option_value)`;
- $DBH->exec($sql_call_procedure);
- $sql_select_procedure = `SELECT @out_option_name,@out_option_value`;
- $back = $DBH->query($sql_select_procedure)->fetch();
- $back = $DBH->exec($sql_drop_procedure);
- }catch(Exception $e){
- echo $e->getMessage();
- }
如果有問題的可以留言或者自己看官方手冊
http://cn.php.net/manual/zh/book.pdo.php