在一个旧项目中,只有一行被删除,它应该删除多行,因为SQL中的in语句。
我对PDO使用了以下查询:
DELETE FROM messages_to_people where (receiverID=:receiverID AND messageID IN ($inStatementSubQ))
这些参数中的每一个都只是id,例如123、456,789。例如,messageIDArray上的var_dump()为
array (size=3)
0 => string '1040' (length=4)
1 => string '1041' (length=4)
2 => string '1042' (length=4)
$inStatementSubQ
是一个由各种参数生成的字符串,稍后在foreach循环的帮助下绑定这些参数:
foreach($messageIDArray as $key=>$id){
$paramToBind = ":id".$key;
$foo = $stmt->bindParam($paramToBind, $id, PDO::PARAM_INT);
}
如果有3行需要删除,则每次运行时始终只删除其中一行。然后我想到在id上添加intval()
使它们成为整数。之后,它就像预期的那样工作了。
$foo = $stmt->bindParam($paramToBind, intval($id), PDO::PARAM_INT);
我很好奇,在interval ()之前,为什么只删除一行, PDO每次绑定时报告为真,语句执行也返回为真。我本以为它会失败,或者在删除所有带有接收方ID的内容时成功,但我没想到它的旧行为是每个循环删除一个。
任何见解都会对我的生活有帮助,
提前致谢
intval()
只是转移注意力。虽然在对bindParam()
的实际调用中使用intval()
是有效的,但这不是核心问题。当我尝试$newInt = intval(id)
时,我意识到这一点,它重复删除只是一个而不是所有
bindParam()
的第二个参数是混合变量&$,通过引用绑定。bindParam取最后一个ID并使用它,忽略其他的。通过用
//$stmt->bindParam(":id".$key, intval($id), PDO::PARAM_INT);
$stmt->bindValue(":id".$key, $id);
我得到了我期望的行为,它删除了所有的行为。
问题是您正在传递一串逗号分隔的id,而不是传递3个单独的id。据猜测,MySQL使用pdo试图将该字符串转换为整数,可能只是给你第一个id。
实际上你试图执行
DELETE FROM messages_to_people
where (receiverID=1
AND messageID IN ('1,2,3'))
已转换为:-
DELETE FROM messages_to_people
where (receiverID=1
AND messageID IN (1))
而你想要的是:-
DELETE FROM messages_to_people
where (receiverID=1
AND messageID IN (1,2,3))
您需要更改代码,为每个id提供一个pdo参数,并为每个id传递一个值。