<?php
$con = mysqli_connect("localhost", "root", "root", "ehr");
if (!$con) {
echo 'Connect Error: ' . mysqli_connect_error(); // 輸出中文亂碼
}
錯誤訊息包含中文時顯示亂碼(如 )。
MySQL 錯誤訊息編碼與 PHP 腳本輸出編碼不一致。常見情況:
character_set_server = gbk,錯誤訊息為 GBK 編碼。Content-Type: text/html; charset=utf-8。<?php
$con = mysqli_connect("localhost", "root", "root", "ehr");
if (!$con) {
$err = mysqli_connect_error();
// 從 GBK 轉 UTF-8
$err = iconv('GBK', 'UTF-8//IGNORE', $err);
echo 'Connect Error: ' . $err;
}
<?php
$con = mysqli_connect("localhost", "root", "root", "ehr");
if (!$con) {
// 連線失敗時無法設定 charset,仍需 iconv
$err = iconv('GBK', 'UTF-8//IGNORE', mysqli_connect_error());
die('Connect Error: ' . $err);
}
// 連線成功後立即設定字元集
mysqli_set_charset($con, 'utf8mb4'); // 推薦 utf8mb4 支援 emoji
// 或 PDO 方式
$pdo = new PDO("mysql:host=localhost;dbname=ehr;charset=utf8mb4", 'root', 'root');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
/etc/my.cnf:
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[client]
default-character-set = utf8mb4
service mysqld restart。header('Content-Type: text/html; charset=utf-8');。CHARSET=utf8mb4。<?php
function mysqliConnect($host, $user, $pass, $db, $charset = 'utf8mb4') {
$con = @mysqli_connect($host, $user, $pass, $db);
if (!$con) {
$err = mysqli_connect_error();
// 嘗試常見編碼轉換
$encodings = ['GBK', 'BIG5', 'UTF-8'];
foreach ($encodings as $enc) {
$converted = @iconv($enc, 'UTF-8//IGNORE', $err);
if ($converted !== false && $converted !== $err) {
$err = $converted;
break;
}
}
throw new \RuntimeException("MySQL Connect Failed: $err");
}
if (!mysqli_set_charset($con, $charset)) {
throw new \RuntimeException("Set charset $charset failed: " . mysqli_error($con));
}
return $con;
}
**根治:MySQL、PHP、HTML 三端統一 UTF-8(utf8mb4)**。臨時修正:iconv('GBK', 'UTF-8//IGNORE', $err)。建議改用 PDO + 例外模式,統一錯誤處理流程。