Express.js - 尝试从mysql中提取数据时出错

时间:2013-08-26 10:45:09

标签: javascript mysql node.js express

我正在使用以下控制器操作:

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列是外键。 (一个人可以拥有更多的语言技能)当我尝试搜索EN时,req.query.val是RU(当我完美地工作时)和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

出于某种原因,在转义数据后,它会为其添加单引号并中断查询。

1 个答案:

答案 0 :(得分:0)

您假设y(如果是给定语言,保留所有请求行)至少与“所有人类”(resultss)一样长,这在我看来差不多总是假的。

此外,您没有转义req.query.criteriareq.query.val,让您对SQL注入攻击持开阔态度。你应该解决这个问题:)

(如果您发布了实际的错误消息,它也可以帮助其他人。如果您实际向我们展示了几行human行。)