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

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

$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 между всеми объектами операторов?

0

Решение

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector