node-mysql multiple statement in una query



node mysql prepare (1)

Sto usando nodejs 10.26 + express 3.5 + node-mysql 2.1.1 + MySQL-Server Version: 5.6.16 .

Ho ottenuto 4 DELETE e voglio solo 1 richiesta database, quindi ho collegato i comandi DELETE con un ";" ... ma fallisce sempre.

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

Genera questo errore:

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

Ma se incollo questo SQL in PhpMyAdmin è sempre successo ...

Se lo scrivo anche in una singola query, ha successo.

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

Grazie per l'aiuto!


Immagino tu stia usando node-mysql . ( ma dovrebbe funzionare anche per node-mysql2 )

I docs dice:

Il supporto per più istruzioni è disabilitato per motivi di sicurezza (consente attacchi di SQL injection se i valori non sono correttamente sfuggiti).

Più richieste di istruzioni

Per utilizzare questa funzione devi abilitarla per la tua connessione:

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

Una volta abilitato, è possibile eseguire query con più istruzioni separando ciascuna istruzione con un punto e virgola ; . Il risultato sarà una matrice per ogni affermazione.

Esempio

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

Quindi, se hai abilitato il multipleStatements , il tuo primo codice dovrebbe funzionare.





node.js