Javascript 如何使用动态数组进行mysql查询

Javascript 如何使用动态数组进行mysql查询,javascript,mysql,arrays,node.js,Javascript,Mysql,Arrays,Node.js,我有两个数组,如下所示 var fieldarray = [ 'category', 'bookid', 'bookauthor', 'booktitle', 'price', 'publication', 'publication_date' ] var

我有两个数组,如下所示

var fieldarray =  [ 'category',
                    'bookid',
                    'bookauthor',
                    'booktitle',
                    'price',
                    'publication',
                    'publication_date' ]

var dataarray =  [ 'fantasy',
                    '',
                    'JKR',
                     '',
                     '',
                     '',
                     '' ]
select category,bookid,bookauthor,booktitle,price,publication,publication_date from tbl_books where category like '%fantasy%' OR bookauthor like '%JKR%'
fieldarray和dataarray中元素的每次计数都相同,但元素不同,在数据数组中,某些元素可以为空

我必须在mysql语句中使用这些数组

var fieldarray =  [ 'category',
                    'bookid',
                    'bookauthor',
                    'booktitle',
                    'price',
                    'publication',
                    'publication_date' ]

var dataarray =  [ 'fantasy',
                    '',
                    'JKR',
                     '',
                     '',
                     '',
                     '' ]
select category,bookid,bookauthor,booktitle,price,publication,publication_date from tbl_books where category like '%fantasy%' OR bookauthor like '%JKR%'
如何基于nodejs中的fiedarray和dataarray元素动态生成mysql语句

 var filters = [];

 dataarray.forEach((val, index) => {
   if(val)
    filters.push(`${fieldarray[index]} like '%${val}%'`);
 });

var result = `select ${fieldarray.join(",")} from tbl_books where ${filters.join(" OR ")} `;

只需迭代dataarray,检查字段是否为空,并将其连接到结果查询。始终确保舒尔不会受到SQL注入的影响

使用reduce准备一张地图,首先链接数据字段

var map = fieldarray.reduce( ( a, c, i ) => ( dataarray[i] && (a[c] = dataarray[i]), a ) , {}) ; 
现在使用join和map动态准备查询

演示

变量fieldarray=['category', “bookid”, “图书作者”, “书名”, "价格",, "出版",, “发布日期” ] var dataarray=['fantasy', , “JKR”, , , , ]; var map=fieldarray.reducea,c,i=>dataarray[i]&&a[c]=dataarray[i],a,{}; var query=SELECT+fieldarray.join,+来自tbl_书籍,其中+Object.keysmap.mapf=>f+与“%+map[f]+%”类似。join和;
console.logquery;此答案易受SQL注入的影响。例如:。不过,这对标识符不起作用。@Ilja OP应该在之前明确地转义这两个数组。或者干脆不手动转义,而是使用占位符,除非是在列和表名的情况下。白名单是一种很好的方法。您应该明确使用一个允许查询的mysql模块……这也为SQL注入打开了。@IljaEveriläYes,共享了硬编码值的替代方法。@JonasW。斯巴雷?没有得到你的答案。这仍然是开放的sql注入vie参数:/@JonasW。现在它是一个参数化查询。您能详细说明一下这是如何对sql注入开放的吗?