Node.js API - Выберите, где как для нескольких значений в строке с разделителями-запятыми

0

У меня есть 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;"

Как мне изменить свой запрос?

  • 0
    Не уверен на 100%, что вы собираетесь, но помогает ли это? Выберите * из your_table, где «name», например, «% money,%» или имя, например «% invest,%»;
  • 0
    Да ... но как мне изменить эту часть: return ${field} IN (?) ? Я думаю, мне нужно как-то разделить (',') входные данные и перебрать значения и вернуть их ... но как
Показать ещё 3 комментария

1 ответ

0
Лучший ответ

Вот пример, но прочтите соображения о 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
      }
    });
  • 0
    не уверен, кто это сделал
  • 0
    @PhilippM, я обновил ответ некоторыми соображениями по поводу SQL-инъекций

Ещё вопросы

Сообщество Overcoder
Наверх
Меню