2014-11-21 50 views
0

我最近採用了PDO準備語句。當寫WHERE子句MATCH,我用如下執行精確的字符串匹配:強制PDO準備語句的準確字符串匹配

WHERE MATCH(some_column) AGAINST('\"$some_term\"') 

它完美地工作。現在,我已經切換到使用PDO bindValue如下:

WHERE MATCH(some_column) AGAINST(:some_term) 

當綁定多個詞語,如「橙色自行車」,我得到一個字符串結果的「橙色」和「自行車」,而我要的是一個確切的匹配「橙色自行車」。

如何爲我的PDO準備語句強制一個確切的字符串匹配?

(我用Google搜索和搜索本網站但我找不到這個問題的任何討論的任何地方。我不能成爲第一人問這個問題,但我無法找到答案!)

+0

嘗試'IN BOOLEAN MODE'。 – shudder 2014-11-21 04:11:57

+0

您是否將引號添加到綁定到'':some_term''的變量?如果'$ some_term''是變量,請嘗試''$ some_term ='「'。$ some_term。'」';'' – ub3rst4r 2014-11-21 07:02:23

+0

@ ub3rst4r Aha!這就是你如何做到的。謝謝您的幫助。希望我可以將您的評論標記爲答案。 – iakkam 2014-11-22 02:44:24

回答

2

確保您正在AGAINST中指定的變量周圍加上引號。

在PHP:

$some_term = '"'.$some_term.'"'; // Adds quotes around string 

$stmt = $db->prepare('SELECT * FROM example WHERE MATCH(some_column) AGAINST(:some_term)'); 
$stmt->bindParam(':some_term', $some_term, PDO::PARAM_STR); 
$stmt->execute(); 

或者你可以做到這一點在MySQL的聲明,以及:

$stmt = $db->prepare('SELECT * FROM example WHERE MATCH(some_column) AGAINST(CONCAT(\'"\',:some_term,\'"\')'); 
$stmt->bindParam(':some_term', $some_term, PDO::PARAM_STR); 
$stmt->execute(); 

按照MySQL documentation on Boolean Full-Text Searches:即內封閉

短語雙引號(「」「)字符僅匹配包含該短語的行,因爲它是鍵入的。全文引擎將短語拆分爲單詞並在FULLTEXT索引中執行單詞搜索。非字字符不需要完全匹配:短語搜索僅需要匹配包含與短語完全相同的單詞並且以相同的順序。例如,「測試短語」匹配「測試,短語」。

如果短語不包含索引中的單詞,則結果爲空。例如,如果所有單詞都是停用詞或短於索引單詞的最小長度,則結果爲空。

+0

感謝您的幫助。 – iakkam 2014-11-22 14:24:55