2017-01-30 51 views
2

我有一个简单的nodejs应用程序,它执行以下查询。在mysql节点中的IN子句

select * from User where userid in (?) 

我得到的用户ID是一个JSON数组从客户端发送。我如何在这个选择查询中使用它?我试过 1.本身但不工作。 2.将它转换为Javascript数组,不工作

+2

份额的代码。 –

+0

你可以这样做:select * from User where userid in(?,?,?,?) –

回答

0
  1. 将JSON数组展开为所需格式的字符串。使用'+'连接查询。 (小心SQL注入)
  2. 动态添加'?'使用持有用户ID的JSON数组的长度。然后使用该数组来提供用户ID。

这些是我尝试的两种方法。两者都有效。然后我用一种更好的方法改变了我的逻辑,所以现在我不再需要'in'子句了。

+0

方法#1是引入SQL注入的好方法。 – robertklep

+0

我以为是。对不起,我忘了在回答中添加。这就是为什么我改变了我的方法。 –

0

你可以这样做:(?,?,?,) SELECT * FROM用户凡在用户ID

var array = []; 
array.push(value); 
array.push(value); 
array.push(value); 
array.push(value); 

然后使用数组作为参数那应该是绑定的。

+1

这对于具有恒定大小的数组很好,但如果大小可以变化呢? – Aaron

+0

您必须添加?动态,因为我在我的项目中使用 –

+0

我扩展了json数组到一个字符串在所需的格式,然后只是与查询字符串+。那是不好的方法? –

0

重温这一点,因为问题的原始方法是有效的,但有一些注意事项。如果您唯一的转义参数是IN子句中的参数,那么您必须将其指定为嵌套数组;如:[[''usrId1','usrId2','usrIdN']]。这是因为un-escaping功能需要一个数组,取代每个'?'与相应的数组元素。所以,如果你想替换你唯一的'?'对于一个数组,该数组应该是所有传递参数的第一个元素。如果你有多个“?”,语法更直观,但最后一致;在这种情况下,你可以有类似于你的论点: 'myOtherArgument1', 'myOtherArgument2',[ 'usrId1', 'usrId2', 'usrIdN'], 'myOtherArgument3']