Понадобилось исполнить несколько не однотипных запросов за один раз. Также, как это делает 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', '');
$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', '');
$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();
}