PDO全名PHP Data Object,它是使用類似mysqli物件導向資料庫存取方式來撰寫資料庫程式,不過mysqli只支援MySQL資料庫系統,PDO能夠支援超過十種伺服器,也就是我們可以寫出相同PDO來存取不同的資料庫系統。
XAMPP需啟用PDO,步驟如下:
Apache> Config> php.ini
將前面的分號刪除
重新啟動apache設定值即生效。
程式碼範例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>PDO.php</title>
</head>
<body>
<?php
$dsn = "mysql:dbname=test;host=localhost;port=3306";
$username = "root";
$password = "1234";
try {
// 建立MySQL伺服器連接和開啟資料庫
$link = new PDO($dsn, $username, $password);
// 指定PDO錯誤模式和錯誤處理
$link->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
echo "成功建立MySQL伺服器連接和開啟test資料庫";
} catch (PDOException $e) {
echo "連接失敗: " . $e->getMessage();
}
$link = null;
?>
</body>
</html>
程式碼範例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>PDO_query.php</title>
</head>
<body>
<?php
$dsn = "mysql:dbname=test;host=localhost;port=3306";
$username = "root";
$password = "1234";
try {
// 建立MySQL伺服器連接和開啟資料庫
$link = new PDO($dsn, $username, $password);
// 指定PDO錯誤模式和錯誤處理
$link->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
$sql = "SELECT * FROM account";
echo "SQL查詢字串: $sql <br/>";
// 送出UTF8編碼的MySQL指令
$link->query('SET NAMES utf8');
// 送出查詢的SQL指令
if ( $result = $link->query($sql) ) {
echo "<br/><b>帳戶資料:</b><hr/>"; // 顯示查詢結果
// 取得記錄數
$total_records = $result->rowCount();
echo "資料筆數: $total_records 筆<br/>";
while( $row = $result->fetch(PDO::FETCH_ASSOC) ){
echo $row["name"]."<br/>";
}
}
} catch (PDOException $e) {
echo "連接失敗: " . $e->getMessage();
}
$link = null;
?>
</body>
</html>
此程式碼會查詢account資料表,並逐一將帳戶名稱列出來。
為了避免sql injection等攻擊,通常會使用參數化的方式來寫SQL指令。
程式法範例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>PDO_ps.php</title>
</head>
<body>
<?php
$dsn = "mysql:dbname=test;host=localhost;port=3306";
$username = "root";
$password = "1234";
try {
// 建立MySQL伺服器連接和開啟資料庫
$link = new PDO($dsn, $username, $password);
// 指定PDO錯誤模式和錯誤處理
$link->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
$sql = "SELECT * FROM account WHERE name =?";
echo "SQL查詢字串: $sql <br/><br/>";
// 送出UTF8編碼的MySQL指令
$link->query('SET NAMES utf8');
$account = $link->prepare($sql); // 準備SQL指令字串
$account->execute(array("1234")); // 執行SQL指令字串
// 送出查詢的SQL指令
if ( $result = $account->fetchAll(PDO::FETCH_ASSOC) ) {
echo "<b>帳戶資料(name = \"1234\"):</b><br/>"; // 顯示查詢結果
// 取得記錄數
$total_records = $account->rowCount();
echo "資料筆數: $total_records 筆<br/>";
foreach( $result as $row ){
echo $row["name"]."<br/>";
}
}
} catch (PDOException $e) {
echo "連接失敗: " . $e->getMessage();
}
$link = null;
?>
</body>
</html>