Использование переменной в предложении WHERE MySQL / Node - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь сделать запрос MySQL для фильтрации данных из таблицы. Фактически, я хочу сделать следующее:

SELECT data FROM table WHERE column IN ?

Фильтр исходит из флажков в форме на веб-странице, поэтому я могу довольно легко передать массив или объект, но это ' будет различное количество параметров для IN каждый раз, поэтому я не могу использовать их несколько?. Я попытался создать for l oop, чтобы несколько запросов объединяли массивы, возвращаемые запросами, но у меня возникли проблемы с областью видимости. Я также пытался передать массив непосредственно в запрос, но это вызывало синтаксическую ошибку. Я уверен, что на это есть простой ответ, но я не уверен, как это сделать.

Изменить: добавлен исходный код:

Вот где я:

const filterShowQuery = `SELECT sl_Show.showId, sl_Band.BandName,
      sl_Show.date, sl_Venue.venueName,
      sl_Show.length, sl_Show.attendance, sl_Show.encore FROM sl_Show 
      JOIN sl_Band on sl_Show.BandID = sl_Band.BandId
      JOIN sl_Venue on sl_Show.VenueId = sl_Venue.VenueId
      WHERE sl_Band.BandName IN (?)
      ORDER BY sl_Band.BandName;`;

Пытаетесь поместить массив в? в WHERE sl_Band.BandName IN

const getShows = (req, res,next) =>{
  var {bands, venues} = req.body;
  var i = 0;  //left over from previous attempt
  var data = [];
  for (b in bands){
    mysql.pool.query(filterShowQuery, bands[b], (err, result) => {
      if(err){
        console.log('filter band error');
        next(err);
        return;
      }

    data = data.concat(result);
    console.log(data); //data concatenates property and increases through for loop
    })
// same action to be performed with venues once solved
//  for (v in venues){
//    conditions[i] = venues[v];
//  i++;
    console.log(data);  //data is empty when logging from here or using in res
    res.json({rows:data});
  }
}

1 Ответ

0 голосов
/ 07 августа 2020

ПРЕДУПРЕЖДЕНИЕ О БЕЗОПАСНОСТИ!

Я должен сказать: НИКОГДА, НИКОГДА НЕ ПЕРЕДАЙТЕ ДАННЫЕ НАПРЯМУЮ НА ВАШ SQL!

Если вы не Не знаю почему, просто введите в Google SQL Injection . Существует множество примеров того, как это делается, насколько легко это можно сделать и как защитить ваше приложение от такого рода атак.

Вы всегда должны параметризовать свои запросы. Но в очень редком случае, когда вам действительно нужно вставить данные, объединяющие строку, в ваш sql, , проверьте его раньше. (Например) Если это число, используйте Regex или какой-либо вспомогательный метод, чтобы проверить, действительно ли значение, которое вы вставляете в свою SQL String, представляет собой число и ничего больше.

Но кроме этого, вы не предоставили никакого исходного кода, поэтому очень сложно оказать какую-либо помощь, прежде чем вы это сделаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...