2012-04-25 56 views
1

我试图与PHP的搜索表单,使用下面的查询:SQL PHP搜索要求至少一个词

$this->images('`description`="'.db::escape($mysearch).'"'); 

它的工作很好,但它仅返回对应于$确切的描述mysearch! 我希望它从$ mysearch字段返回包含关键字(1,2或3)的所有描述。 什么是确切的SQL查询?我试着用:

'MATCH `description` AGAINST "'.db::escape($mysearch).'"' 

但我得到一个错误回来:

您的SQL语法错误;检查手册中 对应于你的MySQL服务器版本正确的语法使用 附近“MATCH title反对‘mykeyword’”在行1

的解决方案是:

'MATCH(title) AGAINST ("'.db::escape($keyword).'" IN BOOLEAN MODE)' 
+0

你是什么意思“但那不行”?你有错误信息吗?你只是得到一个空的结果集?它有助于了解您使用的SQL的风格,因为全文搜索功能对于每个数据库供应商都非常独特。一些关于mysql全文的提示可以在这里找到:http://stackoverflow.com/questions/1125678/mysql-fulltext-not-working http://stackoverflow.com/questions/3439416/fulltext-search-in-mysql-does -not-return-any-rows – 2012-04-25 17:32:46

+0

我正在使用MySQL,当我使用'MATCH'时返回的错误是: 您的SQL语法错误; 您可以直接在我的网站上尝试:www.veloccasion.net/look/mykeyword/ – PhilMarc 2012-04-25 17:38:56

+1

看起来正确的匹配语法更像是“MATCH(description)AGAINST(”.db :: escape($ mysearch)。“) ''http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html – 2012-04-25 17:44:37

回答

1

使用爆炸: http://php.net/manual/en/function.explode.php 以空格或逗号作为分隔符,然后在结果数组上为每个数组添加一行,以便为查询中的每个字符串添加一行。

对于伪例如:

//input of the string 
$input = "keyword1 keyword2 keyword3"; 
$inputArray = explode(" ",$input); 
foreach ($inputArray as $keyword) { 
    $sql .= " OR tableName.ColName like '%$keyword%'"; 
} 

明显清理和验证输入,优选使用制备语句等(看起来像您使用某种ORM的?),并希望的描述列是相对简而言之,它的全部内容都有索引,否则查询会很慢。

更新:我意识到你正在尝试使用全文索引的语法。如果你有一个MyISAM表,或者一个支持InnoDB表全文索引的足够新的mysql版本,那么你可能想跳过我提供的这个解决方案,因为一旦你在表中有更多的记录,它会变得非常慢,进入内存/缓存。不幸的是,我从来没有使用全文索引,也无法帮助您。我正在切换到使用Z​​end_Search_Lucene与上面列出的解决方案。 (http://framework.zend.com/manual/en/zend.search.lucene.html)

+0

我不相信MySQL可以使用索引来优化'like'%$ keyword%'' ,所以你最终进行顺序扫描。 – 2012-04-25 17:45:58

+0

弗兰克法默是正确的,如果你做一个像'%keyword%'一样的索引,如果你做一个像'关键字%'那么它被使用。较大的表格速度差异很大。 – 2012-04-26 16:46:37