2010-05-24 2 views
3

Есть ли способ проверить, является ли столбец «чем угодно»? Причина в том, что у меня есть функция поиска, которая получает идентификатор из URL-адреса, а затем передает его через алгоритм sql и показывает результат. (?) Но если эта «функция» URL не заполняется, он просто ищет:PHP mysql - ... AND column = 'anything' ...?

...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"); 

Проблема заключается в "образок = ''" ...

+0

У вас уже есть ваш запрос. Смешивание AND и OR без скобки приведет к неправильным результатам. –

+0

Будьте осторожны с атаками SQL-инъекций - убедитесь, что вы избегаете переменных в своем запросе. См. Также: http://en.wikipedia.org/wiki/SQL_injection –

+0

Я не знал этого, но он работает так, как будто я хочу его сейчас. И я не видел никакой разницы, меняя его. – qwerty

ответ

4

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

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

+0

Это сработало красиво. Огромное спасибо! :) – qwerty

3

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

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

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

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

+0

Ещё нет результатов. Перед передачей в переменной URL-адреса, я проверяю, установлен ли он, и если это не так, я установил его в "". Это то же самое, что: AND column = 'something' OR column = '', правильно? Ну, пока не работает. :/ – qwerty

+0

Sarfraz Ahmed, да, это правильно. – qwerty

+1

@Nike: Нет, это не то же самое. Вам нужны скобки. –

0

Выполнить запрос, если строка поиска при условии, обернув его в if-else состоянии:

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

if ($id) 
{ 
    // run query 
} 
else 
{ 
    // echo oops 
} 
+0

Да, я мог бы это сделать, я подумал об этом, но я не хочу слишком много загромождать код. Нет ли способа проверить, что это *? – qwerty

2

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

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

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

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

+0

+1 - лучшее решение, предлагаемое до сих пор. – Fenton

+0

Наличие 'AND' в вопросе подразумевает, что он всегда хочет предложение WHERE, но одно из предложений должно быть необязательным. –

+0

@Mark Byers: Да, я знаю. Это всего лишь пример, и я думаю, что его можно легко адаптировать к использованию 'AND'. Это должно дать правильную идею. (Во всяком случае, обновил мой пример ...) –

0

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

$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

Не могли бы вы объяснить, что на самом деле делает последний оператор IF? – qwerty

+0

@ Как и в случае, если критерии не были приняты. –

+0

Aaah, теперь внезапно все имеет смысл для меня! :) Это, однако, также загромождает код. Если нет более простого способа, я думаю, что я пойду с простой операцией if. if (isset ($ _ GET ['foo'])) {query ..} else {another query ...} – qwerty

0

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

  • {поле, как «%»} даст вам все
  • {поля LIKE «specific_value»} даст вам только, что значение - это не частичное как будто это звучит так.

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