2015-01-18 3 views
0

Я работаю с PHP и MySQL, и хотел бы получить запросы, основанные на следующие критерии:Получить пункты за текущую дату

Где BOOK_TITLE = поисковый запрос книги результат или результат book_keyword = поисковый запрос

И

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

Это то, что у меня есть мозговой штурм, но не кажется правильным, в том смысле, что все работает хорошо, за исключением фильтрации даты (там, где она показывает книги с датой старше текущей даты).

$get_crs = mysql_query("select * from books 
          where book_title like '%$search_query%' 
          OR book_keywords like '%$search_query%' 
          AND book_date1 >= CURRENT_DATE() ORDER BY book_date1"); 

всякая помощь была бы принята с благодарностью.

ответ

1

Это проблема с приоритетом. AND имеет приоритет над OR так двигатель DB ваш запрос выглядит следующим образом:

SELECT * FROM books 
WHERE (book_title LIKE '%$search_query%') 
    OR (book_keywords LIKE '%$search_query%' 
    AND book_date1 >= CURRENT_DATE()) 
ORDER BY book_date1 

Вы должны заставить правильный приоритет, выполнив следующие действия (круглые скобки вокруг двух LIKE ы):

SELECT * FROM books 
WHERE (book_title LIKE '%$search_query%' 
     OR book_keywords LIKE '%$search_query%') 
    AND book_date1 >= CURRENT_DATE() 
ORDER BY book_date1 

Кроме того, вы можете сделать следующее:

SELECT * FROM books 
WHERE CONCAT(book_title, '|', book_keywords) LIKE '%$search_query%' 
    AND book_date1 >= CURRENT_DATE() 
ORDER BY book_date1 

на стороне записки, SELECT * не хорошая идея. Вы должны явно указывать столбцы, которые хотите вернуть. Не из-за безопасности, а потому, что вы можете возвращать больше данных, чем вам действительно нужно. Вы также заставляете механизм БД искать, какие столбцы должны быть возвращены.

+0

Благодарим за отзыв. Как и многие, ваш ответ был невероятно полезен. По какой-то причине ORDER BY book_date не работает должным образом. Ниже приведена обновленная версия, в которой показываются только книги, прошедшие за текущую дату, но не отображающие их в режиме ASC (с самой ранней даты до последней версии) $ get_crs = mysql_query («выберите * из книг, где book_title, например«% $ search_query% », ИЛИ book_keywords, такие как '% $ search_query%' AND book_date1> = CURRENT_DATE() ORDER BY book_date1 "); – Jon

0

Я бы хотел, чтобы ваша проблема была «OR» op. Попробуйте поместить в скобки, чтобы заставить «правильный логический порядок»:

select * from books where (book_title like '%$search_query%' OR book_keywords like '%$search_query%') AND book_date1 >= CURRENT_DATE() ORDER BY book_date1 
0

Во-первых убедитесь, что $search_query правильно дезинфицировать или вы могли бы легко быть SQL инъекции.

Чтобы сделать ваш запрос добавить скобки:

$get_crs = mysql_query("select * from books where (book_title like '%$search_query%' OR book_keywords like '%$search_query%') AND book_date1 >= CURRENT_DATE() ORDER BY book_date1"); 

Это получат книги, которые соответствуют либо запрос в (), а затем получить только те, мимо current_date.