1. ホーム
  2. mysql

node-mysql 1つのクエリで複数のステートメントを使用する。

2023-09-12 18:05:32

質問

私は nodejs 10.26 + express 3.5 + node-mysql 2.1.1 + MySQL-Server Version: 5.6.16 .

4つのDELETEがあり、1つのDatabase Requestだけが欲しいので、DELETEコマンドを";"で接続しましたが、常に失敗します。

var sql_string = "DELETE FROM user_tables WHERE name = 'Testbase';";
sql_string += "DELETE FROM user_tables_structure WHERE parent_table_name = 'Testbase';";
sql_string += "DELETE FROM user_tables_rules WHERE parent_table_name = 'Testbase';";
sql_string += "DELETE FROM user_tables_columns WHERE parent_table_name = 'Testbase';";

connection.query(sql_string, function(err, rows, fields) {
   if (err) throw err;
   res.send('true');
});

このようなエラーを投げます。

Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELETE FROM user_tables_structure WHERE parent_table_name = 'Testbase';DELETE FR' at line 1

しかし、私はPhpMyAdminにこのSQLを貼り付けると、それは常に成功している...

単一クエリで書いても成功します。

        connection.query("DELETE FROM user_tables WHERE name = 'Testbase'", function(err, rows, fields) {
        if (err) throw err;

        connection.query("DELETE FROM user_tables_structure WHERE parent_table_name = 'Testbase'", function(err, rows, fields) {
            if (err) throw err;


            connection.query("DELETE FROM user_tables_rules WHERE parent_table_name = 'Testbase'", function(err, rows, fields) {
                if (err) throw err;

                connection.query("DELETE FROM user_tables_columns WHERE parent_table_name = 'Testbase'", function(err, rows, fields) {
                    if (err) throw err;

                    res.send('true');
                });
            });
        });
    });

ありがとうございました。

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

おそらく ノードミスクル . ( でも動作するはずです。 ノードマイスクリプト2 )

この docs は言う。

複数のステートメントをサポートすることは、セキュリティ上の理由から無効になっています。 値が適切にエスケープされていない場合、SQLインジェクション攻撃を受ける可能性があります)。

複数ステートメントクエリ

この機能を使用するには、接続のためにこの機能を有効にする必要があります。

var connection = mysql.createConnection({multipleStatements: true});

有効にすると、各ステートメントをセミコロンで区切ることにより、複数のステートメントを持つクエリを実行できます。 ; . 結果は各ステートメントに対応する配列になります。

connection.query('SELECT ?; SELECT ?', [1, 2], function(err, results) {
  if (err) throw err;

  // `results` is an array with one element for every statement in the query:
  console.log(results[0]); // [{1: 1}]
  console.log(results[1]); // [{2: 2}]
});

というわけで、もしあなたが multipleStatements を有効にした場合、最初のコードは動作するはずです。