Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: интерфейс функции "поиска"

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
DlTA
Отправлено: 18 Февраля, 2015 - 18:00:42
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




суть проблемы
в очередной раз пишу класс чего то там
и мне нужно в системе делать выборку объектов по фильтрам, (вес, дата, длина, ....)

мне известны 2 варианта как это реализовывать
1) в функцию выборки передаются много параметров, каждый из которых соответствуюет какому либо из критериев поиска fun(a,b,c,d, ...)
2) в функцию передается массив (ассоциативный) и на основе того чему равны значения делать выборку fun([a=>vA, b=>vB, ...])

но чет мне эти оба варианта не по душе
может у кого есть более интересные варианты?
 
 Top
GoDr
Отправлено: 18 Февраля, 2015 - 19:02:24
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




а чем не по душе то? Передавай массив..
PHP:
скопировать код в буфер обмена
  1. // наши данные
  2. $data['param1'] = 'val1';
  3. $data['param2'] = 'val2';
  4. $data['param3'] = 'val3';
  5.  
  6. // делаем запрос
  7. qqq($data);
  8.  
  9.  
  10. function qqq($data = array())
  11. {
  12.     $where = array();
  13.  
  14.     // формируем условие
  15.     foreach ($data as $key => $value) {
  16.         $where[] = "`" . $key . "`='" . $value . "'";
  17.     }
  18.     // окончательный запрос
  19.     $sql = "SELECT * FROM `table` WHERE " . implode(' AND ', $where);
  20.  
  21.     // смотрим что получилось
  22.     echo $sql;
  23. }


ну или смотри ещё func_get_args(), но это будут уже навороты


-----
Система управления веб-содержимым Lotos CMS
 
 Top
Мелкий Супермодератор
Отправлено: 18 Февраля, 2015 - 19:05:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Текучий интерфейс фильтров, говорящий на языке предметной области.
PHP:
скопировать код в буфер обмена
  1. $rObjectCollection = \Object::search()
  2. ->date('требуемая дата')
  3. ->weight('требуемый вес')
  4. ->execute();


-----
PostgreSQL DBA
 
 Top
DlTA
Отправлено: 18 Февраля, 2015 - 22:23:37
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




Мелкий пишет:
Текучий интерфейс фильтров
ну вроде красиво, теперь другой момент
получается что для каждого фильтра нужно лепить отдельный класс, если я хочу чтоб IDE мне корректно подсказывала имеющиеся методы (PHPDoc)
или есть еще варианты?
(Добавление)
GoDr пишет:
а чем не по душе то? Передавай массив..

вообще из-за отсутствия стандартов в написании параметров, а посему очень легко допустить ошибку

и хочется по максимуму переложить подсказку на IDE
 
 Top
DelphinPRO
Отправлено: 18 Февраля, 2015 - 23:33:04
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




DlTA пишет:
получается что для каждого фильтра нужно лепить отдельный класс, если я хочу чтоб IDE мне корректно подсказывала имеющиеся методы (PHPDoc)


Текучий интерфейс основан на возврате $this в методах. И PHPDoc это прекрасно понимает.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
DlTA
Отправлено: 19 Февраля, 2015 - 09:00:45
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




DelphinPRO пишет:
Текучий интерфейс основан на возврате $this в методах. И PHPDoc это прекрасно понимает.
это при условии что я для каждого такого фильтра пишу отдельный класс

прикинул что можно сделать некий класс с методами __call
а дальше его наследовать , и в наследнике в секции PHPDoc у класса
описывать
PHP:
скопировать код в буфер обмена
  1. /**
  2.  *
  3.  * @method Mag fun1() fun1(mixed $var) ...
  4.  * @method Mag fun2() fun2(mixed $var) ...
  5.  */
  6. class Mag
 
 Top
Sail
Отправлено: 19 Февраля, 2015 - 09:59:10
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




DlTA пишет:
DelphinPRO пишет: пишет:

Текучий интерфейс основан на возврате $this в методах. И PHPDoc это прекрасно понимает.
это при условии что я для каждого такого фильтра пишу отдельный класс

Однако, не отдельный класс, а метод в классе, для которого определяется набор фильтров.
 
 Top
Мелкий Супермодератор
Отправлено: 19 Февраля, 2015 - 09:59:49
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Как раз-таки для каждого фильтра объектов лепить свой класс. Иначе на языке предметной области вы говорить не сможете и получите банальнейший query builder.


-----
PostgreSQL DBA
 
 Top
GoDr
Отправлено: 19 Февраля, 2015 - 15:28:24
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




Цитата:
вообще из-за отсутствия стандартов в написании параметров, а посему очень легко допустить ошибку
Не вижу проблему. Опиши в классе допустимые поля таблиц: не совпало - викинь. Опиши правил для значений: получил значение - проверь его или приведи к нужному типу.

А предусмотреть в проекте все фильтры.. ну как-то не разумно.. Конечно если есть только одна таблица и узкая задача.... Подмигивание


-----
Система управления веб-содержимым Lotos CMS
 
 Top
DlTA
Отправлено: 19 Февраля, 2015 - 17:15:56
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




GoDr пишет:
Не вижу проблему. Опиши в классе допустимые поля таблиц: не совпало - викинь. Опиши правил для значений: получил значение - проверь его или приведи к нужному типу.
проблема? а кто говорил о проблеме, я в поиске более логично практичного и удобного решения, так как те что юзаю меня не устраивают, они громоздкие и/или сложно стандартизируются
 
 Top
GoDr
Отправлено: 19 Февраля, 2015 - 21:00:44
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




DlTA, ну суть наверное заключается что бы ты в своей IDE начинал вводить код (или Ctrl+Spase), а тебе подсказки ? Закатив глазки

куда ещё логичнее передать массив... Хотя можно создать и красивый вариант.
CODE (htmlphp):
скопировать код в буфер обмена
  1. class Search
  2. {
  3.     public $ves = 0;
  4.     public $massa = 0;
  5.     public $rost = 0;
  6.     public $vozrast = 0;
  7. }
  8.  
  9. $where = new Search();
  10.  
  11. $where->ves = 40;
  12. $where->massa = 50;
  13. $where->rost = 232;



вот картинка PhpStorm.. очень красиво даже Язычок
Прикреплено изображение (Нажмите для увеличения)
Без-имени-1.png


-----
Система управления веб-содержимым Lotos CMS
 
 Top
DlTA
Отправлено: 19 Февраля, 2015 - 21:11:31
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




GoDr, если обратить внимание не первый пост, то там видно, что это всего лишь один из тех вариантов (похожий) , которые юзать не хочеться, из за своей громоздкости
в чем громоздкость? показываю
к примеру нужно передать пол десятка параметров
PHP:
скопировать код в буфер обмена
  1. $oSh = new Search;
  2. $oSh->wes=$_GET['wes'];
  3. //...
  4. $oSh->massa=$_GET['massa'];
если сильно со стороны посмотреть, то заметно что мы вынужнены постоянно "копипастить" одно и тоже (создал класс и погнал подставлять значения)

текучий интерфейс выглядит круто но так же требует мороки, но зато можно валидацию прям в него всунуть


но я таки решил упростить жизнь и передать массив
СObj::filter($_GET)
и уже внутри валидация параметров и т.д.
 
 Top
GoDr
Отправлено: 19 Февраля, 2015 - 21:20:24
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




DlTA пишет:
но я таки решил упростить жизнь и передать массив
СObj::filter($_GET)

ну тогда уж вообще просто так
Зачем же передавать Глобальный массив Улыбка
Я частенько таким балуюсь.. Просто вызываю метод, а в нём уже вся обработка


-----
Система управления веб-содержимым Lotos CMS
 
 Top
DlTA
Отправлено: 19 Февраля, 2015 - 21:22:07
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




GoDr пишет:
Зачем же передавать Глобальный массив
Я частенько таким балуюсь.. Просто вызываю метод, а в нём уже вся обработка

зря,
а если нужно будет вызывать фильтр не из формы а из другого места? вот и прийдется все переделывать
 
 Top
GoDr
Отправлено: 19 Февраля, 2015 - 21:26:00
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




ничего не понял... Если ты передаёшь $_GET в функцию, то в функции нужно создать локальная переменная , которая является копией $_GET. Если её не передавать, то можно просто напрямую использовать $_GET без создания локальных переменных.. И при чём тут "вызывать фильтр не из формы а из другого места"

(Отредактировано автором: 19 Февраля, 2015 - 21:26:31)



-----
Система управления веб-содержимым Lotos CMS
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB