запрос PHP MySQL: несколько вариантов выпадающего - PullRequest
2 голосов
/ 17 сентября 2010

У меня есть окно поиска, в котором пользователь может выбрать $ location, $ type и $ rating.

$result = mysql_query("SELECT * FROM Places WHERE Location = '$location' and Type ='$type' and Rating = '$rating'")
or die(mysql_error()); 

Это прекрасно работает, если пользователь выбирает и выбирает из всех 3 выпадающих списков, однако как мне сделать, чтобы запрос msql проверял базу данных, если пользователь выбирает только местоположение, например.

У меня есть опция «Любой» на всех 3 раскрывающихся списках, если они хотят оставить раскрывающийся список пустым.

Спасибо

Ответы [ 6 ]

1 голос
/ 17 сентября 2010

Основываясь на ответе Аарона У., вот решение, которое извлекает все строки, когда все параметры «любые»:

$sql = "SELECT * FROM Places";
$searches = array();
if ($location != 'any') $searches[] = "`Location` = '$location'";
if ($type     != 'any') $searches[] = "`Type` = '$type'";
if ($rating   != 'any') $searches[] = "`Rating` = '$rating'";
if (count($searches) > 0) {
    $sql .= " WHERE " . implode(" AND ", $searches);
}
$sql .= ';';
echo "sql=$sql\n";
1 голос
/ 17 сентября 2010

Я сталкиваюсь с этим все время, и эта установка не будет работать. Сбой, когда выбран только один вариант. Запрос становится:

SELECT * FROM Places WHERE AND 'Rating' = '$rating'

Простое решение - просто набрать WHERE 1 в начале запроса, а затем вы можете добавить AND 'Rating' = '$rating' и т. Д. Любым удобным для вас способом.

$sql .= ($location)?" AND Location='$location'":"";
$sql .= ($type)?" AND Type='$type'"":"";
$sql .= ($rating)?" AND Rating='$rating'":"";
1 голос
/ 17 сентября 2010
$searches = array();
if($location != 'any') $searches[] = "`Location` = '$location'";
if($type != 'any') $searches[] = "`Type` = '$type'";
if($rating != 'any') $searches[] = "`Rating` = '$rating'";
if(count($searches) > 0) {
    $result = mysql_query("SELECT * FROM Places WHERE " . implode(" AND ", $searches)) or die(mysql_error()); 
}

Необходимо убедиться, что перед запуском SQL установлены критерии поиска.

0 голосов
/ 17 сентября 2010
$query = 'SELECT * FROM Places ';
if($location != "Any" || $type != "Any"|| $rating != "Any")
    $query .= 'WHERE ';
if($location != "Any")
   $query .= 'location = "'.mysql_real_escape_string($location).'" ';
if($type!= "Any")
   $query .= 'type= "'.mysql_real_escape_string($type).'" ';
if($rating!= "Any")
   $query .= 'rating= "'.mysql_real_escape_string($rating).'" ';
$query .= ';';
0 голосов
/ 17 сентября 2010
$result = mysql_query("
    SELECT * 
    FROM 
        Places 
    WHERE 
        (Location = '$location' OR '$location' = 'Any') 
    AND
        (Type ='$type' OR '$type' = 'Any')
    AND  
        (Rating = '$rating' OR '$rating' = 'Any')
")
or die(mysql_error());

Кроме того, это SQL INJECTION катастрофа.Пожалуйста, используйте экранирующую функцию, такую ​​как mysql_real_escape_string .

0 голосов
/ 17 сентября 2010

Создайте запрос вместо этого, добавляя условия по одному. Если выбрано «Любой», не включайте эту часть условия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...