Как игнорировать пустое ограничение в SQL SELECT query

#php #mysql

#php #mysql

Вопрос:

У меня есть простая база данных MySQL, которую я запрашиваю у PHP. У меня есть пользовательский ввод некоторых ограничений через форму, а затем я хочу вернуть результаты из запроса SELECT на основе ограничений. То, что у меня есть, работает, когда используются оба ограничения. Однако, если одно из ограничений не указано пользователем, запрос SELECT не возвращает результатов, что, я думаю, связано с тем, что он видит переменную ограничения как пустую.

Как мне заставить запрос SELECT использовать ограничение, если оно не пустое, но игнорировать его, если оно пустое?

Вот то, что я пробовал ранее, но это не работает. Я думал, что могу проверить на пустоту и использовать ИЛИ игнорировать его.

 $query="SELECT * FROM food_items 
WHERE (type IN ('$foodtypes') OR ('$foodtypes') > '') 
AND ('$budget' > '' OR cost <= ('$budget')) 
"; 
 

В этом примере type и cost являются полями в базе данных, а $foodtypes и $budget являются переменными, взятыми из пользовательских вводов.

Спасибо

Комментарии:

1. Создайте запрос динамически и запрашивайте только переданные значения. Вы также, похоже, открыты для SQL-инъекций. Следует использовать параметризованные запросы.

2. и вы, вероятно, хотели это сделать '$budget' = '' OR cost <= ('$budget') (и то же самое с foodtypes). (обратите внимание на = вместо > .)

3. Примечание: не используйте это слово constraint : в SQL оно имеет другое значение.

Ответ №1:

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

 $query = "SELECT * FROM food_items WHERE " .
   ($foodtypes != "" ? "type IN ('$foodtypes')" : "TRUE") . " AND " .
   ($budget ? "cost <= $budget" : "TRUE") . " AND " .
.. and so on ..
 

Примечание по безопасности: всегда экранируйте свои строки SQL перед использованием (см. mysqli_real_escape_string).