MySQL查询本地XAMPP正常,公网服务器仅返回0的问题求助
排查本地正常、公网服务器返回0行的SQL问题
这种本地跑没问题线上出状况的坑我踩过好几次,结合你的代码和场景,大概率是时区差异或者SQL兼容性/数据问题,咱们一步步来定位:
1. 优先排查时区设置差异
本地XAMPP的MySQL默认时区一般和你所在地区一致(比如东八区),但公网服务器的MySQL很多默认是UTC时区,这会导致NOW()计算出来的上月区间完全不对,自然查不到数据。
验证方法:分别在本地和服务器的MySQL客户端(比如phpMyAdmin、Navicat)执行:
SELECT NOW(), @@time_zone;对比两边的时间和时区是否一致。
解决方案:
在数据库连接成功后,强制设置时区(比如东八区):// 连接数据库后添加这行 mysqli_query($conn, "SET time_zone = '+08:00'");或者修改SQL,用不受时区影响的写法(比如基于
CURDATE()而非NOW()):SELECT * FROM my_table WHERE ent_date BETWEEN DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), '%Y-%m-01 00:00:00') AND DATE_FORMAT(LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 1 MONTH)), '%Y-%m-%d 23:59:59');
2. 直接在服务器上执行SQL,看返回结果
不要通过PHP页面测试,直接在服务器的MySQL管理工具里运行你的SQL语句:
- 如果直接执行也返回0行,那要么是服务器数据库里确实没有上月的数据,要么是SQL的日期格式和
ent_date字段不匹配(比如ent_date是DATE类型,你加了时间后缀导致匹配失败)。 - 如果直接执行能查到数据,那问题出在PHP代码的数据库连接或者错误处理上。
3. 给PHP代码加上错误日志/输出
你现在的代码只处理了查询成功的情况,没捕获SQL执行错误,很容易忽略问题。修改代码添加错误提示:
$sql="SELECT * FROM my_table WHERE ent_date BETWEEN DATE_FORMAT(NOW() - INTERVAL 1 MONTH, '%Y-%m-01 00:00:00') AND DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 1 MONTH), '%Y-%m-%d 23:59:59')"; if ($result=mysqli_query($conn,$sql)) { $rowcount=mysqli_num_rows($result); printf(" %d\n",$rowcount); mysqli_free_result($result); } else { // 线上环境建议把错误写入日志,不要直接输出 echo "SQL执行错误: " . mysqli_error($conn); }
这样能直接看到是不是SQL语法错误、权限问题等。
4. 确认本地和服务器的数据库数据一致
有时候本地测试数据是全的,但服务器上的数据库还没同步上月的数据,也会导致返回0行。可以在两边分别执行SELECT COUNT(*) FROM my_table WHERE ent_date >= '上月第一天'来验证。
内容的提问来源于stack exchange,提问作者Ovakos
相关产品推荐
相关产品推荐

