PHP Data Objects (PDO) 讀取資料庫 (MySQL、MS SQL Server、PostgreSQL、SQLite..) 使用概要說明
PHP Data Objects (PDO) 簡介PDO 為物件導向的設計,增強安全性,節省更多的時間,語法通用於各種資料庫。基本上只要 PHP 5.5 以上版本就有內建 PDO 了。功能大致如下:
倘若連結 PDO 出現錯誤訊息 Uncaught PDOException: could not find driver,找尋您安裝 php 網站資料夾內的 php.ini 檔案,並用文書編輯軟體 (如記事本或 Notepad++) 開啟。找到以下資料列,把前面的 ; 去掉,存檔後重啟 apache 即可!(有 ; 是不執行該行之意)
;extension=php_pdo_mysql.dll
上列是連結 MySQL 資料庫。若您是連結 pgSQL,則要找 ;extension=php_pdo_pgsql.dll。倘若不知道,那就把有 ;php_pdo_XXXXX.dll 字樣的 ; 全拿掉唄!
php 用 PDO 連接 MySQL 資料庫初接觸PDO,此篇是給自己參考記錄的,若有需者就參考唄!以連接笨兔網站的 MySQL 資料庫,取得【學習分享】的資料來做展示,範例設定的 MySQL 相關名稱如下。若不知這些名稱所在,可參考笨兔另一篇隨手筆記【db_001】phpMyAdmin & MySQL 資料庫和資料表的建立、修改、刪除和備份 使用簡介。
範例程式碼:主要看紅色字部份
<?php// (範例一) 連結資料庫語法
// $dsn = "資料庫形態:host=伺服器名稱;dbname=資料庫名稱;charset=編碼";
// $conn = new PDO($dsn, '帳號', '密碼');
// 此用 mysql 資料庫,若是用其他如 MS SQL,則把 mysql 改成 mssql 即可!
$dsn = "mysql:host=localhost;dbname=pcgame;charset=utf8";
$conn = new PDO($dsn, 'root', '12345678');// 查詢結果:最簡單的 Query 指令
// $rs = $conn->query('SQL資料表條件');
$sql = "select * from learn limit 5"; //SQL資料表條件,笨兔只顯示5筆做展示,所以設limit 5
$rs = $conn->query($sql);$total = $rs -> rowCount(); //計算筆數寫法
// 連結資料庫偵錯(建議用範例三 try...catch 方式)
//foreach 獲取資料放入表格顯示資料
// 若有錯誤會顯示 Array ([0] =>SQLSTATE error code,00000就是正常 [1] =>所用的Driver所傳回的錯誤碼 [2] =>所用的Driver傳回的錯誤訊息)
if ($rs->errorCode()!=00000){
echo "有錯誤訊息如下!";
print_r($rs->errorInfo());
}
echo '<table>';
echo '筆數 = '.$total;
foreach($rs as $row){
echo '<tr>';
echo '<td>'.$row[0].'</td>';
echo '<td>'.$row[1].'</td>';
echo '<td>'.$row[2].'</td>';
echo '<td>'.$row['l_number'].'</td>';
echo '<td>'.$row['l_description'].'</td>';
echo '<td>'.$row['l_url'].'</td>';
echo '</tr>';
}
echo '</table>';
?>
<?php// (範例二) 另一種寫法:prepare 指令,避免 sql injection,安全性較高。若要更細部就查查 prepare 指令唄!
echo '<table>';
$dsn = "mysql:host=localhost;dbname=pcgame;charset=utf8";
$conn = new PDO($dsn, 'root', '12345678');
$sql = "select * from learn limit 5";
$rs = $conn->prepare($sql);
$rs->execute();
foreach($rs as $row){
echo '<tr>';
echo '<td>'.$row[0].'</td>';
echo '<td>'.$row[1].'</td>';
echo '<td>'.$row[2].'</td>';
echo '<td>'.$row['l_number'].'</td>';
echo '<td>'.$row['l_description'].'</td>';
echo '<td>'.$row['l_url'].'</td>';
echo '</tr>';
}
echo '</table>';
?>
<?php// (範例三) 用 try...catch 來對資料庫連線偵錯!
echo '<table>';
try{
$dsn = "mysql:host=localhost;dbname=pcgame;charset=utf8";
$conn = new PDO($dsn, 'root', '12345678');
//發生錯誤出現錯誤提醒
$conn -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
//發生錯誤結束資料庫連線並顯示錯誤訊息
die($e -> getMessage());
}
$sql = "select * from learn limit 5";
$rs = $conn->prepare($sql);
$rs->execute();
foreach($rs as $row){
echo '<tr>';
echo '<td>'.$row[0].'</td>';
echo '<td>'.$row[1].'</td>';
echo '<td>'.$row[2].'</td>';
echo '<td>'.$row['l_number'].'</td>';
echo '<td>'.$row['l_description'].'</td>';
echo '<td>'.$row['l_url'].'</td>';
echo '</tr>';
}
echo '</table>';
?>異常處理說明:
PHP:預設為直接報錯。
MYSQL:預設為靜默模式,錯就錯,不報錯。
PDO:預設為靜默模式,錯就錯,不報錯。
以前 PHP 碰到錯誤的時候,會直接報錯,錯誤處理會變得相當麻煩。後來,當錯誤發生之後,會將錯誤資訊不再直接輸出,放到一個類的物件裡(PDOException)。
PDO 異常處理設定:PDO::ATTR_ERRMODE ,有以下三個值:
PDO::ERRMODE_SILENT: 預設模式,不主動報錯,需要主動以 $pdo->errorInfo()的形式獲取錯誤資訊。(範例一)
PDO::ERRMODE_WARNING: 引發 E_WARNING 錯誤,主動報錯
PDO::ERRMODE_EXCEPTION: 主動丟擲 exceptions 異常,需要以try{}cath(){}輸出錯誤資訊。(範例三)
範例結果:
SQLSTATE[08004] [1040] Too many connections