2012-02-07 74 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