<rmcreative>

RSS

Все заметки с тегами «PHP, SQL, PDO»

  1. Несколько SQL-запросов за один раз через PDO

    24 июня 2011

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