PHP: использование объекта PDO и нескольких операторов подготовки влияет на возвращаемый объект оператора - PullRequest
0 голосов
/ 09 ноября 2018

Во избежание ненужной информации мой код примерно выглядит следующим образом:

$db = new PDO(DSN, DB_USER, DB_PW);


$sql1 = "SELECT * FROM Table1";

// fetching the first result
$stt1 = $db->prepare($sql1);
if ($stt1->execute()) {
    $result = $stt1->fetch(PDO::FETCH_ASSOC);
}

// doing update in the middle by using the SAME $db object, but different statement variable
$sql2 = "UPDATE Table1 SET field1 = 'footest1' WHERE id = 1";
$stt2 = $db->prepare($sql2);
$stt2->execute();

// fetching the next result
$result = $stt1->fetch(PDO::FETCH_ASSOC);

Хорошо, я запустил это, и, к моему удивлению, когда я получаю свой следующий результат, я получаю ложь. Прерывает ли подготовка другого оператора ($ stt2) в середине мой уже созданный $ stt1?

И у меня есть 15+ записей в этой таблице.

Обновление: похоже, что метод execute объекта оператора является причиной, по которой моя вторая выборка возвращает false. Чтобы это работало, повторный вызов $ stt1-> execute () перед выборкой во второй раз решает эту проблему ... Но это показывает, что существует некоторая связь через метод execute между всеми объектами оператора?

1 Ответ

0 голосов
/ 09 ноября 2018

Различные базы данных имеют разные ограничения. Это не проблема с PHP или PDO, но с подключением к базе данных.

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

Это действительно свойство соединения с базой данных, поскольку все операторы PDO связаны с одним. (Откуда они будут получать данные, если они не останутся привязанными к соединению с базой данных?) Если вы используете базу данных, которая поддерживает только один открытый подготовленный оператор за раз, у вас не будет выбора, кроме как сериализовать ваш доступ или открыть несколько подключений к базе данных. Вы также можете взглянуть на метод closeCursor класса PDOStatement .

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