PHP5自從2004年發佈以來PDO就有了,可是如今縱觀周邊開發的狀況仍是4世代的mysql或者mysqli佔據大部分江山,就像ie6同樣。也許改革須要時間的推進,在即將發行的PHP6中PDO會做爲默認的數據庫連接工具。這是一個趨勢,無論時間須要多久,運用新的技術是技術人員一項基本要素。搜索網上的PHP的PDO不是太多,通常是一些嘗試性質的簡介,或者概述。總以爲少了點什麼。我這裏補充下本身的一些實例,讓PDO的運用豐滿一些。大部分參考官方文檔例子。php
第一部分:開啓PDO支持 這個就很少說了,網上有不少這個文檔。總的來講就是windows下開始 extension linux下從新開啓支持pdo的編譯mysql
第二部分:實例介紹linux
一:建立連接,PDO做爲一個PHP統一的數據庫接口,包括了基本上市場上的數據庫類型。由於PHP和Mysql一直相互扶持,這裏就用Mysql作實例。sql
- 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();
第三部分:事務windows
- /*
- * 第三部分 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 表來作的測試ide
表結構以下wordpress
- 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