2017-08-17 76 views
0

我有以下簡單的搜索查詢代碼:如何從MySql中檢索信息而忽略特殊字符?

function explode_search($squery, $column, $db, $link) { 
global $conn; 

$ven = explode(' ', safeInput(str_replace(',', '', $squery))); 
$ven2 = array_map('trim', $ven); 
$qy = ''.$column.' LIKE "%'.implode('%" AND '.$column.' LIKE "%', $ven2).'%"'; 

$query = 'SELECT DISTINCT '.$column.', id, work_composer FROM '.$db.' WHERE '.$qy.' ORDER BY '.$column.' LIMIT 100'; 
$result = mysqli_query($conn, $query); 
while ($row = mysqli_fetch_assoc($result)) { 

    echo '<div><span class="mdmtxt" style="margin-bottom:5px;"><a href="'.$link.'.php?id='.$row['id'].'">'.$row[$column].'</a></span> <span class="mdmtxt" style="opacity:0.6;">('.fixcomp(cfid($row['work_composer'], 'cffor_composer', 'composer_name')).')</span></div>'; 
} 
} 

(該safeInput函數刪除「和」和其他可能的問題羣)

它的工作好了在一定程度上

當有人看。對於'Stephane',我希望他們也能找到'Stéphane'(反之亦然),或者如果他們正在尋找'Munich','Münich'也應該出現在列表中。

有沒有辦法讓MySQL匹配那些搜索查詢不管涉及什麼特殊字符?

+0

如果使用了綁定參數,則不會有任何有問題的字符* – CD001

+0

您可能還想檢查數據庫表的排序規則;如果你使用'utf8_general_ci'(例如)它應該匹配帶有或不帶重音符的字符; * Stephane *和*Stéphane*在你的例子中*應該沒問題。 – CD001

回答

0

你想使用所謂的「參數化查詢」。大多數語言都有它們,它們被用來保護輸入並防止攻擊。

它們在使用後也非常容易使用。

你開始有這樣的

$stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")

一個簡單的查詢和你?小號取代所有的實際數據。

然後你綁定每個參數。

$stmt->bind_param("s", $city);

然後調用$stmt->execute();

更多信息可以在這裏找到:http://php.net/manual/en/mysqli.prepare.php

有一次在大學裏,我們的教授讓我們使用沒有參數化查詢庫,因此我我自己寫了一個實現。主義,這非常棒,爲你處理所有這些。我會一直依靠別人來爲我做這些東西,而不是寫我自己的實現。你會以這種方式陷入困境。還有很多關於不重新發明新類型的文章,基本上就是你在做什麼。類型有問題。類型需要測試。這種事情在其他實現中已經過很好的測試,而不是你的。