2016-07-22 106 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

將錯誤打印到控制檯日誌並查看問題是什麼。我不認爲它的連接錯誤。我認爲它是一個格式不正確的查詢。正如帕特里克上面所說,你可能需要劃定引號。 –