За последние 24 часа нас посетили 65426 программистов и 1625 роботов. Сейчас ищут 1028 программистов ...

простое построение запроса

Тема в разделе "MySQL", создана пользователем streamland, 11 апр 2013.

  1. streamland

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

    С нами с:
    16 апр 2012
    Сообщения:
    79
    Симпатии:
    0
    Возник следующий вопрос по построению запроса

    Выборка идет по трем критериям
    марка=======модель========год
    Код (Text):
    1.  
    2. $result = mysql_query("SELECT * FROM add_new_car , image_add_car where id_add_car = user_id and mark like '%$model%' and model like '%$SelectCarModel' AND year like '%$year' ORDER BY id_add_car" );
    Это запрос выдает результат если я укажу все три критерия запроса иначе нет результата.
    Но как в этом запросе сделать так что бы когда я укажу только марку он выдал бы результат по марке.
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    $result = mysql_query("SELECT * FROM add_new_car , image_add_car where mark like '%$model%' ORDER BY id_add_car" );
     
  3. streamland

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

    С нами с:
    16 апр 2012
    Сообщения:
    79
    Симпатии:
    0
    Но ведь кто то выберет просто модель а кто то будет делать выбор по всем трем критериям а как тогда быть?
     
  4. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну а что мешает собирать условия в массив а потом заимплодить его по AND ?
     
  5. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    isset() и empty() помогут
     
  6. streamland

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

    С нами с:
    16 апр 2012
    Сообщения:
    79
    Симпатии:
    0
    А данный запрос не может работать если не не выбраны остальные два критерия модель========год
     
  7. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    круг замкнулсо
     
  8. streamland

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

    С нами с:
    16 апр 2012
    Сообщения:
    79
    Симпатии:
    0
    igordata Вы как то говорили не пользоваться htmlspecialchars до ввода в бузу.
    Это с чем связанно?
     
  9. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а зачем?
     
  10. streamland

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

    С нами с:
    16 апр 2012
    Сообщения:
    79
    Симпатии:
    0
    Функция htmlspecialchars - функция выполняют очень важную работу, она преобразует специальные символы в HTML-сущности.

    Что вообще такое HTML-сущности? Это специальные символы типа: < > » ' и т. д.

    Зачем нужно их преобразования? Давайте рассмотрим пример. У вас есть гостевая книга в которой любой пользователь может оставить запись. А что будет если он оставит не просто запись, а какой либо скрипт или специальный хакерский код? Ваш сайт будет испорчен. Возможно он не будет взломан, но он будет сто процентов испорчен. Дак вот смысл этой функции все скрипты преобразовать в неработоспособное состояние.
     
  11. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Ну и включите голову =) еще раз прочитайте свой вопрос, мой ответ, и описание функции.
     
  12. streamland

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

    С нами с:
    16 апр 2012
    Сообщения:
    79
    Симпатии:
    0
    Добавлено спустя 2 минуты 50 секунд:
    Я просто не понимаю смысла Вашего ответа
    т е означает ли это
    ведь есть другие функции которые выполняют эту работу лучше чем htmlspecialchars. Так?
     
  13. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    нет. в пхп есть сотни функций. зачем вы применяете функцию, не задумываясь о том, какие задачи она решает? примените сразу сотню-другую, авось поможет.

    выводите пользовательский вывод - всегда надо пропускать через htmlspecialchars. если вы этого правила придерживаетесь - вам не надо пропускать пользовательские данные заранее через нее. ибо если два раза пропустите - будет косяк. пропускаете один раз всегда в одном и том же месте - там где по задумке эта функция должна быть. при выводе на страницу.
     
  14. streamland

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

    С нами с:
    16 апр 2012
    Сообщения:
    79
    Симпатии:
    0
    igordata
    :) Вот теперь красава всё ясно! Спасибо!

    Добавлено спустя 15 минут 29 секунд:
    Возвращусь к вопросу я так понял мне нужно построить что то по типу такого:
    Код (Text):
    1. if(isset($_GET['hyb']))
    2.           {
    3.             $keyword = mysql_real_escape_string($_GET['hyb']);
    4.             $query   = "SELECT * FROM ***** WHERE _subModel LIKE $keyword";
     
  15. jenya777777

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

    С нами с:
    16 мар 2010
    Сообщения:
    562
    Симпатии:
    0
    Вместо AND надо указать OR
    И производить поиск по LIKE имхо не верно. Тем более по 3 критерием.
     
  16. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Быть этого не может
    Код (Text):
    1. SELECT * FROM t1 WHERE a LIKE "%test%" AND b LIKE "%"
    Вернёт все варианты. Возможно, у вас второй и третий параметр не совсем пустой, например содержит символ пробела
     
  17. streamland

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

    С нами с:
    16 апр 2012
    Сообщения:
    79
    Симпатии:
    0
    topas
    Сделал такое вот изменение в запросе т е убрав
    Код (Text):
    1. LIKE
    Код (Text):
    1.  
    2. $result = mysql_query("SELECT * FROM add_new_car,image_add_car where id_add_car = user_id and mark=".$mark."" );
    И стал получать ощибку
    Ввожу в БД в таком виде
    Код (Text):
    1.  
    2.  $mark =  htmlspecialchars( trim($_POST['mark']));         //Марка
    3.   $model = htmlspecialchars( trim($_POST['model']));
     
  18. streamland

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

    С нами с:
    16 апр 2012
    Сообщения:
    79
    Симпатии:
    0
    Странно так выдаёт ощибку Unknown column 'Audi' in 'where clause'

    [SRC]$result = mysql_query("SELECT * FROM add_new_car,image_add_car where id_add_car = user_id and mark=".$mark."" );[/SRC]

    а если меняю [SRC] mark=".$mark."[/SRC] на [SRC] mark='$mark'[/SRC]
    Выдает результат.
     
  19. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    кавычки где-то
    используй mysql_real_escape - из примера будет ясно как и зачем
     
  20. streamland

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

    С нами с:
    16 апр 2012
    Сообщения:
    79
    Симпатии:
    0
    а делать ли паралельно с mysql_real_escape также trim т е
    Код (Text):
    1. $mark =  mysql_real_escape( trim($_POST['mark']));
     
  21. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    лучше при формировании запроса непосредственно, ибо функция коверкает строку добавляя слешики.
    соотв это можно сделать только один раз, и делать это надо при формировании запроса.
     
  22. streamland

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

    С нами с:
    16 апр 2012
    Сообщения:
    79
    Симпатии:
    0
    ок!спасибо!
     
  23. streamland

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

    С нами с:
    16 апр 2012
    Сообщения:
    79
    Симпатии:
    0
    На странице поиска делаю выборку по ниже приведенному запросу и получаю результат как показано на рисунке.
    Код (Text):
    1. $result = mysql_query("SELECT * FROM `add_new_car`,`image_add_car` where id_add_car = user_id and mark='$model' and model='$mark' and year='$year'ORDER BY image_id_add_car");
    Код (Text):
    1. id_image_add_car=user_id
    2.             602 386 2   images/1365172947.jpg   images/small_1365172947.jpg
    3.             601 386 2   images/1365172945.jpg   images/small_1365172945.jpg
    4.             600 386 2   images/1365172942.jpg   images/small_1365172942.jpg
    5.             599 386 2   images/1365172940.jpg   images/small_1365172940.jpg
    6.             598 384 2   images/1365172691.jpg   images/small_1365172691.jpg
    7.             597 384 2   images/1365172688.jpg   images/small_1365172688.jpg
    8.             596 384 2   images/1365172685.jpg   images/small_1365172685.jpg
    9.             595 384 2   images/1365172683.jpg   images/small_1365172683.jpg
    10.             594 384 2   images/1365172679.jpg   images/small_1365172679.jpg
    11.             593 384 2   images/1365172677.jpg   images/small_1365172677.jpg
    у каждого объявления могут быть несколько имеджей т е из таблички видно 4шт -user_id= 386 и 6шт-user_id = 384
    но их на странице поиска не должно быть видно т е должно быть от каждого объявления по одной фотки.
    А у меня получается цикл повторяет для каждого обявления количество user_id и т о получается если обявлений 5 и у каждого по 5 имеджей то на странице поиска печатается 25 строк как видно на рисунке .

    [​IMG]

    Получилось
    http://php.ru/forum/viewtopic.php?f=13&t=39979&start=60
     
  24. streamland

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

    С нами с:
    16 апр 2012
    Сообщения:
    79
    Симпатии:
    0
    Код (Text):
    1.  
    2. $where = array();
    3. $whereclause = '';
    4.  
    5. if (!empty($mark)) {
    6.     $where[] = "a.mark = '$model'";
    7. }
    8. if (!empty($model)) {
    9.     $where[] = "a.model = '$mark'";
    10. }
    11. if (!empty($year)) {
    12.     $where[] = "a.year = $year";
    13. }
    14. if (count($where > 0)) {
    15.     $whereclause = join(' AND ', $where);
    16.  }
    17.  
    18. /*
    19. if (count($where > 0)) {
    20.     $whereclause = 'WHERE ' . join(' AND ', $where);
    21. }
    22. */
    Код (Text):
    1.  
    2. $result = mysql_query("SELECT * FROM `add_new_car` AS a INNER JOIN `image_add_car` AS b ON
    3.  
    4.                  a.id_add_car = b.user_id WHERE (b.user_id, b.id_image_add_car) IN (SELECT user_id, MIN(id_image_add_car)
    5.                  
    6.  FROM image_add_car GROUP BY user_id) AND ".$whereclause." ORDER BY a.id_add_car");
    Могли бы подсказать почему условие наверху работает не корректно?
    Т е если я выбираю только МОДЕЛЬ результата не необходимо указать также и марку.