Запрос PDO в цикле - PullRequest
       8

Запрос PDO в цикле

0 голосов
/ 26 сентября 2018

У меня есть этот код:

$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']
    ));

}

Почему выполняется только для первого идентификатора из первого выбора, а не для всех он находится в цикле?

1 Ответ

0 голосов
/ 26 сентября 2018

Вы можете полностью избежать всего этого кода, просто выполнив следующее:

$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(), чтобы проверить, были ли затронуты какие-либо строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...