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(){}輸出錯誤資訊。(範例三)
範例結果:
1 | 2017-09-10 | 遊戲 | game_001 | 玩遊戲時的相容性問題參考解決法 (玩舊遊戲無法PLAY或執行修改器無作用) | game_001.html |
14 | 2017-09-12 | 網頁 | html_002 | 所架設的 php 網站無法開 https:// 的網址或有問題!& 電腦架站後本機連線測試正常,外網無法連線問題! | html_002.html |
15 | 2017-09-12 | 網頁 | html_003 | Apache + PHP + MySQL 所架設的 php 網站,更改網頁根目錄及首頁預設檔! | html_003.html |
13 | 2017-09-12 | 網頁 | html_001 | PHP 架站軟體 AppServ 懶人包:Apache + PHP + MySQL 相關介紹及說明 ^^ | html_001.html |
16 | 2017-09-13 | 網頁 | html_004 | 讓網頁製作表格 (table) 的表格框變細,表格單、雙數行底色不同 | html_004.html |
foreach($rs as $row){ }
,也可用迴圈方式來取得資料,如:while($row = $rs->fetch(PDO::FETCH_ASSOC)){ }
或do { } while($row = $rs->fetch(PDO::FETCH_NUM));
PDO::FETCH_ASSOC
可以用字串取出欄位資料如 $row['l_url']。PDO::FETCH_NUM
可以用索引取出欄位資料如 $row[0]。PDO::FETCH_BOTH
則字串、索引都可以。PDO::FETCH_OBJ
可以用物件表示法取出資料如 $row->room。PDO::FETCH_LAZY
則字串、索引、物件都可以。<?php
//例:設置返回列名稱的大小寫
$conn = new PDO($dsn, $user, $pass);
$conn -> setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL);
?>
※PHP Data Objects (PDO) 與 MySQL 資料庫相關應用,可參考笨兔其它隨手筆記:
※PHP 其它函數 MySQL 和 MySQLi 連接資料庫相關應用,可參考笨兔の隨手筆記: