通常、PDO では 1 つのステートメント内で複数のクエリを許可しませんが、拡張機能 PDO_MYSQL および PDO_MYSQLND はこれをサポートします。
PDO_MYSQLND が置き換えられました。 PHP 5.3 の PDO_MYSQL 。PDO_MYSQL は MySQL PDO のデフォルト ドライバーとして残ります。 PDO で複数のクエリを実行するには、次の要件を満たす必要があります:
exec() メソッドは、次の場合に複数のクエリを実行できます。
$db = new PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", 'root', ''); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $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');"; $db->exec($sql);
このメソッドは、SQL ステートメントの実行に限定されます。定数値。
データが PHP 変数から取得される場合は、プリペアド ステートメントを使用する必要があります。
$db = new PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", 'root', ''); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "DELETE FROM car; INSERT INTO car(name, type) VALUES (:car1, :type1); INSERT INTO car(name, type) VALUES (:car2, :type2);"; $stmt = $db->prepare($sql); $stmt->execute(["car1" => "brand1", "type1" => "coupe", "car2" => "brand2", "type2" => "coupe"]); while ($stmt->nextRowset()) { echo $db->lastInsertId(); // as an example }
このアプローチにより、行セットの反復を通じてエラー チェックとクエリ結果の収集が可能になります。
エミュレートされたプリペアド ステートメントを使用する場合は、DSN のエンコーディングが(PHP 5.3.6 以降で利用可能) 実際のデータ エンコーディングと一致します。そうしないと、特定のエンコーディングで SQL インジェクションが発生する可能性があります。
以上がPDO_MYSQL と PDO_MYSQLND を使用して単一の PDO ステートメントで複数のクエリを実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。