Возник следующий вопрос по построению запроса Выборка идет по трем критериям марка=======модель========год Код (Text): $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" ); Это запрос выдает результат если я укажу все три критерия запроса иначе нет результата. Но как в этом запросе сделать так что бы когда я укажу только марку он выдал бы результат по марке.
$result = mysql_query("SELECT * FROM add_new_car , image_add_car where mark like '%$model%' ORDER BY id_add_car" );
Но ведь кто то выберет просто модель а кто то будет делать выбор по всем трем критериям а как тогда быть?
Функция htmlspecialchars - функция выполняют очень важную работу, она преобразует специальные символы в HTML-сущности. Что вообще такое HTML-сущности? Это специальные символы типа: < > » ' и т. д. Зачем нужно их преобразования? Давайте рассмотрим пример. У вас есть гостевая книга в которой любой пользователь может оставить запись. А что будет если он оставит не просто запись, а какой либо скрипт или специальный хакерский код? Ваш сайт будет испорчен. Возможно он не будет взломан, но он будет сто процентов испорчен. Дак вот смысл этой функции все скрипты преобразовать в неработоспособное состояние.
Добавлено спустя 2 минуты 50 секунд: Я просто не понимаю смысла Вашего ответа т е означает ли это ведь есть другие функции которые выполняют эту работу лучше чем htmlspecialchars. Так?
нет. в пхп есть сотни функций. зачем вы применяете функцию, не задумываясь о том, какие задачи она решает? примените сразу сотню-другую, авось поможет. выводите пользовательский вывод - всегда надо пропускать через htmlspecialchars. если вы этого правила придерживаетесь - вам не надо пропускать пользовательские данные заранее через нее. ибо если два раза пропустите - будет косяк. пропускаете один раз всегда в одном и том же месте - там где по задумке эта функция должна быть. при выводе на страницу.
igordata Вот теперь красава всё ясно! Спасибо! Добавлено спустя 15 минут 29 секунд: Возвращусь к вопросу я так понял мне нужно построить что то по типу такого: Код (Text): if(isset($_GET['hyb'])) { $keyword = mysql_real_escape_string($_GET['hyb']); $query = "SELECT * FROM ***** WHERE _subModel LIKE $keyword";
Быть этого не может Код (Text): SELECT * FROM t1 WHERE a LIKE "%test%" AND b LIKE "%" Вернёт все варианты. Возможно, у вас второй и третий параметр не совсем пустой, например содержит символ пробела
topas Сделал такое вот изменение в запросе т е убрав Код (Text): LIKE Код (Text): $result = mysql_query("SELECT * FROM add_new_car,image_add_car where id_add_car = user_id and mark=".$mark."" ); И стал получать ощибку Ввожу в БД в таком виде Код (Text): $mark = htmlspecialchars( trim($_POST['mark'])); //Марка $model = htmlspecialchars( trim($_POST['model']));
Странно так выдаёт ощибку 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] Выдает результат.
а делать ли паралельно с mysql_real_escape также trim т е Код (Text): $mark = mysql_real_escape( trim($_POST['mark']));
лучше при формировании запроса непосредственно, ибо функция коверкает строку добавляя слешики. соотв это можно сделать только один раз, и делать это надо при формировании запроса.
На странице поиска делаю выборку по ниже приведенному запросу и получаю результат как показано на рисунке. Код (Text): $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): id_image_add_car=user_id 602 386 2 images/1365172947.jpg images/small_1365172947.jpg 601 386 2 images/1365172945.jpg images/small_1365172945.jpg 600 386 2 images/1365172942.jpg images/small_1365172942.jpg 599 386 2 images/1365172940.jpg images/small_1365172940.jpg 598 384 2 images/1365172691.jpg images/small_1365172691.jpg 597 384 2 images/1365172688.jpg images/small_1365172688.jpg 596 384 2 images/1365172685.jpg images/small_1365172685.jpg 595 384 2 images/1365172683.jpg images/small_1365172683.jpg 594 384 2 images/1365172679.jpg images/small_1365172679.jpg 593 384 2 images/1365172677.jpg images/small_1365172677.jpg у каждого объявления могут быть несколько имеджей т е из таблички видно 4шт -user_id= 386 и 6шт-user_id = 384 но их на странице поиска не должно быть видно т е должно быть от каждого объявления по одной фотки. А у меня получается цикл повторяет для каждого обявления количество user_id и т о получается если обявлений 5 и у каждого по 5 имеджей то на странице поиска печатается 25 строк как видно на рисунке . Получилось http://php.ru/forum/viewtopic.php?f=13&t=39979&start=60
Код (Text): $where = array(); $whereclause = ''; if (!empty($mark)) { $where[] = "a.mark = '$model'"; } if (!empty($model)) { $where[] = "a.model = '$mark'"; } if (!empty($year)) { $where[] = "a.year = $year"; } if (count($where > 0)) { $whereclause = join(' AND ', $where); } /* if (count($where > 0)) { $whereclause = 'WHERE ' . join(' AND ', $where); } */ Код (Text): $result = mysql_query("SELECT * FROM `add_new_car` AS a INNER JOIN `image_add_car` AS b ON 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) FROM image_add_car GROUP BY user_id) AND ".$whereclause." ORDER BY a.id_add_car"); Могли бы подсказать почему условие наверху работает не корректно? Т е если я выбираю только МОДЕЛЬ результата не необходимо указать также и марку.