PHP `mysql_connect` 报錯,用戶名密碼正確、MySQL 服務已重啟,但仍無法連接。截圖顯示端口為 3307(非默認 3306)。
$conn = mysql_connect('127.0.0.1:3307', 'root', 'password'); // 必須顯式帶端口
// 或
$conn = mysqli_connect('127.0.0.1', 'root', 'password', 'dbname', 3307);
配置文件 `php.ini` 中 `mysqli.default_port=3307` 亦可生效。
MySQL 用戶 = `用戶名` + `宿主`。需確認 `root` 允許從 PHP 運行機器的 IP 連接:
mysql> SELECT host, user FROM mysql.user WHERE user='root';
+-----------+------+
| host | user |
+-----------+------+
| localhost | root |
| 127.0.0.1 | root |
| ::1 | root |
| % | root | -- 允許任意宿主(生產環境慎用)
+-----------+------+
GRANT ALL ON *.* TO 'root'@'192.168.1.%' IDENTIFIED BY 'pwd'; FLUSH PRIVILEGES;# Linux 檢查 3307 端口
netstat -antp | grep 3307
# 雲服務器需在控制台放行 3307 入站規則
$mysqli = new mysqli('127.0.0.1', 'root', 'password', 'dbname', 3307);
if ($mysqli->connect_errno) {
error_log("MySQL 連接失敗: " . $mysqli->connect_error);
die("服務暫時不可用");
}
$mysqli->set_charset("utf8mb4");
使用 `PDO` 更通用:
$dsn = "mysql:host=127.0.0.1;port=3307;dbname=dbname;charset=utf8mb4";
$pdo = new PDO($dsn, 'root', 'password', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false
]);