我在社区寻找答案,但我找不到具体的内容。我有这个页面,我可以搜索以前在MySQL数据库中注册的用户名。我目前正在使用以下声明:
PHP: $value = str_replace(' ', '%', $search);
SQL: "select * from user where name like '%".$value."%' order by name asc;"
$ search 变量来自同一页面上的搜索表单。 (上面的代码允许我使用多个值进行查询)。例如,考虑一个名为 Luiz Henrique da Silva 的用户,如果我搜索 Luiz , Luiz Henrique ,甚至 Luiz Silva < / em>,此代码将完美,列出该用户。
但我的问题是:如果我按顺序搜索名称,例如 Silva Henrique 或 Silva Luiz ,则不会列出该用户。如何以简单的方式启用此反向搜索?
请注意,使用此代码我可以搜索单独的值,因此我需要使用无序值进行查询!
答案 0 :(得分:3)
PHP:
$value = str_replace(" ", "%' and name like '%", $search);
分别使用每个单词。但不安全:sql注入。
使用preg_replace迎合连续的空格:
$value = preg_replace('/\s+/', "%' and name like '%", $search);
答案 1 :(得分:0)
将未经过处理的用户输入直接注入查询是一个坏主意,因为有人可以执行自己的查询并危及您的数据/安全性。查看准备好的陈述:http://php.net/manual/en/mysqli.quickstart.prepared-statements.php。
至于你的问题,你可以进行所提供的搜索,例如:Luiz Henrique,用空格分开它,这样你得到“Luiz”和“Henrique”,然后创建一个看起来像这样的语句: p>
WHERE name LIKE '%Luiz%' AND name LIKE '%Henrique%'
通过这种方式,您只需为每个组件添加AND
LIKE
个语句。
答案 2 :(得分:0)
$search = 'Jobs Steve';
$search = mysql_real_escape_string($search);
$where_condition = '';
$search_arr = explode(' ', $search);
foreach($search_arr as $key => $name) {
if ($where_condition != '') $where_condition .= ' AND ';
$where_condition .= " name LIKE '%$name%' ";
}
$sql = "SELECT * FROM user WHERE $where_condition ORDER BY name ASC;";
$sql
将像SELECT * FROM user WHERE name LIKE '%Jobs%' AND name LIKE '%Steve%' ORDER BY name ASC;