MySQL存在匹配记录但PHP执行查询返回空结果问题求助
问题排查与解决方案
1. 优先确认数据库连接一致性
这是该类问题最高发的原因:
- 在PHP代码中执行以下语句,打印当前连接的库名和登录用户:
print_r(mysqli_fetch_assoc(mysqli_query($conn, "SELECT DATABASE() as db, USER() as user")));
- 和你phpMyAdmin当前使用的库、登录用户做对比,确保二者访问的是同一个MySQL实例、同一个数据库,避免出现PHP连测试库、phpMyAdmin连生产库的情况。
2. 检查变量是否存在不可见字符
你echo出来的SQL看起来正常,但拼接用的变量可能包含零宽空格、全角空格、换行符等不可见字符,复制SQL的时候这些字符会被浏览器/终端自动过滤,导致直接运行正常、代码运行失败:
- 对三个查询变量分别执行
var_dump(),校验长度是否匹配:
var_dump($st_week, $en_week, $_POST['boat']);
比如boat的值是sapphire,正常长度应为8,如果输出长度大于8,说明存在不可见字符,可通过以下代码过滤后再使用:
$st_week = preg_replace('/[\x00-\x1F\x7F]/u', '', trim($st_week)); $en_week = preg_replace('/[\x00-\x1F\x7F]/u', '', trim($en_week)); $boat = preg_replace('/[\x00-\x1F\x7F]/u', '', trim($_POST['boat']));
3. 补全错误捕获逻辑定位问题
你当前的代码只判断了结果行数,没有捕获SQL执行报错,很多隐式错误会被忽略:
在mysqli_query执行后新增错误打印逻辑:
$result = mysqli_query($conn, $sql); // 新增错误排查代码 if (!$result) { echo "MySQL执行错误:" . mysqli_error($conn); exit; }
4. 改用预处理语句规避拼接风险
直接拼接SQL不仅存在SQL注入风险,还容易因为特殊字符转义异常导致问题,推荐改为mysqli预处理写法:
// 预处理SQL模板 $stmt = mysqli_prepare($conn, "SELECT * FROM disponibilities WHERE st_week = ? AND en_week = ? AND boat = ?"); // 绑定参数,sss表示三个参数都是字符串类型 mysqli_stmt_bind_param($stmt, "sss", $st_week, $en_week, $_POST['boat']); // 执行查询 mysqli_stmt_execute($stmt); // 获取结果集 $result = mysqli_stmt_get_result($stmt); if (mysqli_num_rows($result) > 0) { $disponibility = mysqli_fetch_assoc($result); } else { echo "0"; echo $_POST['boat']; }
内容的提问来源于stack exchange,提问作者johnnydeppa
相关产品推荐
相关产品推荐

