За последние 24 часа нас посетили 157915 программистов и 2074 робота. Сейчас ищут 1146 программистов ...

SQL-запрос, выбрать сразу несколько строк

Тема в разделе "PHP для новичков", создана пользователем desertFox, 25 янв 2015.

  1. desertFox

    desertFox Активный пользователь

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    Добрый день.

    Запрос на выборку сразу нескольких строк,

    1) вот такой работает:
    Код (Text):
    1. SELECT * FROM table WHERE id IN(1,2,3);
    2) а вот так уже не работает:
    Код (Text):
    1. SELECT * FROM table WHERE brand IN(audi,bmw,bugatti);
    В этом и вопрос, как сделать выборку нескольких строк, где идёт сравнение не с числом, а со словом?
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    для начала покажи мне где у тебя тут строки. вооот. нет у тебя строк. строки в кавычки заключены. должны быть.
     
  3. desertFox

    desertFox Активный пользователь

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    Передаю массив названий, потом делаю строку, слова разделены запятой.

    Код (Text):
    1. $brand = $_POST['brand'];
    2.  
    3.   $brand = implode(",", $brand);
    4.   $brand = mysqli_real_escape_string($db, $brand);
    5.  
    6.  
    7.   $sql = "SELECT {$tbl_model}.`id`
    8.         FROM `{$tbl_model}`
    9.             WHERE {$tbl_model}.`brand` IN({$brand})";
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    нет, это у тебя пхп знает что там строки. а в мускул ты передаешь запрос в текстовом виде. и парсер уже ничего не знает про строки так как весь запрос пришел к нему одной большой строкой. попробуй имплодить не только по запятой но и по апострафам для приличия. и в запросе тоже не забудь строку обозначить.
     
  5. desertFox

    desertFox Активный пользователь

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    а понял))))
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  7. desertFox

    desertFox Активный пользователь

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    в общем сделал так:

    Код (Text):
    1. $brand = $_POST['brand'];
    2.  
    3.   $brand = implode("','", $brand);
    4.   //$brand = mysqli_real_escape_string($db, $brand);
    5.  
    6.  
    7.   $sql = "SELECT {$tbl_model}.`id`
    8.       FROM `{$tbl_model}`
    9.           WHERE {$tbl_model}.`brand` IN('{$brand}')";
    Работает, но мне ещё пришлось закомментить mysqli_real_escape_string($db, $brand), иначе вместо такой строки * IN('audi','bmw','bugatti') * получается - * IN('audi\',\'bmw\',\'bugatti') *, т.е. экранирует.

    А как же теперь без mysqli_real_escape_string($db, $brand) от SQL инъекций подстраховаться?
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    значит наверное надо не итоговую склейку эскейпить а каждое значение в массиве. это же очевидно.
     
  9. desertFox

    desertFox Активный пользователь

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    исправил,

    Код (Text):
    1. $brand = $_POST['brand'];
    2.  
    3. foreach ($brand as $key => $value)
    4. {
    5.   $brand[$key] = mysqli_real_escape_string($db, $brand[$key]);
    6. }
    7.  
    8. unset($key, $value);
    9.  
    10. $brand = implode("','", $brand);
    11.  
    12. $sql = "SELECT {$tbl_model}.`id`
    13.         FROM `{$tbl_model}`
    14.         WHERE {$tbl_model}.`brand` IN('{$brand}')";
    вроде всё нормально, работает, всех благодарю за помощь