Понадобилось исполнить несколько не однотипных запросов за один раз. Также, как это делает mysqli::multi_query, но через PDO. Сделать это, оказалось, вполне реально, но и без интересностей не обошлось.
Во-первых нагуглить это оказалось почему-то не так просто: вылезали какие-то обсуждения PDO_MYSQLND
2008-го года и, хоть и свежие, но оставшиеся без внятного ответа вопросы на StackOverflow.
Оказалось, что PDO_MYSQLND
с релизом PHP 5.3 заменил PDO_MYSQL
, который такие вещи не поддерживал. Причём заменил под тем же именем PDO_MYSQL
.
Итого, для выполнения нескольких запросов за один раз понадобится:
- PHP 5.3+
- mysqlnd
- Эмуляция prepared statement через
PDO::ATTR_EMULATE_PREPARES
, выставленный в1
(по умолчанию) или, как альтернатива, не использование prepared statements и выполнение запроса напрямую через$pdo->exec
.
Используем exec
$db = new PDO("mysql:host=localhost;dbname=test", 'root', ''); // работает как для реальных statement-ов, так и для эмуляции $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0); $sql = "DELETE FROM car; INSERT INTO car(name, type) VALUES ('car1', 'coupe'); INSERT INTO car(name, type) VALUES ('car2', 'coupe');"; try { $db->exec($sql); } catch(PDOException $e) { echo $e->getMessage(); die(); }
Используем statement-ы
$db = new PDO("mysql:host=localhost;dbname=test", 'root', ''); // Не будет работать с реальными statement-ами. Только с эмуляцией. // Строку ниже можно закомментировать, это умолчание $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1); $sql = "DELETE FROM car; INSERT INTO car(name, type) VALUES ('car1', 'coupe'); INSERT INTO car(name, type) VALUES ('car2', 'coupe');"; try { $stmt = $db->prepare($sql); $stmt->execute(); } catch(PDOException $e) { echo $e->getMessage(); die(); }