0

次のコントローラー アクションを使用しています。

exports.search = function(req, res) {

var x = [];

if (req.query.criteria == 'language') {
    var langQuery ="SELECT * FROM languages WHERE language LIKE '%" + req.query.val + "%' ORDER BY verbal DESC";

    client.query(langQuery, function(err, results) {
        if (err) {
            throw err;
        }

        client.query('SELECT * FROM humans', function(err, hmns) {
            if (err) {
                throw err;
            }

            for(var i = 0; i < results.length; i++) {
                for(var j = 0; j < hmns.length; j++) {
                    if(hmns[j].request == results[i].request) {
                        x.push(hmns[j]);
                    }
                }
            }

            res.render('allHumans', { title: 'Search Results', humans: x});
        });
    });
}else{
    var query = "SELECT * FROM humans WHERE " + req.query.criteria + " LIKE '%" + req.query.val + "%'";

    client.query(query, function(err, results) {
        if (err) {
            throw err;
        }

        res.render('allHumans', { title: 'Search Results', humans: results});
    });
}


}

私の言語テーブルには次の列があります (id は除外されます): REQUEST、LANGUAGE、VERBAL、WRITING、ASSESSOR

次のエントリがあります。

REQUEST | LANGUAGE | VERBAL | WRITING | ASSESSOR

req123       RU         3         3       name
req123       EN         4         4       name
req321       RU         5         5       name 
req321       EN         2         3       name

RU を検索するとコードは完全に実行されますが、EN を検索すると空の配列が返されます。何故ですか?

フィードバックをお待ちしております。

ありがとうございました!

編集: 私の人間のテーブルには、人間のエントリごとに一意の REQUEST 列があります。言語テーブルの REQUEST 列は外部キーであると言えます。(一人の人間がより多くの言語スキルを持つことができます) req.query.val は、RU を検索すると RU (完全に機能します) であり、EN を検索しようとすると EN です。

EDIT1 : 人間のエントリ:

REQUEST | FIRST NAME | LAST NAME | CONTACT
req123      John         Trump      000
req321      Mary         Jane       000

EDIT2:修正しました!for ループを変更しました。それが問題だったと思います:) この投稿のコードも更新しました。それでも、( client.escape() - mysql ノードモジュールによって提供される関数) を使用してテーブルにデータを挿入する前に値をエスケープしようとしましたが、すべてが壊れます! 次のエラーが表示されます。

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 'e'%' ORDER BY verbal DESC' 
at line 1

何らかの理由で、データをエスケープした後、一重引用符を追加してクエリを中断します。

4

1 に答える 1

0

y(指定された言語の場合にすべてのリクエスト行を保持する) は、少なくとも「すべての人間」( ) と同じくらい長いと仮定していますがresultss、これはほとんど常に間違っているようです。

さらに、req.query.criteriaandreq.query.valをエスケープしていないため、SQL インジェクション攻撃に対して無防備なままになっています。あなたはそれを修正する必要があります:)

(表示されている実際のエラー メッセージを投稿した場合や、実際にいくつかのhuman行を表示した場合も、他のユーザーの役に立ちます)。

于 2013-08-26T12:42:59.420 に答える