выберите фильтр таблицы по php строки запроса - PullRequest
0 голосов
/ 10 мая 2011

хорошо, так что я некоторое время пытался заставить это работать, но должно быть лучшее решение, чем то, о чем я думаю. Я довольно новичок в php / mysql, поэтому не знаю, как сделать следующее:

У меня есть окно поиска, которое содержит раскрывающиеся списки для страны, штата, города Теперь, если пользователь выбирает только страну и щелкает по поиску, ему нужно отфильтровать выбранные по только стране и показать все остальное.

if(!empty($_REQUEST['city']))
    $city = $_REQUEST['city'];
else
    $city= "%";

if(!empty($_REQUEST['state']))
    $state= $_REQUEST['state'];
else
    $state= "%";

if(!empty($_REQUEST['country']))
    $country= $_REQUEST['country'];

select * from table where country = $country and state = $state and city = $city

Проблема в том, что эти столбцы являются целыми, поэтому я не могу использовать «%» для фильтрации. Я надеюсь, что смог объяснить это, любая помощь более чем приветствуется. Заранее спасибо

Ответы [ 4 ]

3 голосов
/ 10 мая 2011
  1. Если вы не хотите ограничивать столбец, просто опустите его в запросе
  2. никогда не вставляйте строку из $ _REQUEST непосредственно в строку запроса - классический недостаток SQL-инъекции.
  3. вы, вероятно, хотите установить какое-то ограничение, чтобы запрос не возвращал каждый результат в вашей базе данных.

пример:

<?php
$conditions = array();

if(!empty($_REQUEST['city']))
    $conditions[] = "city = " . mysql_real_escape_string($_REQUEST['city']);

if(!empty($_REQUEST['state']))
    $conditions[] = "state = " . mysql_real_escape_string($_REQUEST['state']);

if(!empty($_REQUEST['country']))
    $conditions[] = "country = " . mysql_real_escape_string($_REQUEST['country']);

$sql = 'select * from table ';
if(!empty($conditions))
    $sql .= ' where '. implode(' AND ', $conditions);
$sql .= ' LIMIT 1000';
1 голос
/ 10 мая 2011
$where = array();
if(!empty($_REQUEST['city'])) $where[] = "city = '".(int)$_REQUEST['city']."'";
if(!empty($_REQUEST['state'])) $where[] = "state = '".(int)$_REQUEST['state']."'";
if(!empty($_REQUEST['country'])) $where[] = "country = '".(int)$_REQUEST['country']."'";

$wherestring = if(count($where) != 0) ? " WHERE ".implode(' AND ', $where) : "" ;

$query = "SELECT * FROM table".$wherestring;
0 голосов
/ 10 мая 2011

Вот мои предложения.

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

  1. Не не используйте необработанное значение $_REQUEST, так как пользователь может отравить вашу базукормление это подделка $_REQUEST данных.Хотя могут быть более эффективные способы сделать это, имейте в виду команду "mysql_real_escape_string($string)".
  2. Ниже приведен распространенный метод решения этой проблемы.(Идея взрыва, в основном. Фрэнк Фармер делает то же самое в своей.)

-

$__searchWheres = array(); //Where we'll store each requirement used later
foreach( array('city','state','country') as $_searchOption) {
   if ( ! empty( $_REQUEST[$_searchOption] ) ) {
       $__searchWheres[] = $_searchOption . '= "' . mysql_real_escape_string( $_REQUEST[$_searchOption] ) . '"';
   }
}
$__query = 'select * from table' . (count($__searchWheres) > 0 ? ' WHERE ' . implode(' AND ',$__searchWheres) : '');  //Implode idea also used by Frank Farmer
//Select from the table, but only add the 'WHERE' key and where data if we have it.
mysql_query($__query);
0 голосов
/ 10 мая 2011

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

Пример:

if(isset() || isset() || isset() ) //make sure at least one is set
{
  $query_string = "SELECT * FROM table WHERE ";

  if(isset($_REQUEST['country']))
  {
      $country = $_REQUEST['country'];
      $query_string .= " country = $country";
  }

  if(isset($_REQUEST['state']))
  {
      $state = $_REQUEST['state'];
      $query_string .= " state = $state";
  }

  if(isset($_REQUEST['city']))
  {
      $city = $_REQUEST['city'];
      $query_string .= " city = $city";
  }
}
else
{
    //Else, if none are set, just select all the entries if no specifications were made
    $query_string = "SELECT * FROM table";
}

  //Then run your query...

Итак, на английском языке, первое, что вы делаете, это проверяете ваши параметры, делаяубедитесь, что у вас есть с чем поработать, прежде чем пытаться объединить пустые переменные вместе.Затем вы создаете базовую строку запроса (если у нас есть параметры) и оставляете ее открытой, чтобы мы могли добавлять любые параметры, которые вам нужны.Затем проверьте каждый параметр и, если он задан, объедините этот параметр в конец строки запроса.Наконец обработайте запрос, отправив его на сервер SQL.

Удачи!

h

...