nodejs 10.26
+ express 3.5
+ node-mysql 2.1.1
+ MySQL-Server Version: 5.6.16
を使用しています。
4つのDELETEを取得し、1つのデータベースリクエストのみが必要なため、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
しかし、このSQLをPhpMyAdminに貼り付けると、常に成功します...
単一のクエリでそれを書いた場合も成功します。
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');
});
});
});
});
手伝ってくれてありがとう!
node-mysql を使用していると思います。 (が、 node-mysql2でも動作するはずです)
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
を有効にした場合、最初のコードが機能するはずです。