$sql = "select * from $table_list where $length_left qq $length_right $textif $t;";
$mysqli = new mysqli("localhost","root","root",'qq_db');
$mysqli->set_charset("utf8");
$result = $mysqli->query($sql);
var_dump($result); // 輸出 bool(false)
實際 SQL 輸出:select * from qq_list where length( qq = 5) and qq like '%1%' and wuzheng;
$length_left、$length_right 等變量來源不明,疑似包含隱形字符(如 、全角空格、零寬空格)。 (不換行空格),導致拼接後 SQL 含不可見字符,MySQL 解析報錯但 mysqli->query() 僅返回 false 不拋異常。str_replace(' ', '', $var) 或 html_entity_decode()。$stmt = $mysqli->prepare("SELECT * FROM qq_list WHERE LENGTH(qq) = ? AND qq LIKE ? AND wuzheng = 1");
$stmt->bind_param("is", $len, $like);
$len = 5;
$like = "%1%";
$stmt->execute();
$result = $stmt->get_result(); // 需 mysqlnd 驅動
while ($row = $result->fetch_assoc()) { ... }
trim()、html_entity_decode()、去除零寬字符(preg_replace('/[\x{200B}-\x{200D}\x{FEFF}]/u', '', $str))。if (!$result) { error_log($mysqli->error); throw new Exception('Query failed: '.$mysqli->error); }var_dump($result) 靠肉眼看 bool(false)。// 1. 開啟 mysqli 異常模式(PHP 8.1+ 默認開啟)
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
// 2. 統一字符集
$mysqli->set_charset("utf8mb4"); // 支持 emoji
// 3. 使用預處理
$stmt = $mysqli->prepare("SELECT * FROM ? WHERE ...); // 注意:表名不能參數化,需白名單驗證
從「拼接字符串」遷移到「預處理 + 異常模式」,是 PHP 連接 MySQL 專業化的分水嶺。