1. ホーム
  2. php

[解決済み] PDO による複数クエリのサポート (PDO_MYSQL, PDO_MYSQLND)

2022-11-03 03:24:57

質問

PDO が 1 つのステートメントで複数のクエリを実行することをサポートしないことは知っています。私はグーグルでPDO_MYSQLとPDO_MYSQLNDについて話しているいくつかの投稿を発見しました。

PDO_MySQL は他のどの伝統的なアプリケーションよりも アプリケーションであり、他のどの伝統的な アプリケーションです。従来の MySQL は単一の SQL クエリしか許可しません。PDO_MySQL では PDO_MySQL では、そのような制限はありません。 しかし、複数のクエリを注入される危険性があります。 複数のクエリを注入される危険性があります。

からです。 PDO と Zend Framework を使用した SQL インジェクションからの保護 (2010年6月; Julianによる)

PDO_MYSQL と PDO_MYSQLND は複数のクエリのサポートを提供しているようですが、それらに関する詳細な情報を見つけることができません。これらのプロジェクトは廃止されたのでしょうか。PDO を使用して複数のクエリを実行する方法は現在あるのでしょうか。

どのように解決するのですか?

知っている限りでは PDO_MYSQLND を置き換えた PDO_MYSQL に置き換えられました。紛らわしいのは、名前がまだ PDO_MYSQL . つまり、NDはMySQL+PDOのデフォルトドライバになっています。

全体として、複数のクエリを一度に実行するためには

  • PHP 5.3 以上
  • mysqlnd
  • エミュレートされたプリペアドステートメント。必ず PDO::ATTR_EMULATE_PREPARES に設定されていることを確認してください。 1 (デフォルト) に設定されます。あるいは、プリペアド・ステートメントを使わずに $pdo->exec を直接使用することもできます。

execを使用する

$db = new PDO("mysql:host=localhost;dbname=test", 'root', '');

// works regardless of statements emulation
$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);

ステートメントの使用

$db = new PDO("mysql:host=localhost;dbname=test", 'root', '');

// works not with the following set to 0. You can comment this line as 1 is default
$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');
";

$stmt = $db->prepare($sql);
$stmt->execute();


メモです。

エミュレートされたプリペアドステートメントを使用する場合、適切なエンコーディング(実際のデータエンコーディングを反映したもの)を DSN (5.3.6以降で利用可能) で適切なエンコーディングを設定していることを確認してください。そうでない場合は が使用されている場合、SQL インジェクションの可能性があります。 .