【发布时间】:2014-08-17 22:35:54
【问题描述】:
我是 PDO 的新手,我已经对我面临的问题进行了一些搜索,但我无法找到任何答案。正如你在下面看到的,我有这个功能:
function deleteInfo($id){
$pdo = connPDO();
$deleteInfo = $pdo -> prepare("DELETE FROM game_locais_zumbis WHERE id_zumbi IN (:id)");
$deleteInfo -> bindValue(":id", $id, PDO::PARAM_STR);
$deleteInfo -> execute();
$pdo = null;
}
之后,我有以下代码:
while($row = $listInfo -> fetch(PDO::FETCH_ASSOC)){
$ids[] = $row['ids'];
}
$ids = implode(',', $ids);
deleteInfo($ids);
当我回显我的 $ids 时,我得到:
1,2,3,4,5
但是 DELETE 函数并没有删除我数据库中的所有这五行,而只是删除了第一行,比如“1”。当我在我的数据库中运行完全相同的 DELETE 函数时,将“:id”替换为“1,2,3,4,5”,它确实有效!有人知道我的错误是什么吗?我很感激任何帮助。
【问题讨论】:
-
当使用带有 IN 语句的绑定变量时,每个条目都必须是一个单独的绑定变量......您正在尝试删除
id_zumbi IN ('1,2,3,4,5')的位置(注意bindValue()环绕的引号字符串) -
您从
$row['ids']获取这些 id 的事实表明您是从查询中获取它们的。如果它不是最初查询的同一个表,您可以将其与子查询组合为:DELETE FROM game_locais_zumbis WHERE id_zumbi IN (SELECT id FROM othertable WHERE somecondition = true) -
我不知道绑定变量获取引号。有趣的!我会为此尝试一种解决方法。谢谢!
-
@user3854140 并不是他们得到了准确的引号——而是一个绑定的参数在执行的查询中变成了一个替换值。绑定参数不与将值连接到 SQL 语句中相同。查询将字符串 1,2,3,4,5 视为单个字符串值,因为这是单个占位符
:id所期望的。 -
很好的解释!现在我可以理解那里发生了什么......谢谢!
标签: php mysql pdo sql-delete