使用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
相关产品推荐
相关产品推荐

