我已经为我的网站构建了一个简单的搜索栏,如果我的查询看起来像这样,那么效果很好:
$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");
两个查询之间的区别在于第二个查询将搜索多个列,这是我需要的,因为我的用户可以搜索名称或城市。
我该如何重写?
答案 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 extension或mysqli 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注入攻击;实际上,你现在应该使用参数化查询。