Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript数组作为字符串列表(保留引号)_Javascript_Arrays_Node.js - Fatal编程技术网

javascript数组作为字符串列表(保留引号)

javascript数组作为字符串列表(保留引号),javascript,arrays,node.js,Javascript,Arrays,Node.js,我有一个字符串数组。当我使用.toString输出它时,引号不会被保留。这使得使用in构建mysql查询变得非常困难。考虑以下事项: SELECT * FROM Table WHERE column IN ('item1','item2','item3','item4') toString is returning: IN (item1,item2,item3,item4) 这里一定有一个我忽略的简单修复。简单修复是自己添加引号 for(var i=0; i<items.length;

我有一个字符串数组。当我使用.toString输出它时,引号不会被保留。这使得使用in构建mysql查询变得非常困难。考虑以下事项:

SELECT * FROM Table WHERE column IN ('item1','item2','item3','item4')

toString is returning: IN (item1,item2,item3,item4)

这里一定有一个我忽略的简单修复。

简单修复是自己添加引号

for(var i=0; i<items.length; i++){
    items[i] = "'" + items[i] + "'";
}

var list_with_quotes = items.join(",");
请注意,我在这里完全忽略了SQL注入问题。

存储引号:

var names = ["'item1'","'item1'","'item3'"];
alert('IN (' + names[1] + ')'); // IN ('item1')

引号不会被保留,因为它们实际上不是字符串值的一部分,它们只是指示代码中字符串文字所必需的

所以,不要使用toString。相反,一种方法是:

var arr = ['item1','item2','item3','item4'];

var quotedAndCommaSeparated = "'" + arr.join("','") + "'";

// quotedAndCommaSeparated === "'item1','item2','item3','item4'"
该方法返回一个字符串,该字符串将所有数组元素连接成单个字符串,每个项目之间带有可选分隔符。因此,如果指定包含引号和逗号的分隔符,则只需分别为第一项和最后一项手动附加起始引号和结束引号

请告诉我您没有使用客户端JavaScript来形成SQL

编辑:要允许空数组,请为结果字符串包含一个默认值,否则正如missingno所指出的,该字符串将为:

如果使用if arr.length==0执行其他操作,而不是运行SELECT语句,可能更合适。

使用Array.map将每个元素用引号括起来:

items.map(function(item) { return "'" + item + "'" }).join(',');
ES6功能使代码变得更简单—在node.js 4.0及更高版本中实现了箭头函数和模板字符串:

items.map(i => `'${i}'`).join(',');
您还可以使用白名单来防止SQL注入:

const validItems = new Set(['item1', 'item2', 'item3', 'item4']);

items
   .filter(i => validItems.has(i))
   .map(i => `'${i}'`)
   .join(',')

输出:选择。。。。从…起在'key1'和'key2'中的哪个id

您正在用JavaScript准备一个MySQL查询。。。嗯。。。SQL Injectional是否允许您使用服务器端javascript?是的,除非这只是一个快速原型,否则您应该知道,在客户机上生成SQL本质上是让任何人都可以完全访问您的数据库。不管是否通过HTTPs,用户只需打开调试器并注入即可。很抱歉,破坏了您对sql注入的兴趣。我有一个内部全文搜索堆栈,它返回我需要在mysql中查找的记录的索引。Node_Mysql有一个bug,它阻止数组被正确地传入,所以我正在寻找解决方法。我最终找到了一个尚未进入核心的补丁:谢谢你的建议。不,我不是在为那些sql注入老鼠构建蜜罐来利用。空数组的正确行为应该是什么?空引号还是空字符串@漏掉了没有-好的观点。我不确定如果结果被连接到一个SQL字符串中,需要做什么-最好不要运行SELECT语句。不过,很容易修复-我会更新我的答案…我花了2个小时,这个答案非常接近我需要的lol-无论如何,我试图保留数组中的引号,这样我就可以将所有内容转换为CSV格式,并对一些文本使用逗号。我是通过使用csv+=''+row.join','+'';如果项目中包含引号或撇号,则会引发语法错误。确保对每个项目进行预处理。例如,在postgres中加上双撇号。
const validItems = new Set(['item1', 'item2', 'item3', 'item4']);

items
   .filter(i => validItems.has(i))
   .map(i => `'${i}'`)
   .join(',')
let keys = ['key1','key2']
let keyWithQoutes = keys.map((it) => {return `'${it}'`})
let sql = `SELECT .... FROM ... WHERE id IN (${keyWithQoutes})`
console.log(sql)