Занятое соединение PHP с MYSQL?

Это часть PHP & MySQL Novice to Ninja, 5th Edition от Kevin Yank

Обычно, когда мы выполняем запрос SELECT, мы используем условие цикла while или цикла foreach для извлечения каждой строки результатов, по одному за раз:

while ($row = $result->fetch()) foreach ($result as $row)

Когда мы обрабатываем результат запроса таким образом, PHP фактически извлекает каждую строку из базы данных, когда цикл запрашивает ее, и выбрасывает ее при переходе к следующей строке. Это избавляет PHP от необходимости использовать много памяти для одновременного хранения всех строк результатов.

В большинстве случаев нам, разработчикам, не нужно знать, что PHP использует этот умный ярлык. Но время от времени мы хотим отправлять еще один SQL-запрос на сервер MySQL, прежде чем проработаем все результаты предыдущего запроса.

Это именно то, что должно произойти в этом коде, если мы не будем осторожны: мы просто запустили запрос SELECT, чтобы запросить список всех шуток, принадлежащих конкретному автору, и, как мы работаем через этот список, мы хотели бы выполнить запрос DELETE для каждого из них. Проблема в том, насколько MySQL знает, что он все еще будет занят, отправляя нам результаты запроса SELECT; мы не можем просто прервать его и попросить запустить DELETE! Это может привести к сбою наших DELETE с ошибкой.

Вот тут-то и приходит метод fetchAll. Вызывая этот метод в нашем подготовленном выражении ($s), мы просим PHP получить весь набор результатов для запроса и сохранить их в массиве PHP ($result):

Мой вопрос: почему я могу выполнять операторы MYSQL, когда у меня есть один или несколько PDOStatementresult sets используется в моем коде PHP? даже я могу delete все строки в тех result sets

<?php
    include_once $_SERVER["DOCUMENT_ROOT"] . '/DBconnection.inc.php';

        $pds1 = $dbi->query("SELECT name FROM tbl1");
        $row = $pds1->fetch();
        var_dump($row['name']);

        $pds2 =  $dbi->query("SELECT user FROM tbl2");
        $row = $pds2->fetch();
        var_dump($row['user']);

        $row = $pds1->fetch();
        var_dump($row['name']);

        $row = $pds2->fetch();
        var_dump($row['user']);

        $pds3= $dbi->prepare("DELETE FROM tbl1;");
        $pds3->execute();

        $row = $pds1->fetch();
        var_dump($row['name']);

        $row = $pds2->fetch();
        var_dump($row['user']);



?>

1 ответ

Решение

Это область, в которой поведение PDO будет зависеть от используемой вами базы данных и реализации драйвера PDO. Вы можете выполнять новые запросы, пока вы по-прежнему извлекаете результаты оператора select, или нет.

В общем, самый безопасный и наиболее совместимый способ использования соединений PDO:

  1. выполнить ваш оператор SELECT
  2. получить все нужные вам строки
  3. закрыть курсор (например: с $pds1->closeCursor())
  4. выполнить ваш следующий запрос
Другие вопросы по тегам