首頁 >後端開發 >php教程 >PHP5中 PDO類的詳解

PHP5中 PDO類的詳解

墨辰丷
墨辰丷原創
2018-05-19 09:14:171619瀏覽

本篇主要介紹PHP5中 PDO類的詳解,有興趣的朋友參考下,希望對大家有幫助。

■PDO為何? POD(PHP Data Object)擴充在PHP5中加入,PHP6將默認識用PDO連接資料庫,所有非PDO擴充將會在PHP6被從擴充中移除。此擴充提供PHP內建類別 PDO來對資料庫進行訪問,不同資料庫使用相同的方法名,解決資料庫連接不統一的問題。我是配置在windows下做開發用的。 ■PDO的目標

提供一個輕量、清晰、方便的 API
統一各種不同 RDBMS 函式庫的共有特性,但不排除更高階的特性。
透過 PHP 腳本提供可選的較大程度的抽象/相容性。

■PDO的特點:

效能。 PDO 從一開始就吸取了現有資料庫擴展成功和失敗的經驗教訓。因為 PDO 的程式碼是全新的,所以我們有機會重新開始設計效能,以利用 PHP 5 的最新特性。
能力。 PDO 旨在將常見的資料庫功能作為基礎提供,同時提供對 RDBMS 獨特功能的方便存取。
簡單。 PDO 旨在讓您輕鬆使用資料庫。 API 不會強行介入您的程式碼,同時會清楚地表明每個函數呼叫的過程。
運行時可擴充。 PDO 擴充功能是模組化的,可讓您在運行時為您的資料庫後端載入驅動程序,而不必重新編譯或重新安裝整個 PHP 程式。例如,PDO_OCI 擴充功能會取代 PDO 擴充實作 oracle 資料庫 API。還有一些用於 MySQL、PostgreSQL、ODBC 和 Firebird 的驅動程序,更多的驅動程式尚在開發中。 [separator]


■安裝PDO
我這裡是WINDOWS下開發用的PDO擴展,如果你要在Linux下安裝配置,請到別的地方尋找。
版本需求:php5.1以及以後版本的套件裡已經帶了;php5.0.x則要到pecl.php.net下載,放到你的擴充庫,就是PHP所在的資料夾的ext資料夾下;手冊上說5.0之前的版本不能運行PDO擴充。設定:
修改你的php.ini設定檔,讓它支援pdo.(php.ini這個東西沒懂的話,先弄清楚,要修改呼叫你的phpinfo()函式所顯示的那個php.ini )把extension=php_pdo.dll前面的分號去掉,分毫是php設定檔註解符號,這個擴充是必須的。往下還有
;extension=php_pdo.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_informix.dll
#;extension=php_pdo_mssql.dll
;extension=php_##;extension=php_pdo_mssql.dll
;extension=php_pdo_my=php_pdo
;extension=php_pdo_oci.dll
;extension=php_pdo_oci8.dll
;extension=php_pdo_odbc.dll
#;extension=php_pdo_pgsql.dll
extension=php_pdo分別為對應的資料庫是:
Driver name Supported databases
PDO_DBLIB FreeTDS / Microsoft SQL Server / Sybase
PDO_FIREBIRD Firebird/Interbase 6
PDO_INFORMIX IBM Informix Dynamic Server
PDO_MY MySQLSQL 3.x/4. ##PDO_OCI Oracle Call Interface
PDO_ODBC ODBC v3 (IBM DB2, unixODBC and win32 ODBC)
PDO_PGSQL PostgreSQL
PDO_SQLITE SQLite 3 and SQLite 2
你要用哪一個資料庫,只要把對應的哪一個擴充前的註解符號";"去掉就可以了。

■使用PDO
我這裡假設你已經裝好mysql了,如果沒裝的話,麻煩先想辦法裝上,我的是mysql5.0.22,黑夜路人用的是MySQL 4.0.26也可以用。
★資料庫的連結:
我們透過下面的範例來分析PDO連線資料庫,


$dbms='mysql';     //資料庫類型oracle用ODI,對於開發者來說,使用不同的資料庫,只要改這個,不用記住那麼多的函數了
$host='localhost'; //資料庫主機名稱
$dbName='test' ;    //使用的資料庫
$user='root';      //資料庫連線使用者名稱
$pass='';          //對應的密碼
$dsn="$dbms:host=$host ;dbname=$dbName";
//

try {
    $dbh = new PDO($dsn, $user, $pass); //初始化一個PDO對象,就是建立了資料庫連結物件$dbh
    echo "連接成功
";
    /*你也可以進行一次搜尋操作

    foreach ($dbh->query('Select * from from FOO') as $row) {
        print_r($row); //你可以用echo($GLOBAL); 來看到這些值
    }
    */##cbh = null;
} catch (PDOException $e) {
    die ("Error!: " . $e->getMessage() . "
");
}
//##}
//預設這個不是長連接,如果需要資料庫長連接,需要最後加一個參數:array(PDO::ATTR_PERSISTENT => true) 變成這樣:
$db = new PDO($dsn, $user, $pass , array(PDO::ATTR_PERSISTENT => true));

?>


★資料庫查詢:
上面我們已經進行了一次查詢,我們還可以使用如下的查詢:
#$db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER); //設定屬性
$rs = $db->query("Select * FROM foo");
$rs-> ;setFetchMode(PDO::FETCH_ASSOC);
$result_arr = $rs->fetchAll();
print_r($result_arr);
?>


#以上因為用到setAttribute()方法,放上那兩個參數,把字段名強制轉換成大寫。以下列出多有PDO::setAttribute()的參數: PDO::ATTR_CASE: 強制列名變成一種格式,詳細如下(第二個參數):

PDO::CASE_LOWER: 強制列名是小寫.

PDO::CASE_NATURAL: 列名按照原始的方式

PDO::CASE_UPPER: 強制列名為大寫.

PDO::ATTR_ERRMODE: 錯誤提示.

PDO::ERRMODE_SILENT: 不顯示錯誤訊息,只顯示錯誤碼.

PDO::ERRMODE_WARNING: 顯示警告錯誤.

PDO::ERRMODE_EXCEPTION: 拋出異常.

PDO::ATTR_ORACLE_NULLS (不只是ORACLE有效,別的資料庫也有效): )指定資料庫傳回的NULL值在php中對應的數值。

PDO::NULL_NATURAL: 不變.

PDO::NULL_EMPTY_STRING: Empty string is converted to NULL.

#PDO::NULL_TO_STRING: NULL is converted to an empty string .

PDO::ATTR_STRINGIFY_FETCHES: Convert numeric values to strings when fetching. Requires bool.
##PDO::ATTR_STATEMENT_CLASS: Set user-supplied statement class derived from Pnotment. instances。 :MYSQL_ATTR_USE_BUFFERED_QUERY (available in MySQL): Use buffered queries.

範例中的$rs->setFetchMode(PDO::FETCH_ASSOC);是PDOStatement::setFetchMode(),對傳回類型的宣告。
有如下:
PDO::FETCH_ASSOC -- 關聯數組形式
PDO::FETCH_NUM   -- 數字索引數組形式
PDO::FETCH_BOTH  -- 兩者數組形式都有,這是缺失省的
PDO::FETCH_OBJ     -- 依照物件的形式,類似先前的mysql_fetch_object()

更多回傳類型宣告(PDOStatement::方法名稱)看手冊。

★插入,更新,刪除數據,

$db->exec("Delete FROM `xxxx_menu` where mid=43");


#簡單的總結一下上面的操作:

查詢操作主要是PDO::query()、PDO::exec()、PDO::prepare()。
PDO::query()主要用於有記錄結果回傳的操作,特別是Select操作,
PDO::exec()主要是針對沒有結果集合回傳的操作,例如Insert、Update、Delete等操作,它傳回的結果是當前操作影響的列數。
PDO::prepare()主要是預處理操作,需要透過$rs->execute()來執行預處理裡面的SQL語句,這個方法可以綁定參數,功能比較強大,不是本文能夠簡單說明白的,大家可以參考手冊和其他文件。

取得結果集運算主要是:PDOStatement::fetchColumn()、PDOStatement::fetch()、PDOStatement::fetchALL()。
PDOStatement::fetchColumn() 是取得結果指定第一筆記錄的某個字段,缺省是第一個字段。
PDOStatement::fetch() 是用來取得一筆記錄,
PDOStatement::fetchAll()是取得所有記錄集到一個中,取得結果可以透過PDOStatement::setFetchMode來設定需要結果集合的類型。

另外有兩個週邊的操作,一個是PDO::lastInsertId()和PDOStatement::rowCount()。 PDO::lastInsertId()是傳回上次插入操作,主鍵列類型是自增的最後的自增ID。
PDOStatement::rowCount()主要用於PDO::query()和PDO::prepare()進行Delete、Insert、Update操作影響的結果集,對PDO::exec()方法和Select運算無效。

相關推薦:


PDO方式連接mysql可以防注入的原因

ThinkPHP框架基於PDO方式連接資料庫操作範例

PHP中PDO事務處理操作範例#

以上是PHP5中 PDO類的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn