2016-01-11 3 views
1

Хорошо, поэтому у меня есть команда sql. См. Ниже.SQL; ИЛИ не работает

$sql = "SELECT * FROM orders 
     WHERE loggedtime BETWEEN :time AND :times 
     AND name LIKE :keyword OR odryname LIKE :keyword OR pdryname LIKE :keyword 
     OR jlc LIKE :keyword OR odrphone LIKE :keyword 
     OR biid LIKE :keyword OR dstreet LIKE :keyword "; 
$q=$con->prepare($sql); 
$q->bindvalue(":keyword", "%".$keyword."%"); 

Так работает команда до первого или в нем ... Он будет проверять, если записываемое время это то, что я вставил и NAME, как ключевое слово ..

Единственная часть из команда, которая должна быть постоянной, равна WHERE loggedtime = :time. Остальное должно быть основано на совпадении ключевого слова ... Но это не должно отображаться вообще, если время в этом порядке неверно.

+8

Когда вы объединяете AND и OR в одном и том же запросе, убедитесь, что вы понимаете правила их оценки и применяете скобки там, где это необходимо .... LIKES (WHISKEY OR PIZZA) И CRICKET - это не то же самое, что и LIKES WHISK Y OR (PIZZA И CRICKET) –

+0

... или еще лучше. Чтобы сделать вещи более ясными в целом, я бы предложил всегда заключать в скобки условия, содержащие AND & OR;, даже если вы знаете порядок оценки: это один из немногих вещей, которые ваш ум анализирует при чтении, а когда вы вернетесь к нему позже, помнить/читать ваши намерения. – Uueerdo

+0

@MarkBaker Это сработало, я понимаю, что теперь для этого используются скобки. Спасибо. Пожалуйста, отправьте ответ, чтобы я согласился. – Kmiles1990123

ответ

1

положить это в() loggedtime BETWEEN :time AND :times так что ваш запрос должен быть:

$sql = "SELECT * FROM orders 
WHERE (loggedtime BETWEEN :time AND :times) 
AND name LIKE :keyword OR odryname LIKE :keyword OR pdryname LIKE :keyword 
OR jlc LIKE :keyword OR odrphone LIKE :keyword 
OR biid LIKE :keyword OR dstreet LIKE :keyword "; 
1

Как указано, есть два основных условия, которые рассматриваются в logged time и других областях, которые сравнивают с keyword.
Вам нужно сгруппировать логически связанные операторы с фигурными скобками.
При объединении этих условий (AND и OR) важно использовать круглые скобки, чтобы база данных знала, какой порядок оценивать каждое условие.
Попробуйте этот запрос:

$sql = "SELECT * FROM orders 
     WHERE loggedtime BETWEEN :time AND :times 
     AND (name LIKE :keyword OR odryname LIKE :keyword OR pdryname LIKE :keyword 
     OR jlc LIKE :keyword OR odrphone LIKE :keyword 
     OR biid LIKE :keyword OR dstreet LIKE :keyword) "; 
1

Логическим AND имеет более высокий приоритет, чем логический OR. Это подробно описано в the MySQL documentation.

Так без явных скобок, текущее утверждение на самом деле звучит как:

SELECT * FROM orders 
    WHERE (loggedtime BETWEEN :time AND :times 
    AND name LIKE :keyword) OR odryname LIKE :keyword OR pdryname LIKE :keyword 
    OR jlc LIKE :keyword OR odrphone LIKE :keyword 
    OR biid LIKE :keyword OR dstreet LIKE :keyword 

Как OR имеет более низкий приоритет, чем AND, вы будете нуждаться в фигурных скобках, чтобы сгруппировать все OR условия объединено:

SELECT * FROM orders 
    WHERE loggedtime BETWEEN :time AND :times 
    AND (name LIKE :keyword OR odryname LIKE :keyword OR pdryname LIKE :keyword 
    OR jlc LIKE :keyword OR odrphone LIKE :keyword 
    OR biid LIKE :keyword OR dstreet LIKE :keyword)