2012-02-07 55 views
1

我试着写功率在我的节目搜索功能:PDO/MYSQL准备的语句不能转义字符?

$search = "%".$_POST['search']."%"; 
$query=$connection->prepare("SELECT * FROM TABLE WHERE COLUMN LIKE ?"); 
$query->execute(array($search)); 

然而,似乎用户只需输入%,它返回所有结果。我如何防止这种情况发生?我的印象是,使用预先准备好的陈述将会逃脱这些角色。这是否也适用于其他字符(\,'等)?我该如何解决?

回答

1

准备好的语句不会漏掉任何东西。在准备语句时,您的查询会进行预编译,因此只需填充占位符(?)。由于无法更改预编译查询的SQL,因此不需要转义。

要解决此问题,请手动跳转%_

补充:

常识推理一下:在你的情况,WHN用户进入%到搜索框,你$search变量包含字符串%%%。 MySQL如何知道它应该逃脱哪个%以及它应该单独离开?

1

如果您不想将其作为有效输入,则需要防止在应用程序代码中包含%_

if (strpos($_POST['search'], '%') !== FALSE || strpos($_POST['search'], '_') !== FALSE) { 
    $query = $connection->prepare("SELECT * FROM TABLE WHERE COLUMN LIKE ?"); 
    $query->execute(array($search)); 
} 
else echo "% and _ are not allowed!"; 

至于像'字符,就会被视为替代?占位符传递的字符串的一部分,而不是串联在建立一个SQL语句。所以他们很安全。

0

您必须正确地转义用户输入,让服务器知道哪些字符是通配符,哪些是要匹配的数据。

$search = '%' . str_replace(array('_', '%'), array('\\_', '\\%'), $_POST['search']) . '%'; 

这会逃避那些被认为是通配符的字符。 $search现在将包含沿着线的东西:

%100\%% 

将匹配I always give 100% when working但不I do 100 pushups daily