如何使用like和多个无序值创建SQL查询

时间:2018-06-09 03:51:23

标签: php mysql sql

我在社区寻找答案,但我找不到具体的内容。我有这个页面,我可以搜索以前在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 Si​​lva < / em>,此代码将完美,列出该用户。

但我的问题是:如果我按顺序搜索名称,例如 Silva Henrique Silva Luiz ,则不会列出该用户。如何以简单的方式启用此反向搜索?

请注意,使用此代码我可以搜索单独的值,因此我需要使用无序值进行查询!

3 个答案:

答案 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;