2015-09-27 26 views
0

我有以下PDOLIKE使用通配符'%'匹配的部分结果: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上,即使没有用%保存的东西符号con row

在此先感谢。

回答

1

我有使用通配符LIKE“%”可以匹配的部分结果

以下PDO,当用户输入“%”它返回数据库的所有值,即使没有与任何保存用%符号表示该行。

以上两段,相当矛盾呢?

当您使用%自己时,您希望它匹配任何字符,但用户正在使用它,您希望它只匹配%literaly。唉,mysql仍然无法读懂头脑,并且无法从另一个角度讲出一个%。

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

+0

我不想逃避%。基本上,如果用户在搜索框中输入%self,它将返回存储在数据库中的所有结果,但在Db上没有包含百分号的单个行,这意味着它应该找到与0匹配的0行。 –

+2

_“我不想逃避%” - 但如果你希望它是一个字面百分比字符,而不是通配符, – CBroe

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

我希望它能帮助。

+0

这个解决方案就像一个魅力。谢谢@nessuno –

+0

@OzkarR如果这个答案对您有用,它已经解决了您的问题,请将其标记为“接受答案”。 – felipsmartins