2016-07-22 107 views
0

我正在运行一个查询,它给了我混乱的结果。我有一个node.js服务器,它从客户端的一个表单接收一些用户输入,并使用socket.io获取服务器上的输入。这里是接收用户输入node.js和mySQL问题

databaseCheck(data); 

function databaseCheck(userInput){ 

    var mysql = require('mysql'); 
    var connection = mysql.createConnection({ 
    host  : '12.34.56.78', 
    user  : 'user', 
    password : 'password', 
    database : 'db' 
    }); 
connection.connect(); 

var query = connection.query('SELECT * from `table` WHERE `email` = userInput', function(err, rows, fields) { 
    if (!err) console.log(rows[0].username); 
    else console.log("connection failure"); 
}); 

connection.end(); 
} 

所以,当过我使用此代码,它使印刷“连接失败”屏幕后运行的功能。当我用“[email protected]”替换userInput时不会发生这种情况,所以我猜测在查询中使用变量userInput存在一些问题。有人能告诉我我的代码有什么问题吗?

回答

0

不仅需要通过将其追加到字符串传递userInput,你需要逃避它,以便查询其识别为一个字符串:

connection.connect(); 

var query = 'SELECT * from `table` WHERE `email` = ' + JSON.stringify(userInput); 

console.log(query); 

connection.query(query, function(err, rows, fields) { 
    if (!err) console.log(rows[0].username); 
    else console.log(err.name, err.message); 
}); 

connection.end(); 

这也有助于使错误消息的详细信息通过显示而不是通用消息的实际错误

最后,把connection.end();在回调里面。根据你所说的,它看起来像你一样工作但是在使用连接回叫的异步进程之前结束连接通常是一个坏主意。

忽略我的最后一条评论,看起来我在这个特例中错了。根据the repository documentation,它说:

关闭连接是使用end()来完成的,它确保在发送退出数据包到mysql服务器之前执行所有剩余的查询。

+0

谢谢修复它。我也注意到它在我使用这个时会起作用:var query ='SELECT * from'table' WHERE'email' =“'+ userInput +'”; – Jay

+0

@Jay该方法只适用于'userInput'不包含'''否则你的SQL查询将容易受到代码注入。 –

0

试试这个测试和解决方案。打印到日志会让你看到你正在查询的内容。

VAR查询字符串= “SELECT *从table WHERE email LIKE” + userInput;

console.log(querystring);

VAR的查询= connection.query(查询字符串,函数(ERR,行,场){...

+0

我编辑了这个问题。它从不打印第一个用户,它只打印“连接失败”,除非我用“[email protected]”替换userInput,那么它会给出正确的结果。我尝试了你给我的东西。该查询具有正确的电子邮件,但它只是打印“连接失败” – Jay

+0

将错误打印到控制台日志并查看问题是什么。我不认为它的连接错误。我认为它是一个格式不正确的查询。正如帕特里克上面所说,你可能需要划定引号。 –