当此操作失败时,为什么只删除一行?(PDO, PHP和MySQL的类型故障)


When this fails, why does it delete just one row? (PDO, PHP, and MySQL glitch with types)

在一个旧项目中,只有一行被删除,它应该删除多行,因为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传递一个值。