当用户输入%时,PDO LIKE返回所有结果

时间:2015-09-27 18:52:56

标签: php pdo

我使用PDO LIKE使用通配符'%'来匹配部分结果:

$value = $_GET["searchValue"];
$dbh = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
$query = $dbh->prepare('SELECT * FROM table WHERE column1 LIKE ? OR column2 LIKE ?'); 
$query->execute(array("%$value1%","%$value2%"));

我的问题是,当用户输入'%''%%%%%'时,它会返回database上的所有值,即使没有保存{{1}的任何内容符号con %

提前致谢。

2 个答案:

答案 0 :(得分:1)

  

我有以下PDO使用通配符'%'匹配部分结果

     

当用户输入'%'它返回数据库中的所有值,即使没有任何与%符号con保存该行的内容。

上面这两段,相当矛盾?

当你自己使用%时,你希望它匹配任何角色,但是然后用户正在使用它,你希望它只匹配%literaly。唉,mysql还不能读懂思想,也不能告诉别人一个%。

坦率地说,根本没有问题。返回LIKE '%%%'语句的所有行是为%wildcard is设计的。如果你想让用户按字面意思搜索%字符,你必须用反斜杠转义它。

答案 1 :(得分:1)

让我们只考虑$value1变量。

当用户插入%时,PDO会进行查询

SELECT * FROM table WHERE column1 LIKE '%%%'

这是正确的行为。

但是,如果你想用这种模式搜索(这就是你想要的)字符串 [anything]%[anithing]您必须转义用户输入,使查询看起来像

SELECT * FROM table WHERE column1 LIKE '%\%%'

为此,您必须将%替换为\%。 基本上,你唯一要做的就是改变这一行

$value = $_GET["searchValue"];

以这种方式

$value = str_replace('%', '\%', $_GET["searchValue"]);

我希望它有所帮助。