Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > PHP: Общие вопросы > сформировать запрос по значениям для трех полей |
Автор: Denwer 3.12.2009, 01:10 |
Есть табличка с тремя полями (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 в квадрате Может кто сталкивался или знает как решить проблему, или знает того кто знает ПОМОГИТЕ !!! |
Автор: Pitlord 3.12.2009, 01:14 |
http://forum.vingrad.ru/forum/topic-281107/anchor-entry2027781/0.html |
Автор: Aumn 5.12.2009, 05:12 | ||
Неплохое решение, но на мой взгляд слишком уж громоздкое. Он к сути и сводится к тому, что при увеличении кол-ва полей увеличивается кол-во строк обработки. Я предлагаю следующий вариант. С условием того, что у Вас все названия полей имеют идентичный вид (что упрощает реализацию собственно), можно проверить на заполненность и составить запрос небольшим циклом.
Вместо тройки вставляете необходимое Вам значение кол-ва полей. |
Автор: MaXL 5.12.2009, 06:37 | ||
Я так понял необходимые поля в БД текстовые. А что если не выбранным полям присвоить значение %. И тогда просто сформировать запрос следующим образом:
|
Автор: Aumn 5.12.2009, 07:04 |
К сожалению, я тут помочь Вам не могу, так как не знаю структуру БД и поля (тип, вводимая информация и т.д.) Я проверил свой код, он работает для любого числа полей и типа вводимой информации. Поэтому если вы дадите полные данные, возможно я свогу Вам помочь. |
Автор: Ипатьев 5.12.2009, 09:48 |
MaXL, боюсь, такой запрос не вернет ничего. Aumn, у вас в таблице поля всегда так называются - буква с цифрой? Если нет - то к чему изобретать такой заведомо нежизнеспособный код? Разрешите дать вам один совет. Как человеку, который решил отвечать на вопросы оптом, даже не глядя на дату последнего сообщения. Пишите код только в том случае, если вы уже использовали его раньше, в сходной ситации. А не придумывая его на ходу. |
Автор: Simpliest 5.12.2009, 12:06 | ||||
Вариант номер раз.
Извращение номер два'с
А вообще это все глупости ![]() |
Автор: Ипатьев 5.12.2009, 12:13 |
в итоге код получился немного больше, чем в варианте Pitlord-а. и в разы сложнее. затрудняя отладку и чтение а можно посмотреть пример, как биндинг решает данную проблему? |
Автор: Simpliest 5.12.2009, 13:16 | ||
Отладку и чтение? ![]()
Добавлено через 13 минут и 11 секунд Если имеется в виду Извращение номер два'с то это именно извращение, которое никогда никому не потребуется и не может быть применено. Хотя и рабочее ![]() Первый же вариант за исключением части с array_walk & mysql_real_escape_string я использовал раньше очень часто. Он легко справляется и с десятками полей ![]() В варианте Pitlord-а придется по-копипастить. Да и не люблю я тридацать раз писать одни и те же if ![]() мне массив приятнее. |
Автор: Simpliest 5.12.2009, 15:21 | ||||||||||
Дык. Сравнить эту лажу
и биндинг И все станет очевидно.
это формирование условия к запросу из списка разрешенных полей. Нам могут прийти не все поля, пользователь может иметь доступ не ко всем полям и т.д.
? в честь чего? Валидация и фильтрация лежат несколько в отдельном месте. А проверка на наличие/разрешенность поля... будет одинаковой.
Примерчик кода нет желания привести? Мой опыт говорит, что копипаста будет очень много и код быстро превратиться в лапшу.
Я так понимаю пример конкретной системы, конкретной чрезмерной абстракции и конкретной ее реализации, привести не затруднит? |
Автор: Ипатьев 5.12.2009, 15:37 | ||
Мне кажется, что вы говорите о чем угодно, но только не о конкретной проблеме составления запроса по множесту критериев. Какая разница, как мы подставляем в запрос само значение, если в данном случае мы подставляем не значение, а целиком условие? как bind_param поможет составить выражение вида date(start) > '2009-11-11' где 2009-11-11 берется из формы? зачем городить сложную систему, распознающую миллиард различных комбинаций условий, если эти условия можно просто написать вручную?
На самом деле я хотел предложить именно это. привести примеры реальных задач. Но вы, мне кажется, не понимаете, о чем пишете. пример чрезмерной абстракции у меня просить не надо. Во-первых, у меня его, по очевидным причинам, нету. А во-вторых, пример есть в этом топике, парой сообщений выше. |
Автор: Simpliest 5.12.2009, 16:14 | ||||||||||||
Брр. Не путайте теплое с мягким. Построение запроса и подстановку/биндинг параметров (последний вообще возможен только к готовому запросу, а не куску условия) Опыт работы с ОРМ или хотя бы с DBAL проектов отличных от сайтов-визиток хоть какой-нибудь вообще имеется? Чтобы я просто понимал ваш уровень в этом вопросе.
Не воюйте с ветряными мельницами - это неперспективно. Вы выдумали себе мельницу и доблестно пытаетесь ее разбить. Вот это еще не ###код, но крайне близкое к нему решение.
Вот это откровенный ###код.
Связывать построение запроса и подстановку/биндинг данных в линейном коде - не самое лучшее решение для проекта (для разового скрипта подойдет и лапша). Чрезмерно усложнить решение простой задачи - тоже глупость. Вы не пишите вовсе? Или пишите исключительно "лапшу"? Это печально. Смею уверить, если бы вы хоть что-то сложное писали, то в конкретном коде у вас можно найти с полдесятка ошибок. И возможно даже тех, о которых вы знаете, но не исправляете ![]() |
Автор: Pitlord 5.12.2009, 18:06 |
Прямо-таки война концепций. Такую серьёзную проблему надо решать в разделе "PHP: Для профи", точно вам говорю. |
Автор: Ипатьев 5.12.2009, 18:35 | ||
ага, теперь я понял. слова "это всё" относились к обычной подстановке данных, а не к обсуждаемой задаче. то-то я удивился. вернемся к вопросу. Учитывая, что код в самом первом варианте практически не отличается от объявления массива, но при этом не требует дополнительной обработки, и является более гибким, стоит признать, что и "лапша" вполне имеет право на жизнь. |
Автор: Aumn 5.12.2009, 19:12 | ||
Ипатьев, тут я могу Вам только ответить, что никогда не делаю таких полей. Если Вы обратите внимание на первый пост, то заметите, что в запросе поля именно так и сформулированны. Тот код, что я написал, я никогда не использовал (кроме тестирования перед выкладкой сюда) и не собираюсь, так как с моей точки зрения поля в таблице должны иметь более менее читабельный вид. На счет "вопросы оптом". Это что - нарушение правил? Я просто помогаю людям и ничего от этого не требую. Я не ставлю никаких рекламных ссылок и прочей ерунды. Какое из моих решений навредило? P.S. Для всех, чтоб не возникало больше вопросов - данный код подходит только для данного случая и упрощает процесс реализации (как и объем кода) |
Автор: Ипатьев 5.12.2009, 19:38 |
Задавая вопрос, автор часто упрощает его, думая, что так будет полезнее. |
Автор: Aumn 5.12.2009, 19:41 | ||
Благодарю. Приму к сведению. Я тут не так-то и давно и не знал, что на этом форуме такое практикуется. |
Автор: NLspieler 5.12.2009, 20:17 | ||
Не знаю, почему такую элементарную задачу, обсуждают уже вторую страницу. Ну раз уж пошла такая тема, то предложу своё решение.
|
Автор: Simpliest 5.12.2009, 21:22 | ||
Эм? ![]() ![]() В том что после появления 4го поля он уже будет несколько неудобным, после 8го мы начнем подозревать что, что-то пошло не так. К 20му запросу написанному "таким" спосбом, мы проклянем того кто нам его посоветовал, сотрем все к черту и перепишем заново? ![]() Если для вас гибкость заключается в этом - то мне нечего возразить ![]() В маленьких скриптах - вполне. Она проще и быстрее пишется, над ней нужно меньше думать. как только скрипт начинает расти и меняться - лапшу начинаешь тихо ненавидеть. Добавлено через 2 минуты и 39 секунд Поднятие тем более чем 2-3 месячной давности называется некрофилией ![]() А так - ради бога ![]() ![]() ![]() |
Автор: Denwer 6.12.2009, 11:23 |
понятное дело что поля я так не называл, и типы данных там могут быть любые, написал для краткости и понятности вопроса. Все же спасибо всем кто откликнулся, были действительно достойные ответы, от ребят поопытнее. Вот так и рождается истина в спорах и в разногласиях. Всем хорошего дня!!! |
Автор: Aumn 7.12.2009, 04:10 | ||
Что-то я не понял. Какое это отношение имеет к моим словам? |
Автор: Simpliest 7.12.2009, 06:57 |
Это имеет отношение к твоим действиям. Когда ты отвечал на старые/мертвые темы. |
Автор: Aumn 7.12.2009, 14:59 | ||
Они полюбому попали/попадут в архив + в индекс поисковика. Потом по какому-либо запросу, возможно, выведится страница форуму, где я отвечал и, также скажу - возможно, кому-то и пригодится мой ответ. Поэтому даже постинг в старых/мертвых темах иногда полезен. ![]() |