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 запроса на основе данных от пользователя?

 PHP.SU

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


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

> Без описания
freelsd
Отправлено: 03 Февраля, 2016 - 18:39:20
Post Id


Гость


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


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




В общем, такая ситуация: пользователь выбирает в форме параметры и их значения. Например, param1 числовой от 1-50, param2 строковый "test" и param3 datetime (тут дата). Так вот, на основе его выбора нужно составить запрос типа:

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM test WHERE param1 >1 AND param1 <50 AND param2 = "test" AND last_date > param3
  2.  


Я думаю так понятно. Но число параметров может быть разное, а некоторые параметры не будут использованы вообще. Как правильно генерировать такие запросы? Спасибо.

(Отредактировано автором: 03 Февраля, 2016 - 22:15:42)

 
 Top
Viper
Отправлено: 03 Февраля, 2016 - 20:43:24
Post Id



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


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


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




freelsd пишет:
Как правильно генерировать такие запросы?
в цикле.
1. Получаете массив переменных
2. Циклом по массиву из пункта 1
3. Фильтруете
4. Проверяете
5. Подставляете в запрос, не забывая про экранирование(или через что у вас там запросы выполняются).

PS! Если заранее не знаете какой тип ожидать на входе, то лучше ИМХО задать их через правила фильтрации.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
freelsd
Отправлено: 03 Февраля, 2016 - 21:44:27
Post Id


Гость


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


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




Viper пишет:
freelsd пишет:
Как правильно генерировать такие запросы?
в цикле.
1. Получаете массив переменных
2. Циклом по массиву из пункта 1
3. Фильтруете
4. Проверяете
5. Подставляете в запрос, не забывая про экранирование(или через что у вас там запросы выполняются).

PS! Если заранее не знаете какой тип ожидать на входе, то лучше ИМХО задать их через правила фильтрации.


Нет, задача не совсем в этом. Нужно на основе того какие параметры выберет пользователь составить запрос. Например захотел он чтобы в запросе были все записи не позднее какой-то даты, соответственно в запросе добавилось "where lastdate > user_param_data", а если ему нужно выбрать по определенному городу то where city="user_selected_city". В первом посте я пример привел. То поля и условия, которые будут в запросе составляются пользователем. Так понятней должно быть.
 
 Top
Viper
Отправлено: 03 Февраля, 2016 - 21:53:52
Post Id



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


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


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




freelsd пишет:
Нет, задача не совсем в этом. Нужно на основе того какие параметры выберет пользователь составить запрос. Например захотел он чтобы в запросе были все записи не позднее какой-то даты, соответственно в запросе добавилось "where lastdate > user_param_data", а если ему нужно выбрать по определенному городу то where city="user_selected_city". В первом посте я пример привел. То поля и условия, которые будут в запросе составляются пользователем. Так понятней должно быть.
ещё раз вдумчиво перечитайте свой вопрос и мой ответ.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
freelsd
Отправлено: 03 Февраля, 2016 - 22:12:38
Post Id


Гость


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


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




Viper пишет:
freelsd пишет:
Нет, задача не совсем в этом. Нужно на основе того какие параметры выберет пользователь составить запрос. Например захотел он чтобы в запросе были все записи не позднее какой-то даты, соответственно в запросе добавилось "where lastdate > user_param_data", а если ему нужно выбрать по определенному городу то where city="user_selected_city". В первом посте я пример привел. То поля и условия, которые будут в запросе составляются пользователем. Так понятней должно быть.
ещё раз вдумчиво перечитайте свой вопрос и мой ответ.


Я перечитал. Основная проблема как-раз в "подставлянии". Узнать, допустим, есть ли условия для выборки чтобы добавить в результирующую строку where это несложно. Но потом нужно определять если параметр первый в выборке, то and не дописывать в него. Получается что нужно много условий. И чем больше параметров тем больше условий городить. То есть пользователь может вообще никаких параметров не выбирать, а может выбрать только некоторые из них и исходя из этого нужно составить запрос с условиями.

(Отредактировано автором: 03 Февраля, 2016 - 22:20:20)

 
 Top
TuX560
Отправлено: 04 Февраля, 2016 - 08:32:55
Post Id


Гость


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


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




freelsd пишет:
Нужно на основе того какие параметры выберет пользователь составить запрос. Например захотел он чтобы в запросе были все записи не позднее какой-то даты, соответственно в запросе добавилось "where lastdate > user_param_data", а если ему нужно выбрать по определенному городу то where city="user_selected_city". В первом посте я пример привел. То поля и условия, которые будут в запросе составляются пользователем. Так понятней должно быть.

Самый простой вариант - задать значения по умолчанию, если они не пришли от пользователя
 
 Top
freelsd
Отправлено: 04 Февраля, 2016 - 09:06:15
Post Id


Гость


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


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




TuX560 пишет:

Самый простой вариант - задать значения по умолчанию, если они не пришли от пользователя


По умолчанию мне нужно тогда все записи показать, без каких-либо условий.
 
 Top
Viper
Отправлено: 04 Февраля, 2016 - 09:51:49
Post Id



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


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


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




TuX560 пишет:
Самый простой вариант - задать значения по умолчанию, если они не пришли от пользователя
это не простой вариант, это грабли с гемороем.

freelsd пишет:
Но потом нужно определять если параметр первый в выборке, то and не дописывать в него. Получается что нужно много условий. И чем больше параметров тем больше условий городить.
у вас одна проверка будет.

PHP:
скопировать код в буфер обмена
  1. foreach ($data as $key => $value)

В $key у вас имя переменной, в $value её значение. Вот и проверяйте наличие значения 1 раз.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
freelsd
Отправлено: 04 Февраля, 2016 - 10:28:26
Post Id


Гость


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


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




Viper пишет:

PHP:
скопировать код в буфер обмена
  1. foreach ($data as $key => $value)

В $key у вас имя переменной, в $value её значение. Вот и проверяйте наличие значения 1 раз.


Я понимаю, я же сказал что проблема именно в составлении запроса а не в получении переменных: если есть параметр и он идет первым, то сначала дописываем where, а если параметр не первый то пишем and, а если параметров нет то условие не дописываем. Да, и условия для разных переменных разные, где-то просто сравнение where text_param=value а где-то поиск по диапазону where num_param > value1 and num_param < value2. Я примерно представляю как это сделать, но хотелось бы знать как такое на практике реализуют и какие способы есть. Может пример приведете если не трудно?

(Отредактировано автором: 04 Февраля, 2016 - 10:34:42)

 
 Top
Viper
Отправлено: 04 Февраля, 2016 - 14:32:26
Post Id



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


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


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




freelsd пишет:
но хотелось бы знать как такое на практике реализуют и какие способы есть

составляйте правила, что и как должно сравниваться. Можете через xml, можете через json-schema.
В любом случае вам известны переменные.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
rasschitai
Отправлено: 04 Февраля, 2016 - 17:00:46
Post Id



Новичок


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


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




CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $param=$_REQUEST;
  3. // тут экранируем
  4.  
  5. $and=false;
  6. if(isset($param['param1']) && $param['param1']!=''){
  7.  
  8.    $and[]="param1='{$param['param1']}'";
  9.  
  10. }
  11. // условия
  12. // условия
  13.  
  14. $sql="select * from table1 ";
  15. if($and){
  16.  
  17.    $sql.="where ".join(' and ',$and);
  18. }
  19.  

(Отредактировано автором: 04 Февраля, 2016 - 17:04:31)

 
 Top
freelsd
Отправлено: 06 Февраля, 2016 - 15:37:26
Post Id


Гость


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


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




rasschitai пишет:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $param=$_REQUEST;
  3. // тут экранируем
  4.  
  5. $and=false;
  6. if(isset($param['param1']) && $param['param1']!=''){
  7.  
  8.    $and[]="param1='{$param['param1']}'";
  9.  
  10. }
  11. // условия
  12. // условия
  13.  
  14. $sql="select * from table1 ";
  15. if($and){
  16.  
  17.    $sql.="where ".join(' and ',$and);
  18. }
  19.  


Спасибо большое за код, но уже решил.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB