为搜索功能创建MySql查询

时间:2017-09-14 02:26:28

标签: php mysql

我的网站查询搜索功能有些问题。我有一个保存书籍数据的表,在前端页面我有搜索功能,通过一些搜索参数找到书。

这是我的数据库表:

book_id | book_name       | book_location | book_qty | book_date
-----------------------------------------------------------------
1       | Triangle Math   | rack1         | 2        | 2017-06-12
2       | Basic Knowledge | rack2         | 3        | 2016-08-09
3       | Legend Truth    | rack3         | 1        | 2014-05-17
4       | Temporary Brain | rack4         | 1        | 2013-01-23

这是我在前端页面中的搜索:

1. Input Field book name -- $name
2. Dropdown list book location -- $location
3. Search Button

上面的四个参数是查询中用于获取搜索结果的变量。

我已经尝试过这个查询,但没有给我最好的结果。

SELECT * FROM `book` WHERE book_name like '%".$name."%' OR book_location = '".$location."'

当我只选择下拉列表中的位置并将字段簿名称留空时,例如我选择 rack1 我得到了结果所有数据都显示出来。我只想获取 rack1 book_location的数据。在我var_dump()查询之后,我才意识到我收到了这个查询:

SELECT * FROM `book` WHERE book_name like '%%' OR book_location = 'rack1'

我知道该查询会得到所有数据,因为book_name like'%%'

我想问的是,如果没有填写搜索功能中的所有参数,如何对搜索进行最佳查询?谢谢。

1 个答案:

答案 0 :(得分:0)

只需检查$name是否为空,然后执行相应的查询:

if ($name !== "") {
    // SELECT * FROM `book` WHERE book_name like '%".$name."%' OR book_location = '".$location."'
}
else {
    // SELECT * FROM `book` WHERE book_location = '".$location."'
}

如果您使用短路条件,也可以在一个查询中执行此操作:

SELECT * FROM book WHERE (".$name." != "" AND book_name LIKE '%".$name."%') OR book_location = '".$location."';

只有当第一个操作数也为真时才会检查第二个操作数($name不为空)

作为警告,您似乎容易受到SQL注入攻击。使用prepared statements