2010-09-29 2 views
1

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

Теперь PHP для поиска в базе данных.

$full_name = mysql_real_escape_string($_POST["search"]); 
$sex = mysql_real_escape_string($_POST["sex"]); 
list($firstname, $lastname) = array_map('ucfirst', explode(' ', $full_name)); 
     $query = "SELECT firstname, lastname, id, user_name, sex, last_access, bostadsort FROM users WHERE firstname LIKE '$firstname' OR lastname LIKE '$lastname' AND sex = '$sex'"; 
    $result1 = mysql_query($query) or die(mysql_error()); 
    $count = mysql_num_rows($result1); 
echo $count; 

Если я вхожу Джексон (Дженне, что существует) и выберите «мужской», я все еще получаю 1 в $ графе, но Jenni Джексон является женщиной, и имеет женщину в колонке секса .. Я пытался делать эхо $ sex, чтобы увидеть значение $ sex, если это действительно то, что вы выбрали в форме, и это правильно.

+0

* (предложение) * Рассмотрим с помощью [Improved MySQL Interface] (http://de.php.net/manual/en/ book.mysqli.php) – Gordon

+0

ie * mysqli *. Кстати, есть вопрос или вы просто хотите показать, что у вас несколько бит php? –

ответ

3

Вы должны использовать круглые скобки в запросе как:

WHERE (firstname LIKE '$firstname' OR lastname LIKE '$lastname') AND sex='$sex'"; 

без скобок Ваш запрос эквивалентен:

WHERE firstname LIKE '$firstname' OR (lastname LIKE '$lastname' AND sex='$sex')"; 

и начиная firstname состояния матчей, строка возвращается.

Это происходит потому, что AND оказывает precedence над OR

+0

Первое имя отлично работает, но когда я ищу только последнее имя, например «Джексон», оно возвращает 0. поэтому OR не работает правильно? – Johnson

+0

Добавление скобок говорит о том, что пол должен совпадать, и должно совпадать с именем или фамилией. – codaddict

+0

Разве бесполезно использовать 'LIKE' без'% 'или' _'? Какая другая цель может иметь это? – Shikiryu

0

Вы должны скобки в вашем предложении WHERE так, что база данных, которая знает, имеет преимущество (AND или OR):

WHERE (firstname LIKE '$firstname' OR lastname LIKE '$lastname') AND sex = '$sex' 
0

Вы объединения и и OR в том же предложении WHERE

Вы имеете в виду

(firstname LIKE '$firstname' OR lastname LIKE '$lastname') AND sex = '$sex' 

или

firstname LIKE '$firstname' OR (lastname LIKE '$lastname' AND sex = '$sex') 
+1

Он означает первый, или он не будет задавать этот вопрос ;-) – Mischa

+0

Если мне нужно спросить, какая из возможностей предназначена, то и парсер SQL также должен угадать (кроме SQL имеет правило приоритета, чтобы сделать его предположение с) ... Я оставил свой случай –

+0

Я просто хотел * в шутку * указать, что вы * не должны спрашивать *, потому что a) SQL имеет правило приоритета и b) TS не получив ожидаемого результата ... Я оставил свой случай – Mischa

1

Попробуйте добавить некоторые скобки

$query = " 
    SELECT 
     firstname, 
     lastname, 
     id, 
     user_name, 
     sex, 
     last_access, 
     bostadsort 
    FROM users 
    WHERE 
     (
     firstname LIKE '$firstname' 
     OR lastname LIKE '$lastname' 
     ) 
     AND sex = '$sex'"; 
Смежные вопросы