4-2
PDO的資料庫連線
- 以下PDO的基本連線方式:
// 建立資料庫連接
$dsn = 'mysql:host=localhost;dbname=your_database;charset=utf8mb4';
$username = 'your_username';
$password = 'your_password';
try {
$pdo = new PDO($dsn, $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//連線成功後要做的事
} catch (PDOException $e) {
echo "資料庫連接錯誤:" . $e->getMessage();
}
最後會得到一個例化的 PDO 物件 $pdo
,接著我們就可以用這個物件做任何操作。
- 我們補上兩個設定
$pdo = new PDO($dsn, $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE , PDO::FETCH_ASSOC);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
PDO::ATTR_DEFAULT_FETCH_MODE
是指定的讀取後,存入陣列的模式,預定常數有
PDO::FETCH_ASSOC
— 關聯陣列形式,即要讀取 id 值要用 $news['id']
(最常用,我們指定為這個)
PDO::FETCH_NUM
— 數字索引陣列形式(一般會搭配 list()
使用),即要讀取 id 值要用 $news[0]
PDO::FETCH_BOTH
— 兩者陣列形式都有,這是預設值,即要讀取 id 值可用 $news['id']
或 $news[0]
PDO::FETCH_OBJ
— 按照物件的形式,即要讀取 id 值要用 $news->id
PDO::FETCH_LAZY
—以關聯陣列、數字索引陣列和物件3種形式返回結果 ,即要讀取 id 值可用 $news['id']
或 $news[0]
或 $news->id
- 另外,關於禁用 prepared statements 的模擬效果目的是加快效能,其緣由可至「PHP 騙你,PDO prepare 並沒有準備好」這篇文章了解詳情
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
- 至於
try...catch...
是PHP用來做異常處理用的,可搭配 throw new Exception("錯誤訊息");
來使用
- 由於 PDO 是物件,只要將實例化的 PDO 物件指向 NULL,即釋放資源
$pdo = NULL;
- 最後,為了移植方便,我們將一些設定獨立出來變成這樣(日後會比較好修改)
// 建立PDO連線
$dbname = 'blog';
$host='localhost';
$charset='utf8mb4';
$username = 'root';
$password = '1qazXSW@';
// 建立資料庫連接
$dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";
try {
$pdo = new PDO($dsn, $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
//連線成功後要做的事
} catch (PDOException $e) {
echo "資料庫連接錯誤:" . $e->getMessage();
}
$dsn
必須改成雙引號,不然變數會沒作用
$dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";