PHP mysql - ... AND column = 'что-нибудь' ...? - PullRequest
3 голосов
/ 24 мая 2010

Есть ли способ проверить, является ли столбец "что-нибудь"?Причина в том, что у меня есть функция поиска, которая получает идентификатор из URL, а затем передает его через алгоритм sql и показывает результат.Но если этот URL "function" (?) Не заполнен, он просто ищет:

...AND column=''...

, и это не возвращает никаких результатов вообще.Я пытался использовать «%», но это ничего не дает.

Есть идеи?

Вот запрос:

mysql_query("SELECT * FROM filer 
             WHERE real_name LIKE '%$searchString%' 
                   AND public='1' AND ikon='$tab' 
                   OR filinfo LIKE '%$searchString%' 
                   AND public='1' 
                   AND ikon='$tab' 
             ORDER BY rank DESC, kommentarer DESC");

Проблема в том, что "образок = ''»...

Ответы [ 6 ]

4 голосов
/ 24 мая 2010

and ikon like '%' будет проверять столбец, содержащий «что-нибудь». Обратите внимание, что like также может использоваться для сравнения с литеральными строками без подстановочных знаков, поэтому, если вы измените эту часть SQL на использование like, тогда вы можете предварительно установить переменную на '%' и все будет установлено.

Однако, как уже упоминалось ниже, остерегайтесь атак с использованием SQL-инъекций. Я всегда настоятельно рекомендую людям использовать mysqli и подготовленные запросы вместо того, чтобы полагаться на mysql_real_escape_string().

3 голосов
/ 24 мая 2010

Вы можете динамически создавать свой запрос, например:

$query = "SELECT * FROM table WHERE foo='bar'";

if(isset($_GET['id'])) {
    $query .= " AND column='" . mysql_real_escape_string($_GET['id']) . "'";
}

Обновление: Обновлен код, чтобы он был ближе к вопросу ОП.

3 голосов
/ 24 мая 2010

Попробуйте использовать это:

AND ('$tab' = '' OR ikon = '$tab')

Если задана пустая строка, условие всегда будет выполнено.

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

0 голосов
/ 15 декабря 2015

Я так понимаю, вы добавляете значения из переменных. Переменная приходит, и вам нужно что-то с ней сделать - слишком поздно, чтобы жестко закодировать секцию 'OR 1 = 1' там. Вы должны понимать, что LIKE - это не то, на что это похоже (только частичное совпадение) - оно также выполняет точное совпадение. Нет необходимости в поле = что-нибудь, как:

  • {поле LIKE '%'} даст вам все
  • {поле LIKE 'specific_value'} ТОЛЬКО даст вам это значение - оно не является частичным совпадением, как кажется на первый взгляд.

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

0 голосов
/ 24 мая 2010

Теперь можно проверить, является ли столбец "чем-нибудь"
Способ включения всех значений в результат запроса: исключить это поле из запроса.
Но вы всегда можете построить запрос динамически.
Просто маленький пример:

$w=array();
if (!empty($_GET['rooms'])) $w[]="rooms='".mysql_real_escape_string($_GET['rooms'])."'";
if (!empty($_GET['space'])) $w[]="space='".mysql_real_escape_string($_GET['space'])."'";
if (!empty($_GET['max_price'])) $w[]="price < '".mysql_real_escape_string($_GET['max_price'])."'";


if (count($w)) $where="WHERE ".implode(' AND ',$w); else $where='';
$query="select * from table $where";

По вашему запросу это очень просто:

$ikon="";
if ($id) $ikon = "AND ikon='$tab'";
mysql_query("SELECT * FROM filer 
             WHERE (real_name LIKE '%$searchString%' 
                   OR filinfo LIKE '%$searchString%')
                   AND public='1' 
                   $ikon 
             ORDER BY rank DESC, kommentarer DESC");

Надеюсь, у вас все строки уже сбежали

0 голосов
/ 24 мая 2010

Запустите ваш запрос, если строка поиска указана в if-else условии:

$id = (int) $_GET['id'];

if ($id)
{
  // run query
}
else
{
  // echo oops
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...