2015-09-27 43 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