У меня есть api (с node.js и mysql):
localhost:4001/api/?id=555,666
localhost:4001/api/?id=555
В select я проверяю, имеет ли параметр запятую (',') следующим образом:
...
if (id.includes(",")) {
return '${field} IN (?);'
} else {
return '${field} = ?'
}
...
... получить такой результат:
SQL: "SELECT * FROM table WHERE id IN (555,666)"
SQL: "SELECT * FROM table WHERE id=555;"
Он отлично работает, если я фильтрую значения fix. Но как насчет фильтрации LIKE?
Например, если я фильтрую несколько имен, я делаю это:
localhost:4001/api/?name=money,invest,stocks
localhost:4001/api/?name=money,invest
localhost:4001/api/?name=money
...
if (name.includes(",")) {
return '${field} IN (?)'
} else {
return '${field} LIKE ?'
}
...
Result:
SQL: "SELECT * FROM table WHERE name IN (money,invest,stocks)"
SQL: "SELECT * FROM table WHERE name IN (money,invest)"
SQL: "SELECT * FROM table WHERE name LIKE money;"
... но я бы хотел, чтобы это было:
Goal:
SQL: "SELECT * FROM table WHERE name LIKE '%money%' OR name LIKE '%invest%' OR name LIKE '%stocks%';"
SQL: "SELECT * FROM table WHERE name LIKE '%money%' OR name LIKE '%invest%';"
SQL: "SELECT * FROM table WHERE name LIKE money;"
Как мне изменить свой запрос?
Вот пример, но прочтите соображения о SQL Injection ниже:
var name = "money,invest,stocks";
var str = "SELECT * FROM table WHERE ";
if (name.includes(",")) {
var names = name.split(",");
names.map((o,i)=>{
str += "name LIKE '%"+o+"%' ";
(i==names.length -1)?str += "":str += "OR ";
})
} else{
str += "name LIKE '%"+name+"%' ";
}
console.log(str);
Вы можете использовать .split()
для преобразования строки в массив и .map()
для итерации нового массива.
Я не знаю, какой драйвер вы используете, но если вы вставляете запрос так же, как в приведенном выше примере, ваш код подвергается SQL Injection, чтобы предотвратить это, вы должны использовать подготовленные инструкции. Поэтому, если вы используете библиотеку mysql в nodejs, пример будет примерно таким:
var name = "money,invest,stocks";
var str = "SELECT * FROM table WHERE ";
if (name.includes(",")) {
var names = name.split(",");
names.map((o,i)=>{
names[i] = '%'+o+'%';
str += "name LIKE ? ";
(i==names.length -1)?str += "":str += "OR ";
})
} else{
str += "name LIKE ? ";
}
console.log(str);//SELECT * FROM table WHERE name LIKE ? OR name LIKE ? OR name LIKE ?
console.log(names);//[ '%money%', '%invest%', '%stocks%' ]
И в запросе вы должны передать все параметры в виде массива (имена в этом случае) следующим образом:
connection.query(str,names,function(err,rows){
//connection.release();
if(!err) {
//further code
}
});
${field} IN (?)
? Я думаю, мне нужно как-то разделить (',') входные данные и перебрать значения и вернуть их ... но как