За последние 24 часа нас посетили 51264 программиста и 1810 роботов. Сейчас ищут 869 программистов ...

Форма поиска по товарам

Тема в разделе "PHP для новичков", создана пользователем Lestat621, 22 окт 2012.

  1. Lestat621

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

    С нами с:
    6 июн 2012
    Сообщения:
    41
    Симпатии:
    0
    Как производится форма поиска, через гет или пост.
    Если через гет а у меня тысяча выборок (например по брендам, типам и тд) то получается полная каша.
    Если пост, тогда после поиска, я не смогу отсортировать по имени или странице.
    Может быть уже кто то делал данную функцию, есть примеры как она должна выглядеть?

    Добавлено спустя 26 минут 35 секунд:
    Наверное мало инфы предоставил.
    Например есть запрос:
    Получить все товары где бренд 'htc' и 'apple', категория 'мобильники', а прайс ограничен от и до. В sql это будет выглядеть так:
    Код (Text):
    1.  
    2. SELECT brand.title_b, product.title_p,product.price
    3. FROM product, brand, selection
    4. WHERE product.brand = brand.id AND product.selection = selection.id
    5. AND selection.title_url = 'mobile' AND (brand.title_url = 'apple' OR brand.title_url = 'htc') AND (product.price BETWEEN '0' AND '13000')
    Но как мне получить информацию из формы (form)? методом GET или POST? А то даже не могу понять от чего отталкиваться.
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    можно генерить некий идентификатор попытки поиска со всеми её параметрами. Отправлять постом, получать этот идентификатор, и дальше пихать его во все запросы. Через пару суток - убивать.
     
  3. Neka

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

    С нами с:
    16 янв 2010
    Сообщения:
    188
    Симпатии:
    0
    Вон, у корпорации добра полная каша в QueryString, и ничего. Тогда чего вам волноваться?

    http:// somesite.ru/search.php?cat=mobile&brands=htc,apple&maxcost=13000&mincost=0&page=5

    Или бренды по ID
    http:// somesite.ru/search.php?cat=mobile&brands=5,14&maxcost=13000&mincost=0&page=5

    Вполне адекватные запросы
     
  4. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Предлагаю такую схему:
    - со страницы критериев поиска уходит запрос (GET или POST) не принципиально
    - обработчик находит нужные записи и помещает все id_записей во временное хранилище. для задачи не суть важно будет ли это файловый кеш или особая таблица. главное чтобы этому результату соответствовал некий ID_поиска. делается редирект на страницу результатов с указанием ID_поиска.
    - при измении сортировки, или переходе на другую страницу результатов (это все GET запросы), этот ID_поиска будет постоянно присутствовать в параметрах. Т.о. не будет повторного поиска т.к. это затратная операция. не надо заново передаваться 100500 критериев поиска.

    http //mysite.com /search.php?result=162537123&sort=name.desc&page=2
     
  5. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    кажися я сказал то же самое, только не так презентабильно =(
     
  6. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    а, ну вроде да. сразу не понял тебя )))
     
  7. Lestat621

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

    С нами с:
    6 июн 2012
    Сообщения:
    41
    Симпатии:
    0
    В запрос все это получается запихнуть:
    Код (Text):
    1.  
    2.     if(isset($_GET['brand'])){
    3.         $brand = "";
    4.         $search_brand = $_GET['brand'];
    5.         foreach($search_brand as $word_brand){
    6.             $where_list_brand[] = " brand.title_url = '$word_brand' ";
    7.         }
    8.         $where_claus_brand = implode(' OR ', $where_list_brand);
    9.         $brand .= " AND($where_claus_brand) ";
    10.     }
    Но как потом вернуть это в url строку чтобы в дальнейшем создать ссылку например на сортировку по имени или постраничный вывод.
    Код (Text):
    1.  
    2. <a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'&order=' . $order . '">'.$i."</a>
    В данном случае весь мой запрос по чекбоксам слетает в никуда.
    То есть когда запрос в ГЕТ один там понятно, это не массив и все легко.
    А в данном случае как повторно получить $get['brand']?

    Добавлено спустя 8 минут 10 секунд:
    Тупанул, не разобравшись в ответах, а каким образом ид поместить во временное хранилище? Сессии?

    Добавлено спустя 10 минут 17 секунд:
    Не очень понимаю как генерировать id с запросом. Не сама функция генерации id а именно как запрос запихнуть в id.
    То есть result у меня будет равняться какому то определенному ид. Но как в этом ид будет содержатся запрос?
     
  8. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    редиректом =)

    Добавлено спустя 20 секунд:
    сессии или бд

    Добавлено спустя 1 минуту 44 секунды:
    што? =)
     
  9. Lestat621

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

    С нами с:
    6 июн 2012
    Сообщения:
    41
    Симпатии:
    0
    Если точнее не очень представляю действия.

    То есть, пользователь создал некий запрос с определенными данными и передал их серверу постом.
    Как в дальнейшем сохраняется этот запрос.

    Каким образом в резулт занести его?
     
  10. Lestat621

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

    С нами с:
    6 июн 2012
    Сообщения:
    41
    Симпатии:
    0
    Neka, а как получить результат "&brands=htc,apple". Бренды через запятую.
    Ведь инпуты в массиве:
    Код (Text):
    1.  
    2. <input type="checkbox" name="selection[]" value="table" />Планшеты<br />
    3. <input type="checkbox" name="selection[]" value="mobile" />Телефоны<br />
    Дают результат:
    test.php?selection[]=table&selection[]=mobile
     
  11. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    в бд параметры засунь =)
     
  12. Lestat621

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

    С нами с:
    6 июн 2012
    Сообщения:
    41
    Симпатии:
    0
    А, можно этот пункт подробнее, каким образом это осуществляется?
     
  13. Lestat621

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

    С нами с:
    6 июн 2012
    Сообщения:
    41
    Симпатии:
    0
    А если тупо создать сессию с результатом.
    Код (Text):
    1.  
    2. session_start();
    3.             if(isset($_POST['selection'])){
    4.                
    5.                 $selection = "";
    6.                 $search_selection = $_POST['selection'];
    7.                 foreach($search_selection as $word_selection){
    8.                     $where_list_selection[] = " selection.title_url = '$word_selection' ";
    9.                 }
    10.                 $where_claus_selection = implode(' OR ', $where_list_selection);
    11.                 $selection .= " AND($where_claus_selection) ";
    12.                 $_SESSION['selection'] = $selection;
    13.             }
    14.             if(isset($_SESSION['selection'])){
    15.                 $select = $_SESSION['selection'];
    16.             }else{
    17.                 $select = "";
    18.             }
    После чего в запросе у меня всегда будет присутствовать моя переменная $select с данными.
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    сессию не кинешь другу :D
     
  15. Lestat621

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

    С нами с:
    6 июн 2012
    Сообщения:
    41
    Симпатии:
    0
    Проблема сессии в том что не могу после этого выставить отмечен или нет checkbox.
    Самый приемлемый вариант это помещать гетом в одну строку через запятую:
    search.php?cat=mobile&brands=htc,apple
    Но как это реализовать не могу найти, весь инет уже облазил.
    Может быть есть какой то пример рабочей функции?
     
  16. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    можешь =)
    тоже неплохо
    что именно?

    какой? засовывающей в строку? о_О
     
  17. Lestat621

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

    С нами с:
    6 июн 2012
    Сообщения:
    41
    Симпатии:
    0
    Вот такой пример.
    Каким образом бренды идут через запятую?

    Добавлено спустя 4 минуты 14 секунд:
    Например на озон.
    Пользователь нажимает на бренд, бренд добавляется в get через запятую.
     
  18. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  19. Lestat621

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

    С нами с:
    6 июн 2012
    Сообщения:
    41
    Симпатии:
    0
    Вы профессионально расшатываете нервы и так уже расшатанные данной задачей.
     
  20. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    в чём вопрос состоит? как получить значения текстовых инпутов?
    рекомендую использовать jQuery:
    $('input').val();
    как их склеить в одну строку все? плюсиком
     
  21. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Чтобы лучше понимать форму с кучей чекбоксов.

    brands.php
    Код (PHP):
    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <title>Brands</title>
    5. <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    6. </head>
    7. <body>
    8. <form action="brands.php" method="get">
    9. <?php
    10.  
    11. // Debug info
    12. if (isset($_GET['brand'])) {
    13.     echo 'brand[] = ' . var_export($_GET['brand'], TRUE) . "<br/>\n";
    14. }
    15.  
    16. for ($i = 1; $i <= 9; ++$i) {
    17.     $checked = isset($_GET['brand']) && in_array($i, $_GET['brand']) ? 'checked="checked" ' : '';
    18.  
    19. ?>
    20.     <label><input type="checkbox" name="brand[]" value="<?php echo $i ?><?php echo $checked ?>/>Brand #<?php echo $i ?></label><br/>
    21.  
    22. <?php
    23.  
    24. }
    25.  
    26. ?>
    27.     <p><input type="submit" name="sent" value="OK" /></p>
    28. </form>
    29. </body>
    30. </html>
    Добавлено спустя 6 минут:
    Я думаю посетителю по барабану будут в URLе номера брендов через запятую или через другую бяку. Главное чтобы работало.
     
  22. Lestat621

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

    С нами с:
    6 июн 2012
    Сообщения:
    41
    Симпатии:
    0
    В принципе с этим я разобрался.
    А чем грозит то что я убрал весь запрос в сессию? То есть при каждом новом поиске, старая сессия удаляется, и создается новая и конечно новый запрос.
    Как ты сказал,
     
  23. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    тем что не сделать закладку и не послать другу
     
  24. Колбася

    Колбася Активный пользователь

    С нами с:
    12 дек 2011
    Сообщения:
    722
    Симпатии:
    0
    А почему говорят что самописные поисковики для поиска по сайту почти всегда неочень?
     
  25. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    напиши, узнаешь =)