【问题标题】:Condensing series of mySQL queries浓缩系列的mySQL查询
【发布时间】:2016-05-14 10:47:15
【问题描述】:

我有一系列查询来查找给定用户名的问题。查询在 user 表中找到与用户名关联的 userID,然后在 user_question 表中找到附加到 userID 的 questionID,然后在 question 表中找到附加到 questionID 的问题。

由于我的数据库结构遵循第二范式并将不同的实体存储在不同的表中(用户、问题等),因此需要跨多个表进行多个查询。

是否可以将一系列查询压缩为 1) 需要更少代码和 2) 需要更少查询的东西?

username = escape(req.query.username);

client.query("SELECT userID FROM user WHERE username = \"" + username + "\"", function(err, result) {
    if (err !== null) {
        console.log(err);
    }
    else {
        client.query("SELECT questionID FROM user_question WHERE userID = " + result[0]["userID"], function(err, result) {
            if (err !== null) {
                console.log(err);
            }
            else {
                client.query("SELECT question FROM question WHERE questionID = " + result[0]["questionID"], function(err, result) {
                    if (err !== null) {
                        console.log(err);
                    }
                    else {
                        //handle question
                    }
               });
        });
 });

编辑:下面的 K. Bastian 给出了正确答案。现在使用的代码是:

var query = 
    `SELECT 
        q.question 
    FROM 
        question q 
        JOIN user_question uq ON q.questionID = uq.questionID 
        JOIN user u ON u.userID = uq.userID 
    WHERE  
        u.username = \"` + username + `\"`;

client.query(query, function(err, result) {
    //Handle
});

编辑:在 K. Bastian 还指出 node-mysql 库能够转义用户输入字符串(而不是 JS 执行该功能)之后,我也实现了这一点,进一步简化了代码。

var query = 
    `SELECT 
        q.answer  
    FROM 
        question q 
        JOIN user_question uq ON q.questionID = uq.questionID 
        JOIN user u ON u.userID = uq.userID 
    WHERE  
        u.username = ` + client.escape(req.query.username);

client.query(query, function(err, result) {
    //Handle result...
});

【问题讨论】:

    标签: javascript mysql database


    【解决方案1】:

    您可以将您的查询放在一个...

    像这样?

    select 
        q.question 
    from 
        question q
        JOIN user_question uq ON q.questionID = uq.questionID
        JOIN user u ON u.userID = uq.userID
    WHERE 
        u.username = \"" + username + "\"
    

    顺便说一句...这看起来像是一个潜在的 sql 注入部分... \"" + username + "\"

    【讨论】:

    • 在文件顶部创建变量 username 并使用 JS 函数 'escape()' 删除任何注入字符 - 你能解释一下为什么你仍然认为它可能存在风险吗?跨度>
    • 我不确定这是如何从您的库中的 javascript 处理的...您使用什么从 javascript 与 mysql 进行通信?节点mysql?
    • 也许你看看这个:github.com/felixge/node-mysql#escaping-query-values 这个库有自己的转义函数并允许为参数定义占位符。我不知道它们的行为是否与默认的 javascript 转义函数不同,但值得一看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    相关资源
    最近更新 更多