簡體   English   中英

通過針對node.js mysql查詢的預准備語句的多個通配符

[英]Multiple wildcards via prepared statements for node.js mysql query

我有一個像這樣的JSON:

{"name":[{"tag":"Peter"}]}

而且我正在動態構建帶有多個通配符的准備好的語句,如下所示:

var sqlVar;
sqlVar += existParams.map(field => {
    if (field === 'name') {
        function getValues(item, index) {
          var getVal = [item.tag];
          return `${field} LIKE ?`;
        }
        return '('+name.map(getValues).join(' OR ')+')';
    } else {
        return `(${field} = ?)`
    }
}).join(" AND ");

var sql = "SELECT * FROM names "+sqlVar+"";

connection.query(sql,
    ... 
    function getValues(item, index) {
      var getVal = [item.tag];
      return '%' + getVal + '%';
    }
    return name.map(getValues);

    //Further attempts
    //var getResult = name.map(getValues);
    //return getResult.split(",");
    //return name.map(getValues).join(', ');        

    , function(err, rows) {
    ...
});

如果我有一個價值,那就很好。 在console.log(SQL)中,我可以看到:

SELECT * FROM names WHERE (name LIKE ?)

但是...如果我有多個值,例如:

{"name":[{"tag":"Peter"},{"tag":"Jack"}]}

我收到一個SQL錯誤:

sql: 'SELECT * FROM names WHERE (name LIKE \'%Peter%\', \'%Jack%\' OR name LIKE ?) }

...因此第二個值不會移到第二個位置。

...但是結果應該是:

sql: 'SELECT * FROM names WHERE (name LIKE \'%Jack%\' OR name LIKE \'%Peter%\') }

...因此在console.log(sql)中:

SELECT * FROM names WHERE (name LIKE ? OR name LIKE ?)

我缺少什么?如何獲得第二個LIKE的第二個值,依此類推?

這是一個類似的示例,但是只有一個值: nodejs通過預准備語句向MySQL拋出錯誤,如查詢

此處導致結果語句的唯一原因是'SELECT * FROM names WHERE (name LIKE \\'%Peter%\\', \\'%Jack%\\' OR name LIKE ?)

是您傳遞了一個嵌套數組,該數組的值為[['%Peter%', '%Jack%']]而不是一個固定的數組。

使用給定的對象說,

const source = {"name":[{"tag":"Peter"}, {"tag":"Jack"}]}

然后,准備好的語句的查詢值應為

const queryValues = source.name.map(({tag}) => `%${tag}%`);
// [ '%Peter%', '%Jack%' ]

connect.query(sql, queryValues, (err, rows) => {
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM