現代 PHP (7.0+) 已移除 mysql_* 系列函數,請使用 mysqli 或 PDO_MySQL。
php.ini,啟用擴展:extension=mysqli
extension=pdo_mysql
libmysql.dll (PHP 7) 或 mysqlnd (PHP 8+ 內建) 可用。sudo systemctl restart php8.2-fpm 或重啟 XAMPP。php -m | grep mysql 應顯示 mysqli、pdo_mysql、mysqlnd。sudo apt update && sudo apt install php-mysql php-pdo-mysql
sudo systemctl restart php8.2-fpm
<?php
return [
'host' => '127.0.0.1',
'port' => 3306,
'user' => 'app_user',
'pass' => 'strong_password',
'name' => 'my_app',
'charset' => 'utf8mb4',
'options' => [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false, // 真正預處理
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci",
],
];
<?php
$config = require 'config/database.php';
$dsn = "mysql:host={$config['host']};port={$config['port']};dbname={$config['name']};charset={$config['charset']}";
try {
$pdo = new PDO($dsn, $config['user'], $config['pass'], $config['options']);
echo "連接成功\n";
} catch (PDOException $e) {
die("連接失敗: " . $e->getMessage());
}
// 查詢
$stmt = $pdo->query("SELECT id, title FROM articles ORDER BY id DESC LIMIT 10");
foreach ($stmt as $row) {
echo "{$row['id']}: {$row['title']}\n";
}
// 預處理新增
$ins = $pdo->prepare("INSERT INTO articles (title, content, created_at) VALUES (?, ?, NOW())");
$ins->execute(['標題', '內容']);
echo "新增 ID: " . $pdo->lastInsertId();
// 事務示例
try {
$pdo->beginTransaction();
$pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
$pdo->exec("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
throw $e;
}
?>
<?php
$mysqli = new mysqli($host, $user, $pass, $db, $port);
$mysqli->set_charset('utf8mb4');
if ($mysqli->connect_errno) {
die("連接失敗: " . $mysqli->connect_error);
}
$result = $mysqli->query("SELECT * FROM users");
while ($row = $result->fetch_assoc()) { /* ... */ }
$result->free();
$mysqli->close();
| 錯誤 | 原因 | 解決 |
|---|---|---|
| Call to undefined function mysql_connect() | PHP 7+ 移除舊擴展 | 改用 mysqli/PDO |
| Access denied for user | 賬號/密碼/主機不匹配 | 檢查 GRANT、FLUSH PRIVILEGES |
| Can't connect to MySQL server | 服務未啟動/端口/防火牆 | systemctl start mysql; 檢查 3306 |
| Character set 'utf8mb4' unsupported | MySQL 版本過舊 (< 5.5.3) | 升級 MySQL 或用 utf8 |
| Packets out of order | max_allowed_packet 過小 | 調大 my.cnf: max_allowed_packet=64M |
PDO::MYSQL_ATTR_SSL_CA 等遵循以上規範,即可構建穩定、安全、高效的 PHP + MySQL 應用基礎設施。