![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
Denwer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 19.6.2007 Где: Харьков Репутация: нет Всего: нет |
Есть табличка с тремя полями (f1,f2,f3)
Есть 3 раскрывающих списка на сайте, которые содержат такие же значения как и в таблице. Как организовать поиск? понятно что если я выберу значения во всех трех списках запрос будет идти так $query = "SELECT * FROM ".TABLE_USERS." WHERE f1='$z1' AND f2='$z2' AND f2='$z3'"; если скажем я выберу значение только в первом списке то запрос таков $query = "SELECT * FROM ".TABLE_USERS." WHERE f1='$z1''"; Вариантов выбора получается 9. Не делать же мне кучу проверок на то какие списки я выбрал и следовательно к ним запрос. А если будет 5 полей, то головоломка увеличиться на 5 в квадрате Может кто сталкивался или знает как решить проблему, или знает того кто знает ПОМОГИТЕ !!! Это сообщение отредактировал(а) Denwer - 3.12.2009, 01:12 |
|||
|
||||
Pitlord |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 246 Регистрация: 31.10.2009 Репутация: 4 Всего: 7 |
||||
|
||||
Aumn |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 3.12.2009 Репутация: нет Всего: нет |
Неплохое решение, но на мой взгляд слишком уж громоздкое. Он к сути и сводится к тому, что при увеличении кол-ва полей увеличивается кол-во строк обработки. Я предлагаю следующий вариант. С условием того, что у Вас все названия полей имеют идентичный вид (что упрощает реализацию собственно), можно проверить на заполненность и составить запрос небольшим циклом.
Вместо тройки вставляете необходимое Вам значение кол-ва полей. Это сообщение отредактировал(а) Aumn - 5.12.2009, 05:15 |
|||
|
||||
MaXL |
|
|||
![]() Developer ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 24.10.2005 Где: Владивосток Репутация: нет Всего: 2 |
Я так понял необходимые поля в БД текстовые.
А что если не выбранным полям присвоить значение %. И тогда просто сформировать запрос следующим образом:
-------------------- MaXL |
|||
|
||||
Aumn |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 3.12.2009 Репутация: нет Всего: нет |
К сожалению, я тут помочь Вам не могу, так как не знаю структуру БД и поля (тип, вводимая информация и т.д.) Я проверил свой код, он работает для любого числа полей и типа вводимой информации. Поэтому если вы дадите полные данные, возможно я свогу Вам помочь.
|
|||
|
||||
Ипатьев |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2232 Регистрация: 5.7.2009 Репутация: 28 Всего: 37 |
MaXL, боюсь, такой запрос не вернет ничего.
Aumn, у вас в таблице поля всегда так называются - буква с цифрой? Если нет - то к чему изобретать такой заведомо нежизнеспособный код? Разрешите дать вам один совет. Как человеку, который решил отвечать на вопросы оптом, даже не глядя на дату последнего сообщения. Пишите код только в том случае, если вы уже использовали его раньше, в сходной ситации. А не придумывая его на ходу. |
|||
|
||||
Simpliest |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: 1 Всего: 3 |
Вариант номер раз.
Извращение номер два'с
А вообще это все глупости ![]() |
||||
|
|||||
Ипатьев |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2232 Регистрация: 5.7.2009 Репутация: 28 Всего: 37 |
в итоге код получился немного больше, чем в варианте Pitlord-а. и в разы сложнее. затрудняя отладку и чтение
а можно посмотреть пример, как биндинг решает данную проблему? Это сообщение отредактировал(а) Ипатьев - 5.12.2009, 12:27 |
|||
|
||||
Simpliest |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: 1 Всего: 3 |
Отладку и чтение? ![]()
Добавлено через 13 минут и 11 секунд Если имеется в виду Извращение номер два'с то это именно извращение, которое никогда никому не потребуется и не может быть применено. Хотя и рабочее ![]() Первый же вариант за исключением части с array_walk & mysql_real_escape_string я использовал раньше очень часто. Он легко справляется и с десятками полей ![]() В варианте Pitlord-а придется по-копипастить. Да и не люблю я тридацать раз писать одни и те же if ![]() мне массив приятнее. |
|||
|
||||
Ипатьев |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2232 Регистрация: 5.7.2009 Репутация: 28 Всего: 37 |
Нет. проблему, в связи с короторй биндинг был заявлен: не заниматься подстановкой в зпросы. В это связи я не очень понимаю, чем является выражение $sql.= ' ' . $allowedCriteria[$key] $sql - это не запрос? я всегда считал, что имена полей, условия, и - тем более - функции mysql в подстановках исползовать нельзя.
проблема в том, что в реальной жизни этот иф чаще всего совсем не один и тот же. и копипастить придется совсем немного. при этом код будет понятным и читаемым. стремление к чрезмерной абстракции столь же губительно, как и преждевременная оптимизация. |
|||
|
||||
Simpliest |
|
||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: 1 Всего: 3 |
Дык. Сравнить эту лажу
и биндинг И все станет очевидно.
это формирование условия к запросу из списка разрешенных полей. Нам могут прийти не все поля, пользователь может иметь доступ не ко всем полям и т.д.
? в честь чего? Валидация и фильтрация лежат несколько в отдельном месте. А проверка на наличие/разрешенность поля... будет одинаковой.
Примерчик кода нет желания привести? Мой опыт говорит, что копипаста будет очень много и код быстро превратиться в лапшу.
Я так понимаю пример конкретной системы, конкретной чрезмерной абстракции и конкретной ее реализации, привести не затруднит? |
||||||||||
|
|||||||||||
Ипатьев |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2232 Регистрация: 5.7.2009 Репутация: 28 Всего: 37 |
Мне кажется, что вы говорите о чем угодно, но только не о конкретной проблеме составления запроса по множесту критериев.
Какая разница, как мы подставляем в запрос само значение, если в данном случае мы подставляем не значение, а целиком условие? как bind_param поможет составить выражение вида date(start) > '2009-11-11' где 2009-11-11 берется из формы? зачем городить сложную систему, распознающую миллиард различных комбинаций условий, если эти условия можно просто написать вручную?
На самом деле я хотел предложить именно это. привести примеры реальных задач. Но вы, мне кажется, не понимаете, о чем пишете. пример чрезмерной абстракции у меня просить не надо. Во-первых, у меня его, по очевидным причинам, нету. А во-вторых, пример есть в этом топике, парой сообщений выше. |
|||
|
||||
Simpliest |
|
||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: 1 Всего: 3 |
Брр. Не путайте теплое с мягким. Построение запроса и подстановку/биндинг параметров (последний вообще возможен только к готовому запросу, а не куску условия) Опыт работы с ОРМ или хотя бы с DBAL проектов отличных от сайтов-визиток хоть какой-нибудь вообще имеется? Чтобы я просто понимал ваш уровень в этом вопросе.
Не воюйте с ветряными мельницами - это неперспективно. Вы выдумали себе мельницу и доблестно пытаетесь ее разбить. Вот это еще не ###код, но крайне близкое к нему решение.
Вот это откровенный ###код.
Связывать построение запроса и подстановку/биндинг данных в линейном коде - не самое лучшее решение для проекта (для разового скрипта подойдет и лапша). Чрезмерно усложнить решение простой задачи - тоже глупость. Вы не пишите вовсе? Или пишите исключительно "лапшу"? Это печально. Смею уверить, если бы вы хоть что-то сложное писали, то в конкретном коде у вас можно найти с полдесятка ошибок. И возможно даже тех, о которых вы знаете, но не исправляете ![]() |
||||||||||
|
|||||||||||
Pitlord |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 246 Регистрация: 31.10.2009 Репутация: 4 Всего: 7 |
Прямо-таки война концепций. Такую серьёзную проблему надо решать в разделе "PHP: Для профи", точно вам говорю.
|
|||
|
||||
Ипатьев |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2232 Регистрация: 5.7.2009 Репутация: 28 Всего: 37 |
ага, теперь я понял. слова "это всё" относились к обычной подстановке данных, а не к обсуждаемой задаче. то-то я удивился. вернемся к вопросу. Учитывая, что код в самом первом варианте практически не отличается от объявления массива, но при этом не требует дополнительной обработки, и является более гибким, стоит признать, что и "лапша" вполне имеет право на жизнь. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |