ФорумПрограммированиеPHP для идиотов → составление предложения WHERE по данным с формы поиска

составление предложения WHERE по данным с формы поиска

  • AndryG

    Сообщения: 237 Репутация: N Группа: Адекваты

    Spritz 21 мая 2009 г. 7:16

    Доброго, господа!
    Имеем форму с полями для поиска.
    Приходит на сервер запрос - нужно по данным поиска отобрать записи (составить предложение WHERE).

    Кто что умного может сказать ? :)

    Я вижу вариантов два:
    либо постоянная часть WHERE
          WHERE 
    (:is_club = -1 OR usr.is_club = :is_club) AND
    (:id = '' OR usr.id = :id ) AND
    (:active = -1 OR usr.active = :active ) AND
    (:email = '' OR usr.email LIKE :email ) AND
    (:name = '' OR usr.title LIKE :name OR
    usr.name LIKE :name OR usr.fam LIKE :name) AND
    (:is_club <> -1 OR :id <> '' OR :active <> -1 OR
    :email <> '' OR :name <> '')


    Либо формировать по кускам.
    Если уж собирать кусками, то можно и улучшить поиск:
    для числовых данных ввести варианты "<10" "!=5" "3<<6"
    и т.п.

    Принимается как опыт реализации, так и мысли …
  • phpdude

    Сообщения: 26632 Репутация: N Группа: в ухо

    Spritz 21 мая 2009 г. 7:34, спустя 17 минут 51 секунду

    я бы тебе посоветовал заюзать DudeSql если я правильно понял :)) хотя это конечно имхо :)
    Сапожник без сапог
  • adw0rd

    Сообщения: 22908 Репутация: N Группа: в ухо

    Spritz 21 мая 2009 г. 7:35, спустя 1 минуту 11 секунд

    А я бы посоветовал поюзать goDB http://pyha.ru/go/godb/intro/
    adw/0
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 21 мая 2009 г. 7:36, спустя 1 минуту 17 секунд

    а я бы посоветовал юзать ORM
    propel
    doctrine
  • adw0rd

    Сообщения: 22908 Репутация: N Группа: в ухо

    Spritz 21 мая 2009 г. 7:37, спустя 34 секунды

    AndryG, это что за недоSQL? Это тема относиться к БД или к библиотекам по работе с БД?
    adw/0
  • AndryG

    Сообщения: 237 Репутация: N Группа: Адекваты

    Spritz 21 мая 2009 г. 7:56, спустя 18 минут 43 секунды


    я бы тебе посоветовал заюзать DudeSql если я правильно понял :)) хотя это конечно имхо :)

    А ссылку можно? Не находит гугля ничего похожего (точнее похожего дофига)


    А я бы посоветовал поюзать goDB http://pyha.ru/go/godb/intro/
    Не то немного. Вопрос не в выполнении скрипта запроса, а составлении его части.

    adw0rd , он не "недо".
    Повторю вопрос:
    имеем форму с десятком различных полей для поиска (рост вес цвет глаз размер обуви расса лысый? и и т.п.)
    Хочу найти лысую девочку с 45 размером ноги, у которой глаза нет.
    Заполняю поля поиска.

    Теперь на сервере нужно составить запрос … "верхняя" его часть будет стабильна, а вот предложение where будет изменяться.
    Теперь вопрос … "реализация построения предложения where в зависимости от выбранных условий поиска, учитывая их тип, допустимы варианта поиска и .т.д и т.п.
  • adw0rd

    Сообщения: 22908 Репутация: N Группа: в ухо

    Spritz 21 мая 2009 г. 8:06, спустя 10 минут 12 секунд

    AndryG,

    1. ну у тебя это что за синтаксис?
    2. может переместить тему в http://pyha.ru/forum/board/3.0 ? Раз тут про PHP особо ничего и нет…
    adw/0
  • adw0rd

    Сообщения: 22908 Репутация: N Группа: в ухо

    Spritz 21 мая 2009 г. 8:07, спустя 1 минуту 6 секунд

    Просто не пойму что такое:
    (:title
    в каждой строке…
    adw/0
  • Troy

    Сообщения: 2532 Репутация: N Группа: Джедаи

    Spritz 21 мая 2009 г. 8:23, спустя 15 минут 38 секунд

    смайлы =))
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 21 мая 2009 г. 8:26, спустя 3 минуты 26 секунд

    AndryG, с помощью СКЛБилдера можно строить where как бы построчно. То есть, будет перебираться массив с полученными из формы данными, и в зависимости от их наличия (а возможно ещё и типа данных) будет добавляться данное условие к поиску или не будет учитываться вовсе.

    п.с. А в целом не совсем понятен вопрос. Ты спрашиваешь нужно ли так делать, или делать по-другому, но чтоб было точно также как и в первом варианте, только "чтоб буквы были синего цвета".
  • Baboot

    Сообщения: 440 Репутация: N Группа: Адекваты

    Spritz 21 мая 2009 г. 8:44, спустя 17 минут 39 секунд

    я тож если чесн не понял до конца.
    Парси  $_POST(или $_Get) а дальше описывай условия билда:


    $arrData = $_POST; //или $_GET, я не знаю

    //достаешь типы полей в таблице вида ("имя поля"=>тип). где тип "string" или "num"
    $typeOfField = $DB->getTypeOfField($tableName);

    $exp = array();
    $forLastEntry = array(); //для последнего вхождения
    foreach($arrData as $nameF=>$dataF)
    {
      if($typeOfField[$nameF]=="string")
      {
          $exp[] = "(:".$nameF." = '' OR usr.".$nameF."  = :".$nameF.")";
          $forLastEntry[] = $nameF."<> ''";
       }

      if($typeOfField[$nameF]=="num")
      {
          $exp[] = "(:".$nameF." = -1 OR usr.".$nameF."  = :".$nameF."   )";
          $forLastEntry[] = $nameF."<> -1";
      }

    //тут же описывай все остальные ЛУСЫ по котором у тя генериться будет
    }

    $implLastEntr = "(".implode(' OR ', $forLastEntry).")";
    $where = "WHERE ".implode(' AND ', $exp)." AND ".$implLastEntr;

    //потом склеивай весь sql

  • Baboot

    Сообщения: 440 Репутация: N Группа: Адекваты

    Spritz 21 мая 2009 г. 9:00, спустя 16 минут 30 секунд

    тока я ее нихуя не тестил сам там посмотри по месту. Писал по примеру, который ты дал. И title откуда там вылез тож нихуя не понял.
  • AndryG

    Сообщения: 237 Репутация: N Группа: Адекваты

    Spritz 21 мая 2009 г. 9:25, спустя 24 минуты 48 секунд

    Ладно у меня вчера был прохфессиональный праздник … а вы то что тУпите? :)
    Первый пост …
    два варианта решения задачи:
    либо статичный WHERE (именно он и нарисован)
     :word  – это параметр .. именно так их описывают в стандартах SQL. (у меня в PHP отдельная процедура потом их преображает в пресловутые ?)

    А смысл предложения where из первого поста такой:
    (:is_club = -1 OR usr.is_club = :is_club) AND – Если :IS_CLUB минус один – не учитываем этот параметр, иначе выбрать записи учитывая это поле
           (:id      = '' OR usr.id      = :id     ) AND –если :ID пустой. то не учитываем его, иначе .. .учитываем!!!
           (:is_club <> -1 OR :id <> '') – хотя бы один из параметров ДОЛЖЕН быть введен. (это затычка от "не вводим параметры и получаем ВСЕ записи")


    либо НЕ статичный … другими словами конструируемый нами.

    Вот я и спрашиваю .. кто как делает? И если второй вариант, то интересны подробности реализации.

    Один из примеров заморочиться:
     хотим устроить отбор по числовому полю.
     Есть поле "Размер ноги" .. мы вводим
       10   – получаем "where table.razmer = :razmer"
       >46 – получаем "where table.razmer > 46"
      5<<6 – получаем "where table.razmer between 5 and 6"

    А ещё иногда юзеры хотят маску влепить (like)  и пофиг им, что поле числовое … посему
     вводит юзер "2%4" .. надоть сделать в итоге "where cast(table.razmer as char(40)) like :razmer"

    и т.д. и т.п.

    Пример я показал на одном поле … мы же имеем десяток полей .. надо заиметь кучку таких условий через AND собраных.

    ___
    P.S.
    title - одно из полей таблицы.
  • AndryG

    Сообщения: 237 Репутация: N Группа: Адекваты

    Spritz 21 мая 2009 г. 9:28, спустя 2 минуты 48 секунд


    AndryG, с помощью СКЛБилдера можно строить where как бы построчно…

    Что за зверь имеется ввиду? Можно ссылку?
  • adw0rd

    Сообщения: 22908 Репутация: N Группа: в ухо

    Spritz 21 мая 2009 г. 9:29, спустя 1 минуту 35 секунд

    AndryG, а у нас пыхослет! :)
    adw/0

Пожалуйста, авторизуйтесь, чтобы написать комментарий!