Как использовать транзакцию по подготовленному запросуPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Как использовать транзакцию по подготовленному запросу

Сообщение Anonymous »


Мне нужно вставить два элемента данных так, чтобы данные вставлялись тогда и только тогда, когда вставлены оба элемента данных. Это мой текущий подготовленный запрос (на основе https://codeigniter.com/user_guide/data ... ed-queries)

$pQuery = $db->prepare(static function ($db) { $sql = 'INSERT INTO транзакция (uuid, img_link, datetime) ЗНАЧЕНИЯ (?, ?, ?)'; return (новый запрос($db))->setQuery($sql); }); $pQuery->execute($uuid_one, $img_link_one, $datetime_one); $pQuery = $db->prepare(статическая функция ($db) { $sql = 'INSERT INTO транзакция (uuid, img_link, datetime) ЗНАЧЕНИЯ (?, ?, ?)'; return (новый запрос($db))->setQuery($sql); }); $pQuery->execute($uuid_two, $img_link_two, $datetime_two); Вышеуказанное не использует транзакцию, а это означает, что существует вероятность того, что первые данные будут вставлены, а вторые — нет (потеря соединения, сбой базы данных и т. д.).

Я пытался объединить оба запроса одновременно

$pQuery = $db->prepare(static function ($db) { $sql = 'INSERT INTO транзакция (uuid, img_link, datetime) VALUES (?, ?, ?); '. 'INSERT INTO транзакция (uuid, img_link, datetime) VALUES (?, ?, ?); '; return (новый запрос($db))->setQuery($sql); }); $pQuery->execute($uuid_one, $img_link_one, $datetime_one, $uuid_two, $img_link_two, $datetime_two); но выбрасывает

У вас ошибка в синтаксисе SQL; проверьте руководство, которое соответствует версии вашего сервера MariaDB для правильного использования синтаксиса рядом с транзакцией INSERT INTO (uuid, img_link, datetime) ЗНАЧЕНИЯ (?, ?, ?)' в строке 1.

Это означает, что я не могу использовать два запроса одновременно. Я думал, что решение состоит в использовании транзакции, но я не нашел, как использовать транзакцию для подготовленного запроса в CodeIgniter 4. Как я могу использовать транзакции?

Вопрос Codeigniter, как использовать транзакции, не отвечает на мой вопрос, поскольку метод транзакций, описанный в ответе по ссылке, работает только с обычными запросами, а не с подготовленными запросами.

Чтобы продемонстрировать, что я имею в виду, я попробовал запустить следующий скрипт

$db->transBegin(); $pQuery = $db->prepare(статическая функция ($db) { $sql = 'INSERT INTO транзакция (uuid, img_link, datetime) ЗНАЧЕНИЯ (?, ?, ?)'; return (новый запрос($db))->setQuery($sql); }); $pQuery->execute($uuid_one, $img_link_one, $datetime_one); $pQuery = $db->prepare(статическая функция ($db) { $sql = 'INSERT INTO транзакция (uuid, img_link, datetime) ЗНАЧЕНИЯ (?, ?, ?)'; return (новый запрос($db))->setQuery($sql); }); $pQuery->execute($uuid_two, $img_link_two, $datetime_two); БД->transRollback(); transRollback() не откатывает транзакцию, но данные все равно вставляются, что указывает на то, что транзакция не работает для подготовленного запроса указанным выше методом.

Обратите внимание, что я даже не запускал $db->transCommit(), а данные все еще вставлены, а это означает, что на подготовленный выше запрос вообще не влияет транзакция.

А также вопрос в ссылке выше касается CodeIgniter 3, я использую CodeIgniter 4.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»