2

我为我的网站构建了一个简单的搜索栏,如果我的查询看起来像这样,它就很好用:

$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");

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

我应该如何重写它?

4

3 回答 3

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 注入的问题。

PDO 扩展mysqli 扩展是 MySQL的首选,并且函数已被弃用(在整个文档mysql_中可以看到)。

于 2013-07-07T23:21:20.960 回答
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
于 2013-07-07T23:18:54.073 回答
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 注入攻击敞开心扉;真的,您现在应该使用参数化查询。

于 2013-07-07T23:19:47.077 回答