![]() |
Модераторы: 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 |
ага, теперь я понял. слова "это всё" относились к обычной подстановке данных, а не к обсуждаемой задаче. то-то я удивился. вернемся к вопросу. Учитывая, что код в самом первом варианте практически не отличается от объявления массива, но при этом не требует дополнительной обработки, и является более гибким, стоит признать, что и "лапша" вполне имеет право на жизнь. |
|||
|
||||
Aumn |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 3.12.2009 Репутация: нет Всего: нет |
Ипатьев, тут я могу Вам только ответить, что никогда не делаю таких полей. Если Вы обратите внимание на первый пост, то заметите, что в запросе поля именно так и сформулированны. Тот код, что я написал, я никогда не использовал (кроме тестирования перед выкладкой сюда) и не собираюсь, так как с моей точки зрения поля в таблице должны иметь более менее читабельный вид. На счет "вопросы оптом". Это что - нарушение правил? Я просто помогаю людям и ничего от этого не требую. Я не ставлю никаких рекламных ссылок и прочей ерунды. Какое из моих решений навредило? P.S. Для всех, чтоб не возникало больше вопросов - данный код подходит только для данного случая и упрощает процесс реализации (как и объем кода) Это сообщение отредактировал(а) Aumn - 5.12.2009, 19:22 |
|||
|
||||
Ипатьев |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2232 Регистрация: 5.7.2009 Репутация: 28 Всего: 37 |
Задавая вопрос, автор часто упрощает его, думая, что так будет полезнее.
|
|||
|
||||
Aumn |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 3.12.2009 Репутация: нет Всего: нет |
||||
|
||||
NLspieler |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
Не знаю, почему такую элементарную задачу, обсуждают уже вторую страницу.
Ну раз уж пошла такая тема, то предложу своё решение.
|
|||
|
||||
Simpliest |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: 1 Всего: 3 |
Эм? ![]() ![]() В том что после появления 4го поля он уже будет несколько неудобным, после 8го мы начнем подозревать что, что-то пошло не так. К 20му запросу написанному "таким" спосбом, мы проклянем того кто нам его посоветовал, сотрем все к черту и перепишем заново? ![]() Если для вас гибкость заключается в этом - то мне нечего возразить ![]() В маленьких скриптах - вполне. Она проще и быстрее пишется, над ней нужно меньше думать. как только скрипт начинает расти и меняться - лапшу начинаешь тихо ненавидеть. Добавлено через 2 минуты и 39 секунд Поднятие тем более чем 2-3 месячной давности называется некрофилией ![]() А так - ради бога ![]() ![]() ![]() |
|||
|
||||
Denwer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 19.6.2007 Где: Харьков Репутация: нет Всего: нет |
понятное дело что поля я так не называл, и типы данных там могут быть любые, написал для краткости и понятности вопроса. Все же спасибо всем кто откликнулся, были действительно достойные ответы, от ребят поопытнее. Вот так и рождается истина в спорах и в разногласиях. Всем хорошего дня!!!
|
|||
|
||||
Aumn |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 3.12.2009 Репутация: нет Всего: нет |
||||
|
||||
Simpliest |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: 1 Всего: 3 |
Это имеет отношение к твоим действиям. Когда ты отвечал на старые/мертвые темы. |
|||
|
||||
Aumn |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 3.12.2009 Репутация: нет Всего: нет |
Они полюбому попали/попадут в архив + в индекс поисковика. Потом по какому-либо запросу, возможно, выведится страница форуму, где я отвечал и, также скажу - возможно, кому-то и пригодится мой ответ. Поэтому даже постинг в старых/мертвых темах иногда полезен. ![]() Это сообщение отредактировал(а) Aumn - 7.12.2009, 14:59 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |