node-mysql 一次查询多条语句

问题描述 投票:0回答:4

我正在使用

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

我有四个 DELETE,但只需要一个数据库请求,因此我用“;”连接 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');
                });
            });
        });
    });
mysql node.js
4个回答
235
投票

我猜你正在使用node-mysql。 (但也应该适用于node-mysql2

文档说:

出于安全原因禁用对多个语句的支持(它 如果值没有正确转义,则允许 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
,您的第一个代码应该可以工作。


8
投票

使用如下所示的“multiplestatements: true”对我有用

var connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: '',
    multipleStatements: true
});
connection.connect();
 
var sql = "CREATE TABLE test(id INT DEFAULT 1, name VARCHAR(50));ALTER TABLE test ADD age VARCHAR(10);";
 
connection.query(sql, function(error, results, fields) {
    if (error) {
        throw error;
    }
});

0
投票

这在 Next.js 中对我有用...

export default async function handler(req, res) {
  try {
    // Build your multiple MySQL queries here
    const querySql = "DELETE FROM favorites WHERE user = ? AND listingID= ?";
    const querySql2 = "UPDATE properties SET saves = ? WHERE listingid = ?";

    // Pass any params here
    const valuesParams = [user, listingID];
    const valuesParams2 = [upDateSaves, listingID];

    //Execute your multiple MySQL queries here
    const data = await query({query: querySql, values: valuesParams });
    const data2 = await query({query: querySql2, values: valuesParams2 });

    //Combine the results
    const combinedResults = [data, data2];

    res.status(200).json({ 
    text: combinedResults,
   });

  } catch (error) {
    res.status(500).json({ error: 'Error fetching data' });
  }
}

-1
投票

要从数据库(SQL)获取数据,以下函数可以准确工作

router.get('/', function messageFunction(req, res){ //res.send('嗨,亲爱的拉西克,欢迎来到测试页。') //=> 一种方法 dbConn.query('SELECT COUNT(name) 作为计数,姓名、姓氏、电话、来自学生的电子邮件', function (err, rows, fields) { // 另一种方式 如果(错误)抛出错误

  dbConn.query('SELECT name, author from books',
  function (err, rowsBook, fields) { // another Way
      if (err) throw err
    // console.log('The counted is: ', rows[0].counted);    //=> Display in console
    // res.send('Hi Dear Rasikh, Welcome to Test Page.'+ rows[0].counted)  //=> Display in blank page
    
    res.render('main/index',{data:rows, myData:rowsBook});
  })

}); });

© www.soinside.com 2019 - 2024. All rights reserved.