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 :: Составление sql запроса на основе данных от пользователя?
Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015
Помог: 1 раз(а)
В общем, такая ситуация: пользователь выбирает в форме параметры и их значения. Например, param1 числовой от 1-50, param2 строковый "test" и param3 datetime (тут дата). Так вот, на основе его выбора нужно составить запрос типа:
SELECT*FROM test WHERE param1 >1 AND param1 <50 AND param2 ="test"AND last_date > param3
Я думаю так понятно. Но число параметров может быть разное, а некоторые параметры не будут использованы вообще. Как правильно генерировать такие запросы? Спасибо.
Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007 Откуда: Симферополь
Помог: 98 раз(а)
freelsd пишет:
Как правильно генерировать такие запросы?
в цикле.
1. Получаете массив переменных
2. Циклом по массиву из пункта 1
3. Фильтруете
4. Проверяете
5. Подставляете в запрос, не забывая про экранирование(или через что у вас там запросы выполняются).
PS! Если заранее не знаете какой тип ожидать на входе, то лучше ИМХО задать их через правила фильтрации.
Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015
Помог: 1 раз(а)
Viper пишет:
freelsd пишет:
Как правильно генерировать такие запросы?
в цикле.
1. Получаете массив переменных
2. Циклом по массиву из пункта 1
3. Фильтруете
4. Проверяете
5. Подставляете в запрос, не забывая про экранирование(или через что у вас там запросы выполняются).
PS! Если заранее не знаете какой тип ожидать на входе, то лучше ИМХО задать их через правила фильтрации.
Нет, задача не совсем в этом. Нужно на основе того какие параметры выберет пользователь составить запрос. Например захотел он чтобы в запросе были все записи не позднее какой-то даты, соответственно в запросе добавилось "where lastdate > user_param_data", а если ему нужно выбрать по определенному городу то where city="user_selected_city". В первом посте я пример привел. То поля и условия, которые будут в запросе составляются пользователем. Так понятней должно быть.
Viper
Отправлено: 03 Февраля, 2016 - 21:53:52
Активный участник
Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007 Откуда: Симферополь
Помог: 98 раз(а)
freelsd пишет:
Нет, задача не совсем в этом. Нужно на основе того какие параметры выберет пользователь составить запрос. Например захотел он чтобы в запросе были все записи не позднее какой-то даты, соответственно в запросе добавилось "where lastdate > user_param_data", а если ему нужно выбрать по определенному городу то where city="user_selected_city". В первом посте я пример привел. То поля и условия, которые будут в запросе составляются пользователем. Так понятней должно быть.
ещё раз вдумчиво перечитайте свой вопрос и мой ответ.
Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015
Помог: 1 раз(а)
Viper пишет:
freelsd пишет:
Нет, задача не совсем в этом. Нужно на основе того какие параметры выберет пользователь составить запрос. Например захотел он чтобы в запросе были все записи не позднее какой-то даты, соответственно в запросе добавилось "where lastdate > user_param_data", а если ему нужно выбрать по определенному городу то where city="user_selected_city". В первом посте я пример привел. То поля и условия, которые будут в запросе составляются пользователем. Так понятней должно быть.
ещё раз вдумчиво перечитайте свой вопрос и мой ответ.
Я перечитал. Основная проблема как-раз в "подставлянии". Узнать, допустим, есть ли условия для выборки чтобы добавить в результирующую строку where это несложно. Но потом нужно определять если параметр первый в выборке, то and не дописывать в него. Получается что нужно много условий. И чем больше параметров тем больше условий городить. То есть пользователь может вообще никаких параметров не выбирать, а может выбрать только некоторые из них и исходя из этого нужно составить запрос с условиями.
Покинул форум
Сообщений всего: 114
Дата рег-ции: Дек. 2015
Помог: 3 раз(а)
freelsd пишет:
Нужно на основе того какие параметры выберет пользователь составить запрос. Например захотел он чтобы в запросе были все записи не позднее какой-то даты, соответственно в запросе добавилось "where lastdate > user_param_data", а если ему нужно выбрать по определенному городу то where city="user_selected_city". В первом посте я пример привел. То поля и условия, которые будут в запросе составляются пользователем. Так понятней должно быть.
Самый простой вариант - задать значения по умолчанию, если они не пришли от пользователя
freelsd
Отправлено: 04 Февраля, 2016 - 09:06:15
Гость
Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015
Помог: 1 раз(а)
TuX560 пишет:
Самый простой вариант - задать значения по умолчанию, если они не пришли от пользователя
По умолчанию мне нужно тогда все записи показать, без каких-либо условий.
Viper
Отправлено: 04 Февраля, 2016 - 09:51:49
Активный участник
Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007 Откуда: Симферополь
Помог: 98 раз(а)
TuX560 пишет:
Самый простой вариант - задать значения по умолчанию, если они не пришли от пользователя
это не простой вариант, это грабли с гемороем.
freelsd пишет:
Но потом нужно определять если параметр первый в выборке, то and не дописывать в него. Получается что нужно много условий. И чем больше параметров тем больше условий городить.
В $key у вас имя переменной, в $value её значение. Вот и проверяйте наличие значения 1 раз.
Я понимаю, я же сказал что проблема именно в составлении запроса а не в получении переменных: если есть параметр и он идет первым, то сначала дописываем where, а если параметр не первый то пишем and, а если параметров нет то условие не дописываем. Да, и условия для разных переменных разные, где-то просто сравнение where text_param=value а где-то поиск по диапазону where num_param > value1 and num_param < value2. Я примерно представляю как это сделать, но хотелось бы знать как такое на практике реализуют и какие способы есть. Может пример приведете если не трудно?
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.