【问题标题】:PDO query in loop循环中的 PDO 查询
【发布时间】:2019-03-02 14:20:20
【问题描述】:

我有这个代码:

$sql = "SELECT id FROM videos";
$stmp = $db->prepare($sql);
$stmp->execute();
while ($row = $stmp->fetchAll(PDO::FETCH_ASSOC)) {

    $vkey = md5($row['id'] . "video");

    $sql = "UPDATE videos SET vkey = :vkey WHERE id = :id";
    $stmp = $db->prepare($sql);
    $stmp->execute(array(
        ":vkey" => $vkey,
        ":id"   => $row['id']
    ));

}

为什么只对第一个选择的第一个 id 执行,而不是对所有在循环中的 id 执行?

【问题讨论】:

  • 您的代码中有两个execute() 调用,一个在循环中。我想我不明白你的问题?
  • 首先选择从表视频中获取所有 id,然后在循环中我想对每个 id 执行查询
  • 最好全部取入数组,然后循环遍历stackoverflow.com/a/15386703/3254405
  • 你覆盖了$stmp。您还应该在循环之外进行准备。
  • 为什么不使用 MySQL 的 MD5() 进行纯 SQL 调用:UPDATE videos SET vkey = MD5(vkey);

标签: php pdo foreach


【解决方案1】:

您可以通过这样做完全避免所有这些代码:

$db->query("UPDATE videos SET vkey = MD5(CONCAT(vkey, 'video'))");

(或者您可以在后端执行此查询,例如 PHPMyAdmin UPDATE videos SET vkey = MD5(CONCAT(vkey, 'video'))


但是,如果您出于某种原因想要循环访问您的数据库,您可以这样做:

$sql = "SELECT id FROM videos";

//no reason to use prepare() because you aren't passing variables.
$stmp = $db->query($sql);
$stmp->execute();
$results = $stmp->fetchAll(PDO::FETCH_ASSOC);

//prepare UPDATE query outside of loop, this way you don't send 2 requests to your database for every row
$stmp = $db->prepare("UPDATE videos SET vkey = :vkey WHERE id = :id");

foreach($results as $result) {
    $vkey = md5($result['id']."video");
    $stmp->execute(
        array(
            ":vkey" => $vkey, 
            ":id" => $result['id']
        )
    );
}

此外,检查循环内的返回值以确保没有错误通常是个好主意,您可以使用类似$stmp->rowCount() 的方法来检查是否有任何行受到影响。

【讨论】:

  • 不工作。仅针对 select 中的第一个 id 更新。
  • 检查返回值以确保没有发生错误总是一个好主意。
  • @user1964450 很高兴我能帮上忙!
  • @miken32 我会将其添加到我的答案中,但我不会更新代码,因为我不确定 OP 想要如何处理错误。
猜你喜欢
  • 1970-01-01
  • 2016-06-29
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 2014-01-24
  • 1970-01-01
  • 2012-05-23
  • 2013-08-08
相关资源
最近更新 更多