Во избежание ненужной информации мой код выглядит примерно так:
$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 между всеми объектами операторов?
Разные базы данных имеют разные ограничения. Это не проблема с PHP или PDO, но с подключением к базе данных.
Хотя вы можете рассчитывать на любой соединитель БД для поддержки хотя бы одного курсора с ожидающими строками, многие базы данных ограничат вас одним и потребуют от вас либо полной выборки, либо явного закрытия базового курсора перед выполнением нового оператора.
Это действительно свойство соединения с базой данных, поскольку все операторы PDO связаны с одним. (Откуда они будут получать данные, если они не останутся привязанными к соединению с базой данных?) Если вы используете базу данных, которая поддерживает только один открытый подготовленный оператор за раз, у вас не будет выбора, кроме как сериализовать ваш доступ или открыть несколько подключений к базе данных. Вы также можете посмотреть на closeCursor
метод PDOStatement
учебный класс.
Других решений пока нет …