1

我正在尝试使用以下查询使用 php 制作搜索表单:

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

它工作得很好,但它只返回与 $mysearch 对应的 EXACT 描述!我希望它返回包含 $mysearch 字段中的关键字(1、2 或 3)的所有描述。确切的 SQL 查询是什么?我试过:

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

但我得到一个错误:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便title在第 1 行的 'MATCH AGAINST "mykeyword"'附近使用

解决方案是:

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

1 回答 1

2

在空格或逗号上使用explode: 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 表,或者一个足够新的 mysql 版本,它支持 InnoDB 表上的全文索引,那么你可能想跳过我提供的这个解决方案,因为一旦你的表中有更多的记录,它就会变得非常慢进入内存/缓存。不幸的是,我从未使用过全文索引,因此无法为您提供帮助。我正在改用 Zend_Search_Lucene 与上面列出的解决方案。(http://framework.zend.com/manual/en/zend.search.lucene.html)

于 2012-04-25T17:39:44.360 回答