5-1
建立資料庫連線
- 先請AI幫忙建立的方式:
請用PHP8的pdo方式,來建立MySQL8的連線,並做成函數,可以傳入相關設定值
- 最後得到
<?php
function createDatabaseConnection(
string $host,
string $db,
string $user,
string $pass,
string $charset = 'utf8mb4',
array $options = []
): PDO {
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$defaultOptions = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
// 合併默認選項和用戶提供的選項
$finalOptions = array_merge($defaultOptions, $options);
try {
$pdo = new PDO($dsn, $user, $pass, $finalOptions);
return $pdo;
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
}
// 使用示例
try {
$host = 'localhost';
$db = 'your_database_name';
$user = 'your_username';
$pass = 'your_password';
$pdo = createDatabaseConnection($host, $db, $user, $pass);
echo "成功連接到數據庫";
// 如果需要自定義選項或字符集
// $pdo = createDatabaseConnection($host, $db, $user, $pass, 'utf8mb4', [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"]);
} catch (\PDOException $e) {
die("無法連接到數據庫: " . $e->getMessage());
}
- 我們先將
createDatabaseConnection() 存到 function.php 的最後
- 然後將以下語法放到
header.php 中
<?php
require 'function.php';
require 'vendor/autoload.php';
use Smarty\Smarty;
$smarty = new Smarty();
try {
$host = 'localhost';
$db = 'school';
$user = 'root';
$pass = '2130669#33';
$pdo = createDatabaseConnection($host, $db, $user, $pass);
// echo "成功連接到數據庫";
// 如果需要自定義選項或字符集
// $pdo = createDatabaseConnection($host, $db, $user, $pass, 'utf8mb4', [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"]);
} catch (\PDOException $e) {
die("無法連接到數據庫: " . $e->getMessage());
}
- 如此,以後讀取每個php檔時就會先連好資料庫。
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("錯誤訊息"); 來使用