检索超出当前日期的项目

时间:2015-01-18 00:13:16

标签: javascript php mysql sql mysqli

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

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

这是一个优先问题。 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 *并不是一个好主意。您应该明确命名要返回的列。不是因为安全性,而是因为您可能返回的数据超出实际需要的数量。您还强制数据库引擎查找应该返回哪些列。

答案 1 :(得分:0)

我会邀请你的问题是"或"运。尝试将括号强制为正确的逻辑顺序":

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

答案 2 :(得分: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之后的图书。