PHP中已引用日期仍被减法运算导致更新后为0000-00-00的问题排查
问题分析与解决
你的问题出在UPDATE语句的语法错误上,这直接导致日期被错误处理成0000-00-00,咱们一步步拆解:
核心错误:SET子句的字段分隔符用错了
在MySQL的UPDATE语句中,多个字段的更新应该用**逗号(,)**分隔,而你用了AND——这会让MySQL把整个date = 'xxx' AND boolean = 'yyy'当成一个布尔逻辑表达式来计算,结果要么是1(真)要么是0(假),然后把这个数值赋值给date字段。日期类型的字段无法识别整数0,就会被转换成0000-00-00。
修正后的基础写法
先把UPDATE语句的语法改对:
$format_date = date("Y-m-d", strtotime($date)); // 把SET里的AND换成逗号 $newinfo = "UPDATE tickets SET `date` = '" . mysqli_real_escape_string($connct,$format_date) . "', `boolean` = '" . mysqli_real_escape_string($connct,$booleancheck) . "' WHERE `id` = '" . mysqli_real_escape_string($connct,$id) . "' "; $update_this = mysqli_query($connct, $newinfo);
更安全的优化写法:使用预处理语句
直接拼接字符串虽然用了mysqli_real_escape_string,但还是有潜在的SQL注入风险,推荐用预处理语句来彻底避免这个问题,同时也能减少手动拼接时容易犯的语法错误:
$format_date = date("Y-m-d", strtotime($date)); // 准备预处理语句 $stmt = mysqli_prepare($connct, "UPDATE tickets SET `date` = ?, `boolean` = ? WHERE `id` = ?"); // 绑定参数(s代表字符串,若id是整数则替换成i更合适) mysqli_stmt_bind_param($stmt, "ssi", $format_date, $booleancheck, $id); // 执行语句 mysqli_stmt_execute($stmt); // 关闭语句 mysqli_stmt_close($stmt);
这样调整后,日期就能正常更新,同时代码的安全性也能得到提升。
内容的提问来源于stack exchange,提问作者n0k14
相关产品推荐
相关产品推荐

