PHP PDO函數庫詳解

来源:http://www.cnblogs.com/favana/archive/2016/03/02/5234450.html
-Advertisement-
Play Games

PDO是一個“資料庫訪問抽象層”,作用是統一各種資料庫的訪問介面,與mysql和mysqli的函數庫相比,PDO讓跨資料庫的使用更具有親和力;與ADODB和MDB2相比,PDO更高效。目前而言,實現“資料庫抽象層”任重而道遠,使用PDO這樣的“資料庫訪問抽象層”是一個不錯的選擇。 PDO中包含三個預


 

 

PDO是一個“資料庫訪問抽象層”,作用是統一各種資料庫的訪問介面,與mysql和mysqli的函數庫相比,PDO讓跨資料庫的使用更具有親和力;與ADODB和MDB2相比,PDO更高效。目前而言,實現“資料庫抽象層”任重而道遠,使用PDO這樣的“資料庫訪問抽象層”是一個不錯的選擇。

PDO中包含三個預定義的類

PDO中包含三個預定義的類,它們分別是 PDO、PDOStatement 和 PDOException。

一、PDO

PDO->beginTransaction() — 標明回滾起始點
PDO->commit() — 標明回滾結束點,並執行SQL
PDO->rollBack() — 執行回滾
PDO->__construct() — 建立一個PDO鏈接資料庫的實例
PDO->errorCode() — 獲取錯誤碼
PDO->errorInfo() — 獲取錯誤的信息
PDO->exec() — 處理一條SQL語句,並返回所影響的條目數
PDO->getAttribute() — 獲取一個“資料庫連接對象”的屬性
PDO->getAvailableDrivers() — 獲取有效的PDO驅動器名稱
PDO->lastInsertId() — 獲取寫入的最後一條數據的主鍵值
PDO->prepare() — 生成一個“查詢對象”
PDO->query() — 處理一條SQL語句,並返回一個“PDOStatement”
PDO->quote() — 為某個SQL中的字元串添加引號
PDO->setAttribute() — 為一個“資料庫連接對象”設定屬性

詳解1) PDO中的資料庫連接
$dsn = ‘mysql:dbname=ent;host=127.0.0.1′;
$user = ‘root';
$password = ‘123456′;
try {
$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_PERSISTENT => true));
$dbh->query('set names utf8;');
foreach ($dbh->query('SELECT * from tpm_juese') as $row) {
print_r($row);
}
} catch (PDOException $e) {
echo ‘Connection failed: ‘ . $e->getMessage();
}

許多Web應用會因為使用了向資料庫的持久連接而得到優化。持久連接不會在腳本結束時關閉,
相反它會被緩存起來併在另一個腳本通過同樣的標識請求一個連接時得以重新利用。
持久連接的緩存可以使你避免在腳本每次需要與資料庫對話時都要部署一個新的連接的資源消耗,讓你的Web應用更加快速。
上面實例中的array(PDO::ATTR_PERSISTENT => true)就是把連接類型設置為持久連接。

詳解2) PDO中的事務
PDO->beginTransaction(),PDO->commit(),PDO->rollBack()這三個方法是在支持回滾功能時一起使用的。PDO->beginTransaction()方法標明起始點,PDO->commit()方法標明回滾結束點,並執行SQL,PDO->rollBack()執行回滾。
<?php
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', ‘root', ”);
$dbh->query('set names utf8;');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$dbh->beginTransaction();
$dbh->exec(”INSERT INTO `test`.`table` (`name` ,`age`)VALUES ('mick', 22);”);
$dbh->exec(”INSERT INTO `test`.`table` (`name` ,`age`)VALUES ('lily', 29);”);
$dbh->exec(”INSERT INTO `test`.`table` (`name` ,`age`)VALUES ('susan', 21);”);
$dbh->commit();

} catch (Exception $e) {
$dbh->rollBack();
echo “Failed: ” . $e->getMessage();
}
?>
現在你已經通過PDO建立了連接,在部署查詢之前你必須搞明白PDO是怎樣管理事務的。如果你以前從未遇到過事務處理,(現在簡單介紹一下:)它們提供了4個主要的特性:原子性,一致性,獨立性和持久性(Atomicity, Consistency, Isolation and Durability,ACID)通俗一點講,一個事務中所有的工作在提交時,即使它是分階段執行的,也要保證安全地應用於資料庫,不被其他的連接干擾。事務工作也可以在請求發生錯誤時輕鬆地自動取消。

事務的典型運用就是通過把批量的改變“保存起來”然後立即執行。這樣就會有徹底地提高更新效率的好處。換句話說,事務可以使你的腳本更快速同時可能更健壯(要實現這個優點你仍然需要正確的使用它們)。

不幸運的是,並不是每個資料庫都支持事務,因此PDO需要在建立連接時運行在被認為是“自動提交”的模式下。自動提交模式意味著你執行的每個查詢都有它自己隱含的事務處理,無論資料庫支持事務還是因資料庫不支持而不存在事務。如果你需要一個事務,你必須使用 PDO->beginTransaction() 方法創建一個。如果底層驅動不支持事務處理,一個PDOException就會被拋出(與你的異常處理設置無關,因為這總是一個嚴重的錯誤狀態)。在一個事物中,你可以使用 PDO->commit() 或 PDO->rollBack() 結束它,這取決於事務中代碼運行是否成功。

當腳本結束時或一個連接要關閉時,如果你還有一個未處理完的事務,PDO將會自動將其回滾。這是對於腳本意外終止的情況來說是一個安全的方案——如果你沒有明確地提交事務,它將會假設發生了一些錯誤,為了你數據的安全,所以就執行回滾了。

二、PDOStatement

PDOStatement->bindColumn() — Bind a column to a PHP variable
PDOStatement->bindParam() — Binds a parameter to the specified variable name
PDOStatement->bindValue() — Binds a value to a parameter
PDOStatement->closeCursor() — Closes the cursor, enabling the statement to be executed again.
PDOStatement->columnCount() — Returns the number of columns in the result set
PDOStatement->errorCode() — Fetch the SQLSTATE associated with the last operation on the statement handle
PDOStatement->errorInfo() — Fetch extended error information associated with the last operation on the statement handle
PDOStatement->execute() — Executes a prepared statement
PDOStatement->fetch() — Fetches the next row from a result set
PDOStatement->fetchAll() — Returns an array containing all of the result set rows
PDOStatement->fetchColumn() — Returns a single column from the next row of a result set
PDOStatement->fetchObject() — Fetches the next row and returns it as an object.
PDOStatement->getAttribute() — Retrieve a statement attribute
PDOStatement->getColumnMeta() — Returns metadata for a column in a result set
PDOStatement->nextRowset() — Advances to the next rowset in a multi-rowset statement handle
PDOStatement->rowCount() — Returns the number of rows affected by the last SQL statement
PDOStatement->setAttribute() — Set a statement attribute
PDOStatement->setFetchMode() — Set the default fetch mode for this statement

三、PDOException

PDO 提供了3中不同的錯誤處理策略。
1. PDO::ERRMODE_SILENT
這是預設使用的模式。PDO會在statement和database對象上設定簡單的錯誤代號,你可以使用PDO->errorCode() 和 PDO->errorInfo() 方法檢查錯誤;如果錯誤是在對statement對象進行調用時導致的,你就可以在那個對象上使用 PDOStatement->errorCode() 或 PDOStatement->errorInfo() 方法取得錯誤信息。而如果錯誤是在對database對象調用時導致的,你就應該在這個database對象上調用那兩個方法。
2. PDO::ERRMODE_WARNING
作為設置錯誤代號的附加,PDO將會發出一個傳統的E_WARNING信息。這種設置在除錯和調試時是很有用的,如果你只是想看看發生了什麼問題而不想中斷程式的流程的話。
3. PDO::ERRMODE_EXCEPTION
作為設置錯誤代號的附件,PDO會拋出一個PDOException異常並設置它的屬性來反映錯誤代號和錯誤信息。這中設置在除錯時也是很有用的,因為他會有效的“放大(blow up)”腳本中的出錯點,非常快速的指向一個你代碼中可能出錯區域。(記住:如果異常導致腳本中斷,事務處理回自動回滾。)
異常模式也是非常有用的,因為你可以使用比以前那種使用傳統的PHP風格的錯誤處理結構更清晰的結構處理錯誤,比使用安靜模式使用更少的代碼及嵌套,也能夠更加明確地檢查每個資料庫訪問的返回值。
關於PHP中異常的更多信息請看Exceptions章節
PDO 使用基於SQL-92 SQLSTATE 的錯誤代號字元串;特定的PDO驅動應當將自己本身的代號對應到適當的SQLSTATE代號上。PDO->errorCode() 方法只返回單一的SQLSTATE代號。如果你需要關於一個錯誤的更加有針對性的信息,PDO也提供了一個PDO->errorInfo()方法,它可以返回一個包含了SQLSTATE代號,特定資料庫驅動的錯誤代號和特定資料庫驅動的錯誤說明字元串。

<?php
// 修改預設的錯誤顯示級別
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
?>

屬性列表:

PDO::PARAM_BOOL
表示一個布爾類型
PDO::PARAM_NULL
表示一個SQL中的NULL類型
PDO::PARAM_INT
表示一個SQL中的INTEGER類型
PDO::PARAM_STR
表示一個SQL中的SQL CHAR,VARCHAR類型
PDO::PARAM_LOB
表示一個SQL中的large object類型
PDO::PARAM_STMT
表示一個SQL中的recordset類型,還沒有被支持
PDO::PARAM_INPUT_OUTPUT
Specifies that the parameter is an INOUT parameter for a stored procedure. You must bitwise-OR this value with an explicit PDO::PARAM_* data type.
PDO::FETCH_LAZY
將每一行結果作為一個對象返回
PDO::FETCH_ASSOC
僅僅返回以鍵值作為下標的查詢的結果集,名稱相同的數據只返回一個
PDO::FETCH_NAMED
僅僅返回以鍵值作為下標的查詢的結果集,名稱相同的數據以數組形式返回
PDO::FETCH_NUM
僅僅返回以數字作為下標的查詢的結果集
PDO::FETCH_BOTH
同時返回以鍵值和數字作為下標的查詢的結果集
PDO::FETCH_OBJ
以對象的形式返回結果集
PDO::FETCH_BOUND
將PDOStatement::bindParam()和PDOStatement::bindColumn()所綁定的值作為變數名賦值後返回
PDO::FETCH_COLUMN
表示僅僅返回結果集中的某一列
PDO::FETCH_CLASS
表示以類的形式返回結果集
PDO::FETCH_INTO
表示將數據合併入一個存在的類中進行返回
PDO::FETCH_FUNC
PDO::FETCH_GROUP
PDO::FETCH_UNIQUE
PDO::FETCH_KEY_PAIR
以首個鍵值下表,後面數字下表的形式返回結果集
PDO::FETCH_CLASSTYPE
PDO::FETCH_SERIALIZE
表示將數據合併入一個存在的類中並序列化返回
PDO::FETCH_PROPS_LATE
Available since PHP 5.2.0
PDO::ATTR_AUTOCOMMIT
在設置成true的時候,PDO會自動嘗試停止接受委托,開始執行
PDO::ATTR_PREFETCH
設置應用程式提前獲取的數據大小,並非所有的資料庫哦度支持
PDO::ATTR_TIMEOUT
設置連接資料庫超時的值
PDO::ATTR_ERRMODE
設置Error處理的模式
PDO::ATTR_SERVER_VERSION
只讀屬性,表示PDO連接的伺服器端資料庫版本
PDO::ATTR_CLIENT_VERSION
只讀屬性,表示PDO連接的客戶端PDO驅動版本
PDO::ATTR_SERVER_INFO
只讀屬性,表示PDO連接的伺服器的meta信息
PDO::ATTR_CONNECTION_STATUS
PDO::ATTR_CASE
通過PDO::CASE_*中的內容對列的形式進行操作
PDO::ATTR_CURSOR_NAME
獲取或者設定指針的名稱
PDO::ATTR_CURSOR
設置指針的類型,PDO現在支持PDO::CURSOR_FWDONLY和PDO::CURSOR_FWDONLY
PDO::ATTR_DRIVER_NAME
返回使用的PDO驅動的名稱
PDO::ATTR_ORACLE_NULLS
將返回的空字元串轉換為SQL的NULL
PDO::ATTR_PERSISTENT
獲取一個存在的連接
PDO::ATTR_STATEMENT_CLASS
PDO::ATTR_FETCH_CATALOG_NAMES
在返回的結果集中,使用自定義目錄名稱來代替欄位名。
PDO::ATTR_FETCH_TABLE_NAMES
在返回的結果集中,使用自定義表格名稱來代替欄位名。
PDO::ATTR_STRINGIFY_FETCHES
PDO::ATTR_MAX_COLUMN_LEN
PDO::ATTR_DEFAULT_FETCH_MODE
Available since PHP 5.2.0
PDO::ATTR_EMULATE_PREPARES
Available since PHP 5.1.3.
PDO::ERRMODE_SILENT
發生錯誤時不彙報任何的錯誤信息,是預設值
PDO::ERRMODE_WARNING
發生錯誤時發出一條php的E_WARNING的信息
PDO::ERRMODE_EXCEPTION
發生錯誤時拋出一個PDOException
PDO::CASE_NATURAL
回覆列的預設顯示格式
PDO::CASE_LOWER
強制列的名字小寫
PDO::CASE_UPPER
強制列的名字大寫
PDO::NULL_NATURAL
PDO::NULL_EMPTY_STRING
PDO::NULL_TO_STRING
PDO::FETCH_ORI_NEXT
獲取結果集中的下一行數據,僅在有指針功能時有效
PDO::FETCH_ORI_PRIOR
獲取結果集中的上一行數據,僅在有指針功能時有效
PDO::FETCH_ORI_FIRST
獲取結果集中的第一行數據,僅在有指針功能時有效
PDO::FETCH_ORI_LAST
獲取結果集中的最後一行數據,僅在有指針功能時有效
PDO::FETCH_ORI_ABS
獲取結果集中的某一行數據,僅在有指針功能時有效
PDO::FETCH_ORI_REL
獲取結果集中當前行後某行的數據,僅在有指針功能時有效
PDO::CURSOR_FWDONLY
建立一個只能向後的指針操作對象
PDO::CURSOR_SCROLL
建立一個指針操作對象,傳遞PDO::FETCH_ORI_*中的內容來控制結果集
PDO::ERR_NONE (string)
設定沒有錯誤時候的錯誤信息
PDO::PARAM_EVT_ALLOC
Allocation event
PDO::PARAM_EVT_FREE
Deallocation event
PDO::PARAM_EVT_EXEC_PRE
Event triggered prior to execution of a prepared statement.
PDO::PARAM_EVT_EXEC_POST
Event triggered subsequent to execution of a prepared statement.
PDO::PARAM_EVT_FETCH_PRE
Event triggered prior to fetching a result from a resultset.
PDO::PARAM_EVT_FETCH_POST
Event triggered subsequent to fetching a result from a resultset.
PDO::PARAM_EVT_NORMALIZE
Event triggered during bound parameter registration allowing the driver to normalize the parameter name.
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 數據對象映射模式,是將對象和數據存儲映射起來,對一個對象的操作會映射為對數據存儲的操作。 在代碼中實現數據對象映射模式,實現一個ORM類,將複雜的sql語句映射成對象屬性的操作。對象關係映射(Object Relational Mapping,ORM) ha_cl表 Hacl.php <?php n
  • 引入自: http://blog.csdn.net/aaronuu/article/details/7055650 List 轉換為 String數組 List<String> list = new ArrayList<String>(); list.add("a1"); list.add("a2"
  • 下載 cURL http://pan.baidu.com/s/1hqrHWkG (curl-7.39.0.tar.gz) 3.98MB 解壓: [plain] view plain copy tar zxvf curl-7.39.0.tar.gz ./configure --prefix=/usr/
  • 試可以幫助識別和解決應用程式缺陷,在本文中,作者將使用大家常用的的開發工具Eclipse來調試Java應用程式。但這裡介紹的調試方法基本都是通用的,也適用於NetBeans IDE,我們會把重點放在運行時上面。 在開始之前,推薦大家去看看Eclipse shortcuts這篇文章,它將會給你帶來很多
  • 一、java編程註意事項1.java區分大小寫2.每條語句結尾有分號3.上下級代碼註意縮進4.大括弧要成對出現5.標點符號要用英文半形(半形全形區別)二、eclipse1.eclipse是自編譯及時編譯2.java ee包含java se 三、變數 1.+表示將多段文字拼接成一句話 2.使用變數就相
  • 設置微信支付需要的4個參數APPID APPSECRET MCHID KEY在哪裡找呢 其中APPID APPSECRET為公眾號的appid和appsecret,在微信公眾平臺後臺查看 開發》基本配置》開發者ID MCHID和KEY為微信支付商戶號和API密鑰,在微信支付商戶平臺後臺查看 MCHI
  • http://blog.csdn.net/bluishglc/article/details/47909593?utm_source=tuicool&utm_medium=referral 實際工作中用到網路知識的機會並不多,雖然以前學習過,但是許久不用自然也就生疏了。最近拿到幾台雲上的虛擬機,需要
  • MyEclipse 2016基於Eclipse Mars 1 (4.5.1),除了在Eclipse基礎上做了更新之外,我們還更新了集成在MyEclipse上的第三方工具,比如STS, m2e, BIRT, Webtools, eGit等等。 Mars集成對Java的一些核心進行了改進,比如編譯器的...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...