現代 PDO 連接方式
<?php
$dsn = 'mysql:host=localhost;charset=utf8mb4';
$user = 'root';
$pass = 'password';
try {
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
]);
echo "連接 MySQL 伺服器成功!";
} catch (PDOException $e) {
die("連接失敗: " . $e->getMessage());
}
?>
建立資料庫
<?php
// 方法 1:PDO exec(無結果集的 SQL)
$pdo->exec("CREATE DATABASE IF NOT EXISTS `webjx` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
echo "資料庫 webjx 建立成功或已存在。";
// 方法 2:指定資料庫連接後建立另一個
$pdo2 = new PDO('mysql:host=localhost;dbname=webjx;charset=utf8mb4', $user, $pass, $options);
$pdo2->exec("CREATE DATABASE IF NOT EXISTS `other_webjx` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
echo "資料庫 other_webjx 建立成功。";
?>
建立資料表
<?php
$pdo = new PDO('mysql:host=localhost;dbname=webjx;charset=utf8mb4', $user, $pass, $options);
$sql = <<exec($sql);
echo "資料表 webjx_table 建立成功。";
?>
完整範例:連接 → 建庫 → 選庫 → 建表
<?php
$host = 'localhost';
$user = 'root';
$pass = 'password';
$charset = 'utf8mb4';
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
// 1. 連接伺服器(未指定資料庫)
$pdo = new PDO("mysql:host=$host;charset=$charset", $user, $pass, $options);
// 2. 建立資料庫
$dbname = 'myapp';
$pdo->exec("CREATE DATABASE IF NOT EXISTS `$dbname` CHARACTER SET $charset COLLATE ${charset}_unicode_ci");
echo "資料庫 $dbname 就緒。\n";
// 3. 切換至該資料庫
$pdo->exec("USE `$dbname`");
// 4. 建立資料表
$tables = [
'users' => << << $sql) {
$pdo->exec($sql);
echo "資料表 $name 建立完成。\n";
}
echo "所有初始化完成!";
} catch (PDOException $e) {
error_log("初始化失敗: " . $e->getMessage());
die("系統錯誤,請稍後再試。");
}
?>
重要提醒
- 字符集統一使用 utf8mb4:支援完整 Unicode(含 Emoji),
utf8 是舊版別名,僅支援 BMP 平面
- 儲存引擎指定 InnoDB:支援事務、外鍵、行級鎖定,MyISAM 已不推薦
- 識別符號使用反引號:
\`table\`、\`column\` 避免保留字衝突
- 錯誤模式設為異常:
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 讓錯誤可被 try-catch 捕捉
- 關閉模擬預處理:
PDO::ATTR_EMULATE_PREPARES => false 使用真正的預處理語句,更安全