【问题标题】:DELETE multiple rows in PDO在 PDO 中删除多行
【发布时间】: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


【解决方案1】:

我会这样做:

$query = "DELETE FROM game_locais_zumbis WHERE id_zumbi in (".str_repeat("?,", count($ids) - 1)."?)";
$stmt = $conn->prepare($query);
$stmt->execute($ids);

【讨论】:

    【解决方案2】:

    很遗憾,您不能将元素数组与准备好的语句绑定。您必须直接在查询中构建它们。

    function deleteInfo($ids)
    {
        $pdo = connPDO();
    
        if (!is_array($ids))
            $ids = array($ids); // if it is just one id not in an array, put it in an array so the rest of the code work for all cases
    
        $ids = array_map([$pdo, 'quote'], $ids); // filter elements for SQL injection
    
        $pdo->exec('DELETE FROM game_locais_zumbis WHERE id_zumbi IN (' . implode(', ', $ids) . ')');
    }
    

    请记住将数组传递给deleteInfo(),而不是将其内爆成字符串。

    【讨论】:

    • 好的,现在我了解了 PDO 中的工作原理。我在这里和大家一起学习更多,因为我认为绑定变量没有被引用。我很欣赏你制作的代码。非常非常感谢!
    【解决方案3】:

    这就是我的做法,而且效果很好。我创建了一个数组并循环遍历它。

    <?php
        // set a database connection
    
        $host = "localhost";
        $user ="root";
        $password = "";
        $db = "pdopost";
    
        //Set a DSN
        $dsn = 'mysql:host ='.$host . ';dbname='.$db;
        
        // Create a PDO instance
        $pdo = new PDO ($dsn, $user, $password);
        $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
    
        
        $ids=['6', '7'];
            
        foreach($ids as $id){
    
        $sql = "DELETE FROM posts WHERE id = ?";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$id]);
    
        }
    
        echo 'Deleted in the database';
       
    ?>
     
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 2014-02-24
      相关资源
      最近更新 更多