2016-07-22 4 views
0

私は紛らわしい結果をもたらすクエリを実行しています。私は、クライアント側のフォームからユーザー入力を受け取り、socket.ioを使用してサーバー上の入力を取得するnode.jsサーバーを持っています。ここでは、ユーザー入力を受け取った後に実行する機能があります。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(); 
} 

このコードを使用すると、画面に「接続エラー」が表示され続けます。私がuserInputを "[email protected]"に置き換えたときに起こることはないので、クエリーで変数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によると、それは言う:接続は終わりを使用して行われ閉会

()残りのすべてのクエリはMySQLサーバに終了したパケットを送信する前に必ず実行されますました。

+0

固定していただきありがとうございます。私はまた、これを使用するときに動作することに気づいた:var query = 'table'からのSELECT * WHERE 'email' ="' + userInput + '"; – Jay

+0

@Jayその方法は 'userInput'に' ''が含まれていないとうまくいきます。さもなければ、あなたのSQLクエリはコードインジェクションに対して脆弱です。 –

0

テストと解決のためにこれを試してください。ログに出力すると、クエリに何を入れているのかがわかります。

するvarクエリ文字列= "table SELECT * FROM WHERE LIKE email" + USERINPUT。

console.log(クエリーストリング);

のvarクエリ= connection.query(クエリ文字列関数(errは、行、フィールド){...

+0

私は質問を編集しました。最初のユーザーは今は印刷されません。userInputを "[email protected]"に置き換えない限り、正しい結果が得られません。私はあなたが私に与えたことを試みました。クエリには正しい電子メールがありますが、単に「接続エラー」が表示されます – Jay

+0

エラーをコンソールログに出力し、問題の内容を確認してください。私はその接続エラーとは思わない。私はその不正なクエリだと思う。 Patrickが上で述べたように、引用符を区切る必要があるかもしれません。 –