來源網址:http://www.xspace.idv.tw/bo_blog/read.php?204
PDO 連接資料的方式,都是統一化,且非常簡單及方便:
1.連接數據庫:
PDO提供了統一的接口:PDO 對象。
<?php
$db = new PDO(
"driver_name:dbname=db_name;host=hostname/IP;[charset=char_type]", // (A) 連接字符串
"db_username", // (B) db用戶名
"db_password" // (C) db密碼
);
?>
說明:PDO 有三個參數
(A) 連接字符串:
driver_name 是使用的 PDO 驅動,可以為:mysql, mssql, sybase, dblib, firebird, oci, odbc, pgsql, sqlite, sqlite2
db_name 是要連結的資料庫名稱;
hostname/IP 是指要連接到哪裡,如果是本地則為 localhost 或 127.0.0.1
[charset=char_type] 是可選的,用來設置字符類型。
(B) 連接資料庫的用戶名
(C) 連接資料庫的密碼
連接範例:
<?php
$db = new PDO(
"mysql:dbname=test;host=localhost;charset=utf-8",
"testuser",
"testpass"
);
echo "Successfully created a PDO object";
?>
<?php
"this_is_not_a_pdo_module:dbname=test;host=localhost",
"testuser",
"testpass"
);
echo "Successfully created a PDO object";
?>
而我們可以用一種優雅的方式來處理,即拋出 PDO 異常來處理錯誤
<?php
{
$db = new PDO(
"this_is_not_a_pdo_modul:dbname=test;host=localhost",
"testuser",
"testpass"
);
}
catch( PDOException $e )
{
die( $e->getMessage() );
}
echo "Successfully created a PDO object";
?>
could not find driver
或
SQLSTATE[HY000] [7] FATAL: database "pdo2" does not exist
• PDO::ERRMODE_WARNING 顯示警告錯
• PDO::ERRMODE_EXCEPTION 拋出異常
範例:
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
(包括 PDO::CASE_LOWER,PDO::CASE_NATURAL,PDO::CASE_UPPER ),來確定返回的字段名稱的大小寫。
(包括 PDO::NULL_NATURAL,PDO::NULL_EMPTY_STRING,PDO::NULL_TO_STRING )來指定數據庫返回的 NULL 值在 PHP 中對應的數值。
CREATE TABLE `test` (
`id` smallint(6) unsigned NOT NULL auto_increment,
`name ` varchar(100) NOT NULL default '',
PRIMARY KEY (`id`),
) ENGINE=MyISAM DEFAULT CHARSET=utf-8 AUTO_INCREMENT=1;
不使用預處理語句的方式:
$db = new PDO('mysql:dbname=test;host=localhost;charset=utf-8',testuser','testpass');
$stmt=$db->query("select * from test");
{
print_r( $row );
}
?>
1 - Bruce_Wu
Array
(
[id] => 1
[0] => 1
[name] => Bruce_Wu
[1] => Bruce_Wu
)
$db = new PDO('mysql:dbname=test;host=localhost;charset=utf-8',testuser','testpass');
$stmt = $db->prepare( "SELECT * FROM test" );
$stmt->execute();
print_r( $stmt->fetch() );
?>
$db = new PDO('mysql:dbname=test;host=localhost;charset=utf-8',testuser','testpass');
$stmt = $db->prepare( "SELECT * FROM test WHERE name = :name" );
$name = "Bruce_Wu";
$stmt->bindParam( ":name", $name );
$stmt->execute();
while( $row = $stmt->fetch() )
{
print_r( $row );
}
?>
這裡,bindParam 將 $name 變量綁定到了 :name 域,執行時會自動將改變量載入。
$stmt = $db->prepare(
"INSERT INTO test
( id, name )
VALUES
( :id, :name )"
);
array(
":id" => "2",
":name" => "david"
)
);
?>
實現插入數據資料也可以像綁定數據資料一樣來 quote 數據,這裡給出通過在 execute 中給定輸入參數來自動 quote
try {
$dbh->query("UPDATE ...");
$dbh->query("UPDATE ...");
$dbh->commit();
} catch (Exception $e) {
$dbh->rollBack();
}
$stmt = $dbh->prepare("CALL sp_set_string(?)");
$stmt->bindParam(1, $str);
$str = 'foo';
$stmt->execute();
?>
$stmt = $dbh->prepare("CALL sp_get_string(?)");
$stmt->bindParam(1, $ret,PDO:ARAM_STR, 4000);
if ($stmt->execute()) {
echo "Got $ret\n";
}
$stmt = $dbh->prepare("SELECT extension, name from CREDITS");
if ($stmt->execute()) {
$stmt->bindColumn('extension', $extension);
$stmt->bindColumn('name', $name);
while ($stmt->fetch(PDO::FETCH_BOUND)) {
echo "Extension: $extension\n";
echo "Author: $name\n";
}
}
?>
- Jan 31 Sun 2010 00:47
[PHP] PDO II
連接之前,應先確認已經加載了PDO 模塊,如果試圖處理一個無效的連接字符串時:
$db = new PDO(
如上 PHP 程式將會返回以下錯誤:
Fatal error: Uncaught exception 'PDOException' with message 'could not find driver'
代表找不到該 PDOthis_is_not_pdo_module 的 PDO 驅動程式
try
如上我們會得到如下的錯誤訊息
如果資料庫不存在則不同的錯誤會返回不同的提示信息。
2. 設置屬性
(A) PDO 有三種錯誤處理方式:
• PDO::ERRMODE_SILENT 不顯示錯誤信息,只設置錯誤碼
可通過以下語句來設置錯誤處理方式為拋出異常
$db->setAttribute(PDO::ATTR_ERRMODE, );
當設置為 PDO::ERRMODE_SILENT 時可以通過調用 errorCode() 或 errorInfo() 來獲得錯誤信息,當然其他情
況下也可以。
(B) 因為不同數據庫對返回的字段名稱大小寫處理不同,所以 PDO 提供了 PDO::ATTR_CASE 設置項
(C) 通過設置 PDO::ATTR_ORACLE_NULLS 類型
3. 查詢資料
為了說明清楚,我們這裡定義了一個 test 資料表
<?php
while($f=$stmt->fetch()){
echo $f["id"] . " - ";
echo $f["name"] ." <br>";
};
/*使用foreach 獲取數據 */
foreach( $db->query( "SELECT * FROM test" ) as $row )
會得到以下結果:
使用預處理語句的方式:
<?php
這裡的,$stmt 是一個 PDOStatement 對象,預處理之後會得到這樣一個對象,必須 execute 後才會起作用。
fetch 函數只提取了一行數據資料,如果需要讀取全部數據,可換成 fetchAll 函數。
綁定數據,條件是查詢
<?php
4.插入數據資料
<?php
$stmt->execute(
的方法。
事務處理
$dbh->beginTransaction();
如果數據庫支持事務處理,調用 beginTransaction 的同時將數據庫設置為非自動提交,commit 或 rollBack
返回自動提交狀態。
5. 存儲過程
<?php
和先前的例子差不多,只是這裡使用了「?」數據綁定方法,sp_set_string 是存儲過程名稱。
帶有輸出參數的存儲過程
<?
綁定列輸出
<?
全站熱搜
留言列表