【问题标题】:How do I remove backticks in formatted mysql query?如何在格式化的 mysql 查询中删除反引号?
【发布时间】:2020-02-28 01:15:21
【问题描述】:

好的,我已经使用 npm 包“xlsx”在 excel 中提取了一些值,我想使用格式化结果运行 MySql 查询。

Excel 提取

    let wb= xlsx.readFile(filePath);         //GET WORKBOOK
    let ws= wb.Sheets[wb.SheetNames[0]];     //SELECT THE FIRST SHEET IN THE ARRAY
    let data= xlsx.utils.sheet_to_json(ws);  //CONVERT DATA TO JSON OBJECT
    let s ='';                               //CREATE VARIABLE TO HOLD FORMATTED STRING
    for(let i=0; i<data.length; i++){
        s+= "'" + data[i].id +"',";       //FORMAT OBJECT TO STRING
    }
    let fullString= s.substr(0, s.length-1); //STORE FORMATED STRING IN VARIABLE REMOVING FINAL COMMA (,)

格式化的字符串是这样的:

'2019-0027178','2019-0027179','2019-0027180','2019-0027181','2019-0027182','2019-0027183'

MySql 查询是这样的:

SELECT name, email, phone FROM persons WHERE id IN (?),
[fullString]

预期结果:

一个包含请求信息的 json 对象,如下所示:

[{name: "John", email: "john.doe@email.com", phone: "123456789"}, ... ]

实际结果:

一个像这样的空数组:

[]

调查与思考

我发现反引号被添加到查询字符串中,如下所示:

... WHERE id IN (`'2019-0027178','2019-0027179','2019-0027180','2019-0027181','2019-0027182','2019-0027183'`)

实际实际主要问题:

我做错了什么还是有正确的方法可以做到这一点?

编辑!

所以对于一个问号,即。 ... WHERE id in (?),我得到了如上所述的空对象。但是对于两个问号,即。 ... WHERE id IN (??),我收到这个错误:

{
    "code": "ER_BAD_FIELD_ERROR",
    "errno": 1054,
    "sqlMessage": "Unknown column ''2019-0027178','2019-0027179','2019-0027180','2019-0027181','2019-0027182','2019-0027183' in 'where clause'",
    "sqlState": "42S22",
    "index": 0,
    "sql": "SELECT name, email, phone FROM persons WHERE id IN (`'2019-0027178','2019-0027179','2019-0027180','2019-0027181','2019-0027182','2019-0027183'`)"
}

【问题讨论】:

  • 为了防止 sql 注入,它是 exscaping 参数,您必须使用动态 sql 执行此操作 - 参数化将不起作用。或将元素添加到表中并进行连接
  • "... 或将元素添加到表格并进行连接" 请解释该部分。

标签: mysql node.js npm xlsx


【解决方案1】:

好的,所以我想我可以在执行之前“准备”查询。

~解决方案~

在将fullString 作为参数传递给查询字符串之前,我没有这样做let fullString= s.substr(0, s.length-1);,而是这样做了:

let fullString= `SELECT name, email, phone FROM persons WHERE id IN (${s.substr(0, s.length-1)})`;

然后通过fullString 代替实际查询的位置。

谢谢。

【讨论】:

    【解决方案2】:

    假设您有一个名为 personfilter 的表,其中包含 key 和 personid 列。 然后您生成一个唯一的密钥。例如 27。那么下面的代码会做你想做的事:

    INSERT INTO personfilter(key,personid)
      values
         (27, '2019-0027178'),
         (27, '2019-0027179'),
         (27, '2019-0027180'),
         (27, '2019-0027181'),
         (27, '2019-0027182'),
         (27, '2019-0027183')
    

    然后你可以做以下选择

    SELECT name, email, phone 
    FROM persons
    JOIN personfilter on personfilter.key = 27 and personfilter.personid = persons.id
    

    【讨论】:

    • 不等...这意味着在插入 'personfilter' 表之前,我必须确切知道 excel 文件中的内容...否则怎么办我使用 Node 将多个值插入到表中
    • 是的,你会的。你得到一个唯一的数字(可能是当前时间戳?)用那个键添加它们,然后调用你的请求。哦,看你现在也有所有过滤器的历史。很好的副作用。
    猜你喜欢
    • 1970-01-01
    • 2018-02-09
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 2018-08-02
    相关资源
    最近更新 更多