2012-12-03 177 views
7

我將使用mysql_ *函數的所有網站代碼轉換爲PDO。關於PDO的PHP文檔並不清楚我的需求。它給你使用的功能,但沒有詳細解釋它們在不同的場景。PDO和MySQL全文搜索

基本上,我有一個MySQL全文搜索:

$sql = "SELECT ... FROM search_table WHERE MATCH(some_field) AGAINST ('{$searchFor}*' IN BOOLEAN MODE)"; 

實際報表更長的時間,但是這是它基本上。

我的問題是,我將如何將它納入PDO?

我知道你不打算在地點標記周圍使用引號,所以你把它們放在AGAINST()函數中嗎?我包括他們嗎?如果我將它們排除在外,通配符等會發生什麼情況?

$sql = $this->db->prepare("SELECT ... FROM search_table WHERE MATCH(some_field) AGAINST(:searchText IN BOOLEAN MODE"); 
$sql->bindValue(':searchText', $searchFor . '*'); 

回答

12

這是不幸的是一個奇怪的例外使用的查詢參數(編輯:但顯然不是每個MySQL的分支的最近點釋放,見下文)。

AGAINST()必須中的模式是一個常量字符串,而不是查詢參數。與SQL查詢中的其他常量字符串不同,您不能在這裏使用查詢參數,只是因爲MySQL的限制。

要將搜索模式安全地插入到查詢中,請使用PDO::quote()函數。請注意,PDO的quote()函數已經添加了引號分隔符(與mysql_real_escape_string()不同)。

$quoted_search_text = $this->db->quote('+word +word'); 

$sql = $this->db->prepare("SELECT ... FROM search_table 
    WHERE MATCH(some_field) AGAINST($quoted_search_text IN BOOLEAN MODE"); 

從@YourCommonSense

回覆評論:

你說得對,我只是測試這在MySQL 31年5月5日,68年5月1日,和5.0.96(MySQL的沙盒是一個奇妙的工具),並且似乎這些版本在動態SQL查詢的AGAINST()子句中接受查詢參數。

我仍然記得過去存在的衝突。也許它已在每個分支的最新版本發佈中得到糾正。例如,我發現這些相關的問題:

+0

非常感謝您的回答,並替代解決方案:) –

+2

我無法重現你說的是這個「怪異」的行爲。 「反對(在布爾模式中)」適合我。你使用的是什麼MySQL版本? –

+0

當然,仿真模式將被關閉並進行雙重檢查。 –

0
$sql = "SELECT * FROM tablename WHERE MATCH (fieldname) AGAINST (:searchstr IN BOOLEAN MODE) LIMIT {$per_page} OFFSET {$pg_offset}"; 

try { 
    $database->prepare($sql); 
    $database->bindParam(':searchstr', $search); 
    $database->execute(); 
    $result_array = $database->fetch_array($sql); 
} catch (Exception $e) { 
    echo $e->getMessage(); 
}