使用date_format()后MySQL日期无法在HTML表格显示的问题排查
问题原因与解决方案
我一眼就发现问题所在了——你的SQL查询里对日期字段用了DATE_FORMAT函数,但没给格式化后的列指定别名,导致PHP用$row['podate']和$row['tentdate']根本拿不到对应的值。
具体分析
在MySQL命令行执行查询时,MySQL会自动给无别名的格式化列分配一个默认列名(比如date_format(podate, '%d-%m-%Y')),所以你能看到日期结果;但PHP的fetch_assoc()是通过键名取值的,你用的原始字段名podate、tentdate在返回的结果集里不存在,自然就显示为空了。
修复步骤
- 给格式化日期列添加别名,修改你的SQL语句:
$sql="select cname, date_format(podate, '%d-%m-%Y') AS podate, started, reason, date_format(tentdate, '%d-%m-%Y') AS tentdate, progress, status from info where cname='$searchstr';";
用AS podate和AS tentdate给格式化后的列指定和原字段名一致的别名,这样$row['podate']和$row['tentdate']就能正确获取到格式化后的日期值了。
- 紧急修复SQL注入风险:
你的代码直接把$_GET['cname']拼进SQL里,存在严重的SQL注入漏洞。建议改用预处理语句规避风险,示例代码如下:
// 替换原SQL与查询逻辑 $sql="select cname, date_format(podate, '%d-%m-%Y') AS podate, started, reason, date_format(tentdate, '%d-%m-%Y') AS tentdate, progress, status from info where cname=?;"; $stmt = mysqli_prepare($conn, $sql); mysqli_stmt_bind_param($stmt, "s", $searchstr); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt);
这种方式能避免恶意参数破坏SQL结构,大幅提升代码安全性。
额外排查技巧
可以在fetch_assoc()后用var_dump($row)打印结果集,看看实际返回的键名是什么——这是排查字段取值问题的常用方法,能帮你快速定位不匹配的键名。
内容的提问来源于stack exchange,提问作者Blazing Phoenix
相关产品推荐
相关产品推荐

