4

DBIを使用して2つの別々のMySQLテーブルに値を挿入したいと思います。INSERT私はそれらの間に挿入することによって2つの動作するクエリを1つに結合しようとし;ました:

$dbh->do(q{
    INSERT INTO `testA`(test) values('testvalue111');
    INSERT INTO `testB`(test) values('testvalue222');
});

しかし、私は常にエラーが発生します:

「INSERTINTO`testB`(test)values('testvalue222...」の構文エラー

クエリを2つの別々のdo呼び出しに分割すると、機能します。ただし、結合されたクエリはphpMyAdminでは正常に機能します。Perlで失敗するのはなぜですか?

4

3 に答える 3

7

connectこれを有効にするには、呼び出しでオプションを設定する必要があります。ドキュメントから:

mysql_multi_statements
MySQL 4.1以降、セミコロン(;)で区切られた複数のステートメントのサポートは、このオプションを使用して有効にすることができます。サーバー側のプリペアドステートメントも有効になっている場合、このオプションを有効にすると問題が発生する可能性があります。

これはデフォルトで無効になっており、おそらく未設定のままにしておく必要があります。これは、SQLインジェクションの大きな手段です(特にバインドを使用していない場合は、これについて読む必要があります)。

于 2012-11-11T16:53:52.777 に答える
0

デフォルトでは、DBD::mysqlでは一度に複数のステートメントを実行することはできません。Matが示したオプションでこれを有効にすることはできますが、そうすべきではありません。特に、一部のデータベースドライバーにはそのようなオプションがないため、コードの移植性が低くなり、プリペアドステートメントで問題が発生する可能性があります。mysql_multi_statements

代わりに、ステートメントごとに個別のDBIコマンドを発行してください。

于 2017-03-02T18:02:33.647 に答える
-2

INSERT INTO testA(test)values('testvalue111')、('testvalue222');

于 2012-11-11T16:55:24.677 に答える