检索当前日期之后的项目

Retrieve items beyond current date

我正在使用 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");

如有任何帮助,我们将不胜感激。

请问您的问题是 "OR" 操作。尝试用括号强制 "right logic order":

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

首先确保 $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.

的书籍

这是一个优先问题。 AND 优先于 OR 所以对于数据库引擎你的查询看起来像这样:

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 * 不是一个好主意。您应该明确命名您想要 return 的列。不是因为安全性,而是因为您可能 return 获取比实际需要更多的数据。您还强制数据库引擎查找应该 returned 的列。