【问题标题】:How do I insert a variable into a mysql LIKE query?如何将变量插入到 mysql LIKE 查询中?
【发布时间】:2021-08-04 07:42:59
【问题描述】:

我最近一直在设计一个后端 Web 服务器,主要用于处理来自 mysql 数据库的数据。服务器采用 DOM 格式设计,带有一个控制器文件夹和一个 app.js

我已经实现了一些这种格式的 GET、POST PUT 请求

这是一个 GET 请求的样子

 app.get("/movies/:movieID/", (req, res, next) => {
      const movieID = parseInt(req.params.movieID);
      // if userID is not a number, send a 400.
      if (isNaN(movieID)) {
        res.status(400).send();
        console.log("Error has occured with getting movieID")
        return;
      }
    
      movies.findByID(movieID, (error, movie) => {
        if (error) {
          res.status(500).send();
          console.log("get Id has error")
          return;
        };
        
        if (movie === null) {
          res.status(404).send();
          console.log("movie ID is invalid")
          return;
        };
        
        //console.log(movie)
        res.status(200).send(movie);
        console.log("Successful movie ID")
      });
    });

这是在控制器文件夹中

,findByID: function (movieID, callback) {
        var dbConn = db.getConnection();
        const findMovieByIDQuery = "select * from movies left join genres on movies.genreid = genres.genreid left join reviews on reviews.movieid = movies.movieid where movies.movieid = ?;";
        dbConn.connect(function (err) {
           if (err) {
              console.log(err);
              return callback(err, null);
           } else {
               dbConn.query(findMovieByIDQuery, [movieID], (error, results) => {
                   dbConn.end();
                   if(error) {
                       return callback(error, null);

                   } 
                   else if (results.length === 0) {
                    callback(null, null);
                    return;
                };

                console.log(results)
                return callback(null, results[0]);
            });
        }
    });
}

我是如何实现获取用户输入的,在这种情况下是一个数字,然后根据 ?位置。

但是,我现在正在尝试创建用户能够基于字符串而不只是 ID 号进行搜索的方法。

这是我目前的代码

app.get("/movies/:movieKeyword", (req, res, next) => {
  console.log("Reached the app.js")
  movies.findByKeyword((error, moviesAvailable) => {
    if (error) {
      console.log(error);
      res.status(500).send();
    };
    res.status(200).send(moviesAvailable);  
  });
});


,findByKeyword: function(callback) {
            console.log("Reached find by keyword")
            var dbConn = db.getConnection();
            const findAllMoviesQuery = "SELECT title, description, cast, time, opening_date, picture from movies WHERE title LIKE '% ? %';"
            dbConn.connect(function (err){
                dbConn.query(findAllMoviesQuery, (error, results) => {
                    if (error) {
                        return callback(error, null);
                    };
                    console.log(results)
                    return callback(null, results);
                });
            });
        }

要在 mysql 中使用 LIKE 查询,我需要以这种格式存储变量:“% ? %”

但是,由于程序无法将变量插入到 ?这次是在 2 个引号和 2 个百分比符号内

【问题讨论】:

  • 您的代码甚至没有尝试插入变量值?你用的是哪个mysql包?
  • 无论如何,解决方案可能是使用字符串组合在% 符号之间插入dbConn.escape(keyword)
  • 到目前为止你尝试过什么?你被困在哪里了?另外,请不要使用不相关的标签 - 否则请解释此问题与 servermysql-workbenchbackend 的关系。

标签: javascript mysql server mysql-workbench backend


【解决方案1】:

这是一个看起来安全且适合我的解决方案:

const keyword = "Test";
const escaped = keyword.replace(/[^a-z0-9]/gi, ""); // prevent injection
const like = `%${escaped}%`;                        // add percentage symbols
const query = "SELECT * FROM movies WHERE `title` LIKE ?";

conn.query(query, [like], function (err, rows) {
    if (err) throw err;
    else console.log(rows);
});

我发现没有办法使用库函数来转义搜索词,所以我只是替换了所有非字母数字字符。然后我添加百分号并将其插入到查询中,就像任何其他字符串一样。

延伸阅读:MySQL Injection by LIKE operator

【讨论】:

  • 我试图寻找有关LIKE 查询的现有答案,但一无所获。一般来说,这都是关于插入字符串的。通过简单地将百分比符号添加到搜索词中,基本上就是:将字符串插入到查询中。我决定发布一个答案,但如果有人向我指出合适的重复项,我很乐意将其删除。
【解决方案2】:

我认为您可以使用模板文字。这是一个资源,Template Literals。您可以删除百分号并用此语法替换它们${variable_name}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    相关资源
    最近更新 更多