來源網址: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";
?>


連接之前,應先確認已經加載了PDO 模塊,如果試圖處理一個無效的連接字符串時:
<?php
$db = new PDO(
"this_is_not_a_pdo_module:dbname=test;host=localhost", 
"testuser", 
"testpass"
);
echo "Successfully created a PDO object";
?>


如上 PHP 程式將會返回以下錯誤:
Fatal error: Uncaught exception 'PDOException' with message 'could not find driver'

代表找不到該 PDOthis_is_not_pdo_module  的 PDO 驅動程式

而我們可以用一種優雅的方式來處理,即拋出 PDO 異常來處理錯誤
<?php
try
{
$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
如果資料庫不存在則不同的錯誤會返回不同的提示信息。


2. 設置屬性
(A) PDO 有三種錯誤處理方式:
• PDO::ERRMODE_SILENT         不顯示錯誤信息,只設置錯誤碼
• PDO::ERRMODE_WARNING     顯示警告錯
• PDO::ERRMODE_EXCEPTION  拋出異常

可通過以下語句來設置錯誤處理方式為拋出異常
$db->setAttribute(PDO::ATTR_ERRMODE, );

範例:
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
當設置為 PDO::ERRMODE_SILENT 時可以通過調用 errorCode()  errorInfo() 來獲得錯誤信息,當然其他情
況下也可以。

(B) 因為不同數據庫對返回的字段名稱大小寫處理不同,所以 PDO 提供了 PDO::ATTR_CASE 設置項
     (包括 PDO::CASE_LOWERPDO::CASE_NATURALPDO::CASE_UPPER ),來確定返回的字段名稱的大小寫。
(C) 通過設置 PDO::ATTR_ORACLE_NULLS 類型
    (包括 PDO::NULL_NATURALPDO::NULL_EMPTY_STRINGPDO::NULL_TO_STRING )來指定數據庫返回的 NULL 值在 PHP 中對應的數值。

3. 查詢資料
為了說明清楚,我們這裡定義了一個 test 資料表
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;

不使用預處理語句的方式:
<?php
$db = new PDO('mysql:dbname=test;host=localhost;charset=utf-8',testuser','testpass');
$stmt=$db->query("select * from test");
while($f=$stmt->fetch()){
     echo $f["id"] . " - ";
     echo $f["name"] ." <br>";
};

/*使用foreach 獲取數據 */
foreach( $db->query( "SELECT * FROM test" ) as $row )
{
print_r( $row );
}

?>


會得到以下結果:
1 - Bruce_Wu
Array
(
    [id] => 1
    [0] => 1
    [name] => Bruce_Wu
    [1] => Bruce_Wu
)
使用預處理語句的方式:
<?php
$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() );
?>
這裡的,$stmt 是一個 PDOStatement 對象,預處理之後會得到這樣一個對象,必須 execute 後才會起作用。
fetch 函數只提取了一行數據資料,如果需要讀取全部數據,可換成 fetchAll 函數。

綁定數據,條件是查詢
<?php
$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 域,執行時會自動將改變量載入。


4.插入數據資料
<?php
$stmt = $db->prepare( 
"INSERT INTO test
( id, name )
VALUES
( :id, :name )"
);

$stmt->execute(
array( 
":id" => "2",
":name" => "david"
)
);
?>

實現插入數據資料也可以像綁定數據資料一樣來 quote 數據,這裡給出通過在 execute 中給定輸入參數來自動 quote
的方法。

事務處理
$dbh->beginTransaction();
try {
$dbh->query("UPDATE ...");
$dbh->query("UPDATE ...");
$dbh->commit();
} catch (Exception $e) {
$dbh->rollBack();
}
如果數據庫支持事務處理,調用 beginTransaction 的同時將數據庫設置為非自動提交,commit  rollBack
返回自動提交狀態。

5. 存儲過程
<?php
$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: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";
 }
}
?>

arrow
arrow
    全站熱搜

    James Wu 發表在 痞客邦 留言(1) 人氣()