搜索栏的查询问题

时间:2013-07-07 23:14:51

标签: php mysql

我已经为我的网站构建了一个简单的搜索栏,如果我的查询看起来像这样,那么效果很好:

$sql = query("SELECT id, firstname, lastname, username, location FROM 
users WHERE firstname LIKE '%" . $search_query . "%' LIMIT 20");

但如果我这样写,它会回应一个SQL语法错误:

$sql = query("SELECT id, firstname, lastname, username, location FROM 
users WHERE firstname, lastname, username, location  LIKE '%" . $search_query . "%'   
LIMIT 20");

两个查询之间的区别在于第二个查询将搜索多个列,这是我需要的,因为我的用户可以搜索名称或城市。

我该如何重写?

3 个答案:

答案 0 :(得分:1)

不幸的是,你必须为每个字段重复LIKE语句。

SELECT id, firstname, lastname, username, location FROM users 
WHERE firstname LIKE '%" . $search_query . "%'
OR lastname LIKE '%" . $search_query . "%' 
OR username LIKE '%" . $search_query . "%'
OR location LIKE '%" . $search_query . "%'
LIMIT 20

答案 1 :(得分:1)

关键字LIKE不起作用。试试这个:

$like_string = "'%$search_query%'";

$query = "SELECT id, firstname, lastname, username, location
FROM users
WHERE firstname LIKE $like_string OR
lastname LIKE $like_string OR
username LIKE $like_string OR
location LIKE $like_string
LIMIT 20";

$sql = query($query);

正如其他人会告诉你的那样,在接受任何用户数据之前,考虑SQL注入并执行完整性和有效性检查是明智之举。请查看有关如何防止SQL注入的this问题。

PDO extensionmysqli extension是首选,而mysql_函数已被弃用(在整个documentation中可以看到)。

答案 2 :(得分:0)

您需要单独指定每个列的搜索条件:

$sql = query("SELECT id, firstname, lastname, username, location
FROM users
WHERE firstname LIKE '%$search_query%'
OR lastname LIKE '%$search_query%'
OR username LIKE '%$search_query%'
OR location LIKE '%$search_query%'
LIMIT 20");

正如您所看到的,我删除了连接 - 因为您使用双引号,变量可以直接进入查询。

另外,我希望$search_query已经被逐出,或者你正在打开SQL注入攻击;实际上,你现在应该使用参数化查询。