Javascript 无法使用Node.js中的多个用户定义变量运行MYSQL查询

Javascript 无法使用Node.js中的多个用户定义变量运行MYSQL查询,javascript,mysql,node.js,Javascript,Mysql,Node.js,Node.js代码: var express = require("express"); var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', user : 'root', password : 'password', database : 'myDatabase' }); var app = express(); c

Node.js代码:

var express    = require("express");
var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : 'password',
  database : 'myDatabase'
});
var app = express();

connection.connect(function(err){
if(!err) {
    console.log("Database is connected ... \n\n");
} else {
    console.log("Error connecting database ... \n\n");
}
});

app.get("/",function(req,res){
var tmdb_id, rel_date, role, title, year, starring, actor, categories,choose,use;

choose = 3;
if (choose == 0 || choose == 1 || choose ==2 || choose==3){
use = categories[choose];
connection.query('
SET @tmdbid:= (SELECT TMDB_ID FROM `MOVIES` WHERE VOTES > 2058 ORDER BY RAND() LIMIT 0,1);
SET @genre:= (SELECT GROUP_CONCAT(GENRE_NAME) FROM `MOVIES_GENRES` WHERE TMDB_ID = @tmdbid);
SET @director:=(SELECT GROUP_CONCAT(DISTINCT NAME) FROM`DIRECTORS` WHERE DID IN (SELECT DID FROM `DIRECTS` WHERE TMDB_ID = @tmdbid));
SET @actors:=(SELECT GROUP_CONCAT(DISTINCT NAME) FROM `ACTORS` WHERE AID IN (SELECT AID FROM `ROLES` WHERE TMDB_ID = @tmdbid));
SET @roles:=(SELECT GROUP_CONCAT(DISTINCT CHAR_NAME) FROM `ROLES` WHERE TMDB_ID = @tmdbid);
SET @plot:= (SELECT OVERVIEW FROM `OVERVIEW` WHERE TMDB_ID = @tmdbid);
SELECT TITLE, RELEASE_DATE, @genre, @director, @actors, @roles, @plot
FROM `MOVIES` WHERE TMDB_ID = @tmdbid', function(err,rows,fields){
  console.log(err);
  if (!err){
    console.log(rows[0]);
  }

 else
    console.log('Error while performing Query.');
  });
}


});
app.listen(3000);
查询:

SET @tmdbid:= (SELECT TMDB_ID FROM `MOVIES` WHERE VOTES > 2058 ORDER BY RAND() LIMIT 0,1);
SET @genre:= (SELECT GROUP_CONCAT(GENRE_NAME) FROM `MOVIES_GENRES` WHERE TMDB_ID = @tmdbid);
SET @director:=(SELECT GROUP_CONCAT(DISTINCT NAME) FROM`DIRECTORS` WHERE DID IN (SELECT DID FROM `DIRECTS` WHERE TMDB_ID = @tmdbid));
SET @actors:=(SELECT GROUP_CONCAT(DISTINCT NAME) FROM `ACTORS` WHERE AID IN (SELECT AID FROM `ROLES` WHERE TMDB_ID = @tmdbid));
SET @roles:=(SELECT GROUP_CONCAT(DISTINCT CHAR_NAME) FROM `ROLES` WHERE TMDB_ID = @tmdbid);
SET @plot:= (SELECT OVERVIEW FROM `OVERVIEW` WHERE TMDB_ID = @tmdbid);
SELECT TITLE, RELEASE_DATE, @genre, @director, @actors, @roles, @plot
FROM `MOVIES` WHERE TMDB_ID = @tmdbid
我试图保存所有用户定义的变量值,然后在最后显示它。这段代码在使用MYSQL workbench 6.3CE的MYSQL 5.7中运行良好。但是当我使用node.js运行这段代码时,我无法获得输出,因为它抛出了错误。下载node_模块时,node中的SQL版本为0.9

错误:

{ [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 'SELECT @tmdbid' at line 1]
  code: 'ER_PARSE_ERROR',
  errno: 1064,
  sqlState: '42000',
  index: 0 }
我不确定我在这里哪里出了问题

根据,对于一个查询中的多个sql语句,没有默认支持。也许这就是你遇到问题的原因

设置初始连接时启用对多个语句的支持:

var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : 'password',
  database : 'myDatabase',
  multipleStatements: true /* turn on multiple statements */
});
请注意,根据前面提到的文档,这可能会增加SQL注入攻击的风险

此外,您不能以
查询
方法中的方式定义字符串。您似乎已使用回车符格式化字符串。令人惊讶的是,在sql错误之前,您没有从中得到语法错误。也许你粘贴在这里的代码不是一字不差的

无论如何,为了安全起见,我会把整个查询放在一行。因此,您的查询如下所示:

connection.query('SET @tmdbid:= (SELECT TMDB_ID FROM `MOVIES` WHERE VOTES > 2058 ORDER BY RAND() LIMIT 0,1); SET @genre:= (SELECT GROUP_CONCAT(GENRE_NAME) FROM `MOVIES_GENRES` WHERE TMDB_ID = @tmdbid); SET @director:=(SELECT GROUP_CONCAT(DISTINCT NAME) FROM `DIRECTORS` WHERE DID IN (SELECT DID FROM `DIRECTS` WHERE TMDB_ID = @tmdbid)); SET @actors:=(SELECT GROUP_CONCAT(DISTINCT NAME) FROM `ACTORS` WHERE AID IN (SELECT AID FROM `ROLES` WHERE TMDB_ID = @tmdbid)); SET @roles:=(SELECT GROUP_CONCAT(DISTINCT CHAR_NAME) FROM `ROLES` WHERE TMDB_ID = @tmdbid); SET @plot:= (SELECT OVERVIEW FROM `OVERVIEW` WHERE TMDB_ID = @tmdbid); SELECT TITLE, RELEASE_DATE, @genre, @director, @actors, @roles, @plot FROM `MOVIES` WHERE TMDB_ID = @tmdbid',

  function (err, rows, fields) {

    if (err)
      console.log(err);
    else
      console.log(rows[0]);

  });
}
根据,对于一个查询中的多个sql语句,没有默认支持。也许这就是你遇到问题的原因

设置初始连接时启用对多个语句的支持:

var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : 'password',
  database : 'myDatabase',
  multipleStatements: true /* turn on multiple statements */
});
请注意,根据前面提到的文档,这可能会增加SQL注入攻击的风险

此外,您不能以
查询
方法中的方式定义字符串。您似乎已使用回车符格式化字符串。令人惊讶的是,在sql错误之前,您没有从中得到语法错误。也许你粘贴在这里的代码不是一字不差的

无论如何,为了安全起见,我会把整个查询放在一行。因此,您的查询如下所示:

connection.query('SET @tmdbid:= (SELECT TMDB_ID FROM `MOVIES` WHERE VOTES > 2058 ORDER BY RAND() LIMIT 0,1); SET @genre:= (SELECT GROUP_CONCAT(GENRE_NAME) FROM `MOVIES_GENRES` WHERE TMDB_ID = @tmdbid); SET @director:=(SELECT GROUP_CONCAT(DISTINCT NAME) FROM `DIRECTORS` WHERE DID IN (SELECT DID FROM `DIRECTS` WHERE TMDB_ID = @tmdbid)); SET @actors:=(SELECT GROUP_CONCAT(DISTINCT NAME) FROM `ACTORS` WHERE AID IN (SELECT AID FROM `ROLES` WHERE TMDB_ID = @tmdbid)); SET @roles:=(SELECT GROUP_CONCAT(DISTINCT CHAR_NAME) FROM `ROLES` WHERE TMDB_ID = @tmdbid); SET @plot:= (SELECT OVERVIEW FROM `OVERVIEW` WHERE TMDB_ID = @tmdbid); SELECT TITLE, RELEASE_DATE, @genre, @director, @actors, @roles, @plot FROM `MOVIES` WHERE TMDB_ID = @tmdbid',

  function (err, rows, fields) {

    if (err)
      console.log(err);
    else
      console.log(rows[0]);

  });
}


你能给我们看一下你的NodeJS代码吗?我已经添加了代码。不确定是否有问题,但是你在
控制器之间没有空格,我试过了。没有解决问题。似乎要进行一系列非常奇怪的查询。您是否考虑使用联接来获取您正在寻找的数据,而不是运行一组子选择和变量赋值?也许可以谈谈底层的表结构以及您试图得到的结果,以便您可以获得关于以更明智的方式查询此数据的建议。您可以向我们展示您的NodeJS代码吗?我已经添加了代码。不确定是否存在问题,但您与
控制器之间没有空间,我尝试了它。没有解决问题。似乎要进行一系列非常奇怪的查询。您是否考虑使用联接来获取您正在寻找的数据,而不是运行一组子选择和变量赋值?也许讨论一下底层的表结构,以及您试图得到的结果,这样您就可以获得关于以更明智的方式查询此数据的建议。这是行不通的。在第一次查询之后抛出相同的错误,即类型\名称。@崩溃可能sql字符串不喜欢转义的换行符-如果没有针对特定架构的sql设置,则很难进行调试。您是说错误与我的代码不同,还是与您以前的错误相同?错误是相同的,但您的代码在第一次查询中执行,在第二次查询中被卡住。@崩溃我已用另一种理论更新了我的答案这不起作用。在第一次查询之后抛出相同的错误,即类型\名称。@崩溃可能sql字符串不喜欢转义的换行符-如果没有针对特定架构的sql设置,则很难进行调试。您是说错误与我的代码不同,还是与您以前的错误相同?错误是相同的,但您的代码在第一次查询中执行,在第二次查询中被卡住。@崩溃我已用另一种理论更新了我的答案