我正在尝试用php创建一个搜索表单,使用以下查询:
$this->images('`description`="'.db::escape($mysearch).'"');
它工作得很好,但它只返回与$ mysearch对应的EXACT描述! 我希望它返回包含$ mysearch字段中关键字(1,2或3)的所有描述。 什么是确切的SQL查询?我尝试过:
'MATCH `description` AGAINST "'.db::escape($mysearch).'"'
但是我收到了错误:
您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 靠近'MATCH
title
AGAINST“mykeyword”'在第1行
解决方案是:
'MATCH(title) AGAINST ("'.db::escape($keyword).'" IN BOOLEAN MODE)'
答案 0 :(得分:2)
使用爆炸: http://php.net/manual/en/function.explode.php 在空格或逗号上作为分隔符,然后对结果数组中的每一个执行a操作,以便为查询中的每个字符串添加一行。
对于伪示例:
//input of the string
$input = "keyword1 keyword2 keyword3";
$inputArray = explode(" ",$input);
foreach ($inputArray as $keyword) {
$sql .= " OR tableName.ColName like '%$keyword%'";
}
显然清理它并验证输入,最好使用预处理语句等(看起来你正在使用某种ORM?),并希望描述列相对较短并且有完整内容的索引,否则查询会很慢。
更新:我意识到您正在尝试使用全文索引的语法。如果你有一个MyISAM表,或者一个足够新的mysql版本支持InnoDB表上的全文索引,那么你可能想跳过我提供的这个解决方案,因为如果你在表中有更多的记录,它会变得很慢进入内存/缓存。不幸的是,我从未使用过全文索引而无法帮助你。我转而使用Zend_Search_Lucene与上面列出的解决方案。 (http://framework.zend.com/manual/en/zend.search.lucene.html)