You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Prepared Statement带AND LIKE ?更新MySQL表失败求助

MySQLi预处理UPDATE带LIKE日期条件失败的原因

核心原因:字段名错误

你最初的UPDATE语句中,WHERE条件里写的是date LIKE ?,但数据库中实际存储日期的字段名为datum(你自己提到“数据库中date字段(实际名为datum)类型为date”)。这就导致WHERE条件里的date字段要么不存在,要么没有符合LIKE '2024-03%'的记录,所以UPDATE语句执行后没有匹配到任何行,自然不会产生更新效果。

而你后来改用范围查询的UPDATE语句中,正确使用了datum>=? AND datum<?,所以能匹配到目标记录并完成更新。

补充说明:DATE字段用LIKE的潜在问题

即使字段名正确,用LIKE匹配DATE类型字段也不是推荐的做法:

  • DATE类型在MySQL内部以数值格式存储,使用LIKE时会先隐式转换为字符串,效率远不如直接用日期范围查询(>=/<)。
  • 你用字符串拼接的SELECT语句能正常运行,是因为直接把$date拼进SQL里,但预处理语句的参数绑定本身不会影响通配符%的作用,字段名错误才是这次问题的根本原因。

验证方法

你可以在最初的预处理语句中修正字段名并添加受影响行数检查,来确认问题:

$tableYear = $tableYEAR . "-" . $tableMonth;
$date = $tableYear . "%";

/*Prepare DB-Update*/
$stmt_cashoutflag_update = $mysqli->prepare("UPDATE stunden SET cash_out=? WHERE md5=? AND datum LIKE ?"); // 修正字段名为datum
/*Bind params*/
$stmt_cashoutflag_update->bind_param('iss', $flag, $idMD5, $date);
/* Execute the prepared Statement */
$stmt_cashoutflag_update->execute();
// 检查受影响行数,确认是否匹配到记录
echo "受影响行数:" . $stmt_cashoutflag_update->affected_rows;
/*Close the prepare Statement*/
$stmt_cashoutflag_update->close();

如果修正字段名后能正常更新,就验证了字段名错误是导致问题的核心原因。


内容的提问来源于stack exchange,提问作者kaouch2000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:14:53