web-dev-qa-db-fra.com

node-mysql déclarations multiples dans une requête

J'utilise nodejs 10.26 + express 3.5 + node-mysql 2.1.1 + MySQL-Server Version: 5.6.16.

J'ai eu 4 DELETE et je ne veux qu'une seule requête de base de données. J'ai donc connecté les commandes DELETE avec un ";" ... mais cela échoue toujours.

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');
});

Il jette cette erreur:

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

Mais si je colle ce SQL dans PhpMyAdmin, il réussit toujours ...

Si je l'écris en requête simple, c'est réussi.

        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');
                });
            });
        });
    });

Merci pour l'aide!

43
L.rp

Je suppose que vous utilisez node-mysql . ( mais devrait également fonctionner pour node-mysql2)

Le docs dit:

La prise en charge de plusieurs instructions est désactivée pour des raisons de sécurité (elle autorise les attaques par injection SQL si les valeurs ne sont pas correctement échappées).

Plusieurs requêtes

Pour utiliser cette fonctionnalité, vous devez l'activer pour votre connexion:

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

Une fois activé, vous pouvez exécuter des requêtes avec plusieurs instructions en séparant chaque instruction par un point-virgule ;. Le résultat sera un tableau pour chaque instruction.

Exemple

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}]
});

Donc, si vous avez activé le multipleStatements, votre premier code devrait fonctionner.

118
majidarif