2012-02-02 68 views
0

我有一個查詢,從數據庫中獲取的意見,並顯示他們基於什麼用戶在鍵入FULLTEXT MySQL的搜索工作不

PHP:

$query=mysql_query("SELECT * FROM comments WHERE MATCH (comments) AGAINST ('%$user_text%')"); 
    while ($row=mysql_fetch_assoc($query)){ 
     echo "<div>$row['comment']</div>"; 
    } 

這並不返回任何值。可能是我的mysql數據庫中的comments列沒有設置爲FULLTEXT。我跑這個腳本ALTER TABLE comments ADD FULLTEXT(comment);但我不能確認指數確實是FULLTEXT

UPDATE(驗證表的創建後):

CREATE TABLE `comments` (
`id` int(11) NOT NULL... 

PRIMARY KEY (`id`), //these are the last 3 lines 
FULLTEXT KEY `comments` (`comment`) 
) ENGINE=MyISAM AUTO_INCREMENT=93 DEFAULT CHARSET=latin1 
+0

運行'show create table my_table'來查看當前的架構設置。 – 2012-02-02 23:50:02

+0

@MikePurcell請看我的更新 – kirby 2012-02-03 02:07:18

+0

你可以做'var_dump($ user_text)'? – 2012-02-03 03:19:16

回答

3

想我明白了。在原始查詢中,您沒有指定一個可選的修飾符,根據MySQL,這意味着它默認爲IN NATURAL LANGUAGE MODE。根據我讀過的一些文檔以及我自己的測試,「自然語言模式」只會匹配「整個」單詞。

如果你想做部分字符串匹配,你將不得不使用IN BOOLEAN MODE修飾符。但是,有一個限制,即MySQL無法使用搜索字符串前面的通配符進行搜索,因爲它們是從左到右而不是從右到左編制索引的。所以,讓你的搜索工作,試試這個:

SELECT * FROM comments WHERE MATCH (comments) AGAINST ('$user_text*' IN BOOLEAN MODE)" 

您可以在布爾全文搜索here閱讀起來。

此外,您應該閱讀mysql_real_escape_string以清理進入查詢的變量以防止SQL注入攻擊。

+0

謝謝,但我仍然得到了500錯誤 – kirby 2012-02-03 23:45:59

+0

@Kirby:500錯誤是不同的。檢查你的php錯誤日誌,如果你不知道它在哪裏,輸入:'php -i | fgrep -i error'來自cli。 – 2012-02-03 23:56:17

+0

你是男人!我有PHP空白錯誤,它給了我一個行號。原來我需要改變我的回聲陳述爲'\t \t \t \t \t echo「

".$row['comment']."
」; ' – kirby 2012-02-04 00:06:28

0

要驗證表:

SHOW CREATE TABLE comments; 

這將向您顯示用於重新創建表的語句,包括索引。 另外,您在索引中指定了'comment'字段,但在MATCH條件中指定了'questiontitle'。

嘗試:

"SELECT * FROM comments WHERE MATCH (questiontitle) AGAINST ('$user_text')" 

或:

"SELECT * FROM comments WHERE MATCH (questiontitle) AGAINST ('$user_text' WITH QUERY)" EXPANSION 

新增:你也有可能錯字

($row=mysql_fetch_assoc($query) 

..缺少右括號 - >($行= mysql_fetch_assoc ($ query))

+0

查看更新的答案 – kirby 2012-02-02 23:51:56

+0

您應該獲得比您的帖子中顯示的更多的輸出。你是如何運行查詢的? – Cez 2012-02-02 23:53:33

+0

謝謝。代碼再次更新 – kirby 2012-02-02 23:58:21