出處:http://www.phpchina.cn/bbs/viewthread.php?tid=1574&fpage=1&highlight=%2bmzt
php 5.1 發布時附帶乙個全新的
資料庫連線層,即 php data objects (
pdo)。它與adodb和pear db等
資料庫抽象層不同,它提供的是如何訪問資料庫和處理查詢結果,效率也更高,還可以通過預處理語句來防止sql注入。
目前支援的資料庫有:
1. 連線資料庫
通常我們連線資料庫使用的是不同的連線函式(如:mysql_connect,pg_connect),pdo提供了統一的介面:pdo物件。
<?php
$db = new pdo(
"pgsql:dbname=pdo;host=localhost",
"postgres8",
"postgres8" );
echo "successfully created a pdo object";
?>
就像你看到的,pdo有三個引數,
• 連線字串
pgsql 是使用的pdo驅動,可以為:mysql, mssql, sybase, dblib, firebird, oci, odbc, pgsql, sqlite, sqlite2;
dbname 是資料庫名稱,這裡假設有乙個名為pdo的測試資料庫;
host 是指要連線到**,如果是本地則為localhost。
• 使用者名稱
• 密碼
做這一步之前,請先確認已經載入了pdo模組。如果我們試圖處理乙個無效的連線字串:
<?php
$db = new pdo(
"this_is_not_a_pdo_module:dbname=pdo;host=localhost",
"foo",
"bar" );
echo "successfully created a pdo object";
?>
php將會返回以下錯誤:
fatal error: uncaught exception 'pdoexception' with message 'could not find driver'
所以,我們可以用一種優雅的方式來處理,即丟擲pdo異常來處理錯誤(但並不是所有情況都是)。
<?php
try
catch( pdoexception $e )
echo "successfully created a pdo object";
?>
我們會得到
could not find driver 或
sqlstate[hy000] [7] fatal: database "pdo2" does not exist
如果資料庫不存在(不同的錯誤會返回不同的提示資訊)。
2. 設定屬性
1) pdo有三種錯誤處理方式:
• pdo::errmode_silent不顯示錯誤資訊,只設定錯誤碼
• pdo::errmode_warning顯示警告錯
• pdo::errmode_exception丟擲異常
可通過以下語句來設定錯誤處理方式為丟擲異常
$db->setattribute(pdo::attr_errmode, pdo::errmode_exception );
當設定為pdo::errmode_silent時可以通過呼叫errorcode() 或errorinfo()來獲得錯誤資訊,當然其他情況下也可以。
2) 因為不同資料庫對返回的欄位名稱大小寫處理不同,所以pdo提供了pdo::attr_case設定項(包括pdo::case_lower,pdo::case_natural,pdo::case_upper),來確定返回的欄位名稱的大小寫。
3) 通過設定pdo::attr_oracle_nulls
型別(包括pdo::null_natural,pdo::null_empty_string,pdo::null_to_string)來指定資料庫返回的null值在php中對應的數值。
3. 查詢
為了說明清楚,我們這裡定義了乙個
rss feeds表
id integer
name character varying(100)
url varharacter varying(255)
feed character varying(255)
不使用預處理語句的方式:
<?php
foreach( $db->query( "select * from feeds" ) as $row )
?>
得到以下結果:
(只顯示已行為了節省空間)
使用預處理語句的方式:
<?php
$stmt = $db->prepare( "select * from feeds" );
$stmt->execute();
print_r( $stmt->fetch() );
?>
這裡,$stmt是乙個pdostatement物件,預處理之後會得到這樣乙個物件,必須execute後才起作用。fetch函式只提取了一行資料,如果需要讀取全部資料,可換成fetchall函式。
繫結資料
這裡,bindparam將$url
變數繫結到了:url域,執行時會自動將改變量載入。
插入資料
實現插入資料也可以像繫結資料一樣來quote資料,這裡給出通過在execute中給定輸入引數來自動quote的方法。
事務處理
$dbh->begintransaction();
try catch (exception $e)
如果資料庫支援事務處理,呼叫begintransaction的同時將資料庫設定為非自動提交,commit或rollback返回自動提交狀態。
4. 儲存過程
$stmt = $dbh->prepare("call sp_set_string(?)");
$stmt->bindparam(1, $str);
$str = 『foo』;
$stmt->execute();
於先前的例子差不多,只是這裡使用了「?」資料繫結方法,sp_set_string是儲存過程名稱。
帶有輸出引數的儲存過程
$stmt = $dbh->prepare("call sp_get_string(?)");
$stmt->bindparam(1, $ret,pdo::param_str, 4000);
if ($stmt->execute())
繫結列輸出
$stmt = $dbh->prepare("select extension, name from credits");
if ($stmt->execute()) }
PDO 簡介 介紹和安裝
自 介紹 pdo擴充套件為php訪問資料庫定義了乙個輕量級的 一致性的介面,它提供了乙個資料訪問抽象層,這樣,無論你使用什麼資料庫,你都可以通過一致的函式執行查詢和獲取資料。注意,你並不能使用pdo擴充套件本身執行任何資料庫操作,你必須使用乙個database specific pdo driver...
PDO初步使用
如何檢視是否開啟 第一種 通過引數形式來連線資料庫 trycatch pdoexception err 第二種 通過uri連線資料庫 trycatch pdoexception err 第三種 通過配置檔案來連線資料庫 trycatch pdoexception err 推薦使用第一種,比較好用 方...
PDO 簡介 PDO中的三個類及其方法
一 pdo 代表乙個php和資料庫之間的連線。方法 pdo 構造器,構建乙個新的pdo物件 begintransaction 開始事務 commit 提交事務 errorcode 從資料庫返回乙個錯誤代號,如果有的話 errorinfo 從資料庫返回乙個含有錯誤資訊的陣列,如果有的話 exec 執行...