PDO簡介
PDO 是一個“資料庫訪問抽象層”,作用是統一各種資料庫(MySQL、MSSQL、Oracle、DB2、PostgreSQL……)的提供者,能輕鬆的在不同的資料庫之間完成切換,使得資料庫間的移植容易實現。
PDO 驅動
| 支援PDO 的驅動及相應的資料庫列表 |
| 驅動名 |
對應訪問的資料庫 |
| PDO_DBLIB |
FreeTDS / Microsoft SQL Server / Sybase |
| PDO_FIREBIRD |
Firebird / Interbase 6 |
| PDO_MYSQL |
MySQL |
| PDO_OCI |
Oracle |
| PDO_ODBC |
ODBC v3 |
| PDO_PGSQL |
PostgreSQL |
| PDO_SQLITE |
SQLite |
PDO安裝
PDO 是 PHP 5.1 發行的,也就是說,在 5.1 之前的版本是不支援 PDO 的,PDO 也是未來 PHP 處理資料庫的首選和趨勢。
下面介紹 PDO 的安裝:
1、Linux 環境
在 Linux 環境中下為啟用對 MySQL 的 PDO 程式驅動支援,需要在安裝 PHP (5.1以上版本)的原始碼包時,向 configure 命令中添加:
--with-pdo-mysql=/usr/local/mysql // "/usr/local/mysql"為 MySQL 伺服器的安裝目錄
--with-pdo-mysql=/usr/local/mysql // "/usr/local/mysql"為 MySQL 伺服器的安裝目錄
2、Windows 環境
修改 php.ini 檔案,找到如下,把前面的“;”(分號:代表注釋)去掉即可!
;extension=php_pdo.dll // 所有 PDO 驅動共用的擴充,這個必須有
;extension=php_pdo_mysql.dll // 使用 MySQL 使用這行
;extension=php_pdo_mssql.dll // 使用 MSSQL 使用這行
;extension=php_pdo.dll // 所有 PDO 驅動共用的擴充,這個必須有
;extension=php_pdo_mysql.dll // 使用 MySQL 使用這行
;extension=php_pdo_mssql.dll // 使用 MSSQL 使用這行
儲存 php.ini 檔案,重啟 Apache 伺服器,查看 phpinfo() 函數,出現說明安裝成功。
注意:Windows 環境中,有時可能配置不成功,出現不了的現象。這時,把 PHP 安裝擴充中的 php_pdo_mysql.dll、php_pdo.dll……等檔案拷貝到系統安裝路徑的 Windows 下。
建立 PDO 對象
PDO 的構造方法原型如下:
__construct(string dsn [,string db_user [,string db_pwd [,array driver_options]]])
__construct(string dsn [,string db_user [,string db_pwd [,array driver_options]]])參數說明:
1、dsn(data source name):資料來源名稱,定義用到的資料庫和驅動;
a、串連 MySQL 資料庫的DSN:mysql:host=localhost;dbname=test // 主機名稱為:localhost;資料庫名稱為:test
b、串連 Oracle 資料庫的DSN:oci:dbname=//localhost:1521/test // 主機名稱為:localhost;連接埠:1521;資料庫名稱為:test
……更多的 DSN 請參考 PHP 手冊
2、db_user:資料庫使用者名稱;
3、db_pwd:資料庫密碼;
4、driver_options:是一個數組,用來指定串連所需的所有額外選項
PDO 用來指定串連所需的所有額外選項
| 選項名 |
描述 |
| PDO::ATTR_AUTOCOMMIT |
確定PDO 是否關閉自動認可功能,設定FALSE 為關閉 |
| PDO::ATTR_CASE |
強制PDO 擷取的表欄位字元的大小寫轉換,或原樣使用列資訊 |
| PDO::ATTR_ERRMODE |
設定錯誤處理的模式 |
| PDO::ATTR_PERSISTENT |
確定串連是否為持久串連,預設為FALSE,不持久串連 |
| PDO::ATTR_ORACLE_NULLS |
將返回的Null 字元串轉換為SQL 的NULL |
| PDO::ATTR_PREFETCH |
設定應用程式提前擷取的資料大小,以K 位元組為單位 |
| PDO::ATTR_TIMEOUT |
設定逾時之前的等待時間(秒為單位) |
| PDO::ATTR_SERVER_INFO |
包含與資料庫特有的伺服器資訊 |
| PDO::ATTR_SERVER_VERSION |
包含與資料庫伺服器版本號碼有關的資訊 |
| PDO::ATTR_CLIENT_VERSION |
包含與資料庫用戶端版本號碼有關的資訊 |
| PDO::ATTR_CONNECTION_STATUS |
設定逾時之前的等待時間(秒為單位) |
調用 PDO 構造方法(串連資料庫)
try {
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '1715544', array(PDO::ATTR_PERSISTENT=>true));
} catch (PDOException $e) {
exit('資料庫連接失敗,錯誤資訊:'. $e->getMessage());
}
?>
try {
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '1715544', array(PDO::ATTR_PERSISTENT=>true));
} catch (PDOException $e) {
exit('資料庫連接失敗,錯誤資訊:'. $e->getMessage());
}
?>
PDO 對象的成員方法
PDO對象中的成員方法
| 方法名 |
描述 |
| getAttribute() |
擷取一個“資料庫連接對象”的屬性 |
| setAttribute() |
為一個“資料庫連接對象”設定屬性 |
| errorCode() |
擷取錯誤碼 |
| errorInfo() |
擷取錯誤資訊 |
| exec() |
處理一條SQL 陳述式,並返回所影響的行數 |
| query() |
處理一條SQL 陳述式,並返回一個"PDOStatement" 對象 |
| quote() |
為某個SQL 中的字串添加引號 |
| lastInsertId() |
擷取插入到表中的最後一條資料的主索引值 |
| prepare() |
負責準備執行的SQL 陳述式 |
| getAvailableDrivers() |
擷取有效PDO 磁碟機名稱 |
| beginTransaction() |
開始一個事務,標明復原起始點 |
| commit() |
提交一個事務,並執行SQL |
| rollback() |
復原一個事務 |
使用 PDO 執行 SQL 陳述式
1、使用 PDO::exec() 方法
PDO::exec() 方法多用在 SQL 中的 INSERT、UPDATE、DELETE,返回的為受影響的行數
date_default_timezone_set('PRC');
header('Content-Type:text/html;Charset=utf-8');
try {
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '1715544');
$pdo->setAttribute(PDO::ATTR_PERSISTENT, true); // 設定資料庫連接為持久串連
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 設定拋出錯誤
$pdo->setAttribute(PDO::ATTR_ORACLE_NULLS, true); // 設定當字串為空白轉換為 SQL 的 NULL
$pdo->query('SET NAMES utf8'); // 設定資料庫編碼
} catch (PDOException $e) {
exit('資料庫連接錯誤,錯誤資訊:'. $e->getMessage());
}
$addTime = date('Y-m-d H:i:s', time());
$sql = "INSERT INTO think_user(userName,email,age,addTime) VALUES ('酒井法子','jiujinfazi@sina.com.cn','28','{$addTime}')";
$row = $pdo->exec($sql);
if ($row) {
echo '添加成功';
} else {
echo '添加失敗';
}
?>
date_default_timezone_set('PRC');
header('Content-Type:text/html;Charset=utf-8');
try {
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '1715544');
$pdo->setAttribute(PDO::ATTR_PERSISTENT, true); // 設定資料庫連接為持久串連
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 設定拋出錯誤
$pdo->setAttribute(PDO::ATTR_ORACLE_NULLS, true); // 設定當字串為空白轉換為 SQL 的 NULL
$pdo->query('SET NAMES utf8'); // 設定資料庫編碼
} catch (PDOException $e) {
exit('資料庫連接錯誤,錯誤資訊:'. $e->getMessage());
}
$addTime = date('Y-m-d H:i:s', time());
$sql = "INSERT INTO think_user(userName,email,age,addTime) VALUES ('酒井法子','jiujinfazi@sina.com.cn','28','{$addTime}')";
$row = $pdo->exec($sql);
if ($row) {
echo '添加成功';
} else {
echo '添加失敗';
}
?>
2、使用 PDO::query() 方法
PDO::query() 方法用在 SQL 中的 SELECT 查詢上。如果該方法執行成功,那麼將返回一個 PDOStatement 對象,使用 rowCount() 方法可以返回影響的行數
header('Content-Type:text/html;Charset=utf-8');
try {
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '1715544');
$pdo->setAttribute(PDO::ATTR_PERSISTENT, true); // 設定資料庫連接為持久串連
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 設定拋出錯誤
$pdo->setAttribute(PDO::ATTR_ORACLE_NULLS, true); // 設定當字串為空白轉換為 SQL 的 NULL
$pdo->query('SET NAMES utf8'); // 設定資料庫編碼
} catch (PDOException $e) {
exit('資料庫連接錯誤,錯誤資訊:'. $e->getMessage());
}
$sql = "SELECT userName,email,age,addTime FROM think_user";
try {
$result = $pdo->query($sql);
foreach ($result as $row) {
echo $row['userName'] . "\t" . $row['email'] . "\t" .$row['age'] . "\t" .$row['addTime'] . '
';
}
echo '總共'. $result->rowCount() .'條';
} catch (PDOException $e) {
exit($e->getMessage());
}
?>
header('Content-Type:text/html;Charset=utf-8');
try {
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '1715544');
$pdo->setAttribute(PDO::ATTR_PERSISTENT, true); // 設定資料庫連接為持久串連
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 設定拋出錯誤
$pdo->setAttribute(PDO::ATTR_ORACLE_NULLS, true); // 設定當字串為空白轉換為 SQL 的 NULL
$pdo->query('SET NAMES utf8'); // 設定資料庫編碼
} catch (PDOException $e) {
exit('資料庫連接錯誤,錯誤資訊:'. $e->getMessage());
}
$sql = "SELECT userName,email,age,addTime FROM think_user";
try {
$result = $pdo->query($sql);
foreach ($result as $row) {
echo $row['userName'] . "\t" . $row['email'] . "\t" .$row['age'] . "\t" .$row['addTime'] . '
';
}
echo '總共'. $result->rowCount() .'條';
} catch (PDOException $e) {
exit($e->getMessage());
}
?>
PDO 對預先處理語句的支援
摘自 Lee.的專欄
http://www.bkjia.com/PHPjc/478465.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/478465.htmlTechArticlePDO簡介 PDO 是一個資料庫訪問抽象層,作用是統一各種資料庫(MySQL、MSSQL、Oracle、DB2、PostgreSQL)的提供者,能輕鬆的在不同的資料庫之間...