請用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());
}
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
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
try...catch...
是PHP用來做異常處理用的,可搭配 throw new Exception("錯誤訊息");
來使用