我有一个查询,它从数据库中获取注释,并根据用户输入的内容显示它们。
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
更新(在验证表格的创建方式后):
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 :(得分:3)
想想我明白了。在原始查询中,您没有指定可选修饰符,根据MySQL,它表示默认为IN NATURAL LANGUAGE MODE。根据我读过的一些文档,以及我自己的测试,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注入攻击。
答案 1 :(得分:0)
验证表格:
SHOW CREATE TABLE comments;
这将显示用于重新创建表的语句,包括索引。 此外,您在索引中指定了“注释”字段,但在MATCH条件中指定了“问题标题”。
尝试:
"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)
..缺少右括号 - &gt; ($行= mysql_fetch_assoc($查询))