我在网站上添加搜索时遇到了麻烦。我无法弄清楚如何完成它。
我的表格如下:
TABLE A
id text
1 Hello there whats up. I'm trying to code.
2 there need to be this code
现在我想使用 关键字 = 您好 代码
结果应该为我提供两行,因为这两行都包含关键字的一部分,如下所示:
id text
1 **Hello** there whats up. I'm trying to **code**
2 there need to be this **code**
此外,结果应该为行提供最先匹配的最大关键字数。
我试过这样做,但它只为我提供了一些我渴望的结果。
<?php
$keyword = 'hello code';
$exloded = explode(' ', $keyword);
foreach($exploded as value):
$sth = $db->query("SELECT * FROM A WHERE `text` LIKE :value");
$sth->execute(array(':value' => '%'.$value.'%'));
$rows = $sth->fetchAll();
endforeach;
echo $rows;
?>
更新
我只是做了这个,它对我来说很好。但我想知道这是否是完成工作的正确方法。
$keyword = hello code;
$query ="SELECT *, MATCH(`page_content`) AGAINST('$keyword' IN BOOLEAN MODE) AS score FROM super_pages WHERE MATCH(`page_content`) AGAINST('$keyword' IN BOOLEAN MODE) ORDER BY score DESC";
$sth = $this->db->query($query);
$result = $sth->fetchAll();
答案 0 :(得分:1)
$rows
会在您的表格中显示关键字code
匹配的数据,您可以重写代码以匹配两个关键字
$keyword = 'hello code';
$exloded = explode(' ', $keyword);
$query = 'SELECT * FROM A ';
$i = 0;
$params = array();
foreach ($exploded as $value):
if ($i == 0) {
$query .= ' WHERE `text` LIKE :value_'.$i;
} else {
$query .= ' OR `text` LIKE :value_'.$i;
}
$params[':value_'.$i] = '%'.$value .'%';
$i++;
endforeach;
$sth = $db->query($query);
$sth->execute($params);
$rows = $sth->fetchAll();
echo '<pre>';print_r($rows);echo '</pre>';
循环构建查询(通过提供的关键字)并在查询中指定唯一占位符以匹配所有值
使用全文搜索,您可以使用提供的关键字匹配完全相同的词组。要使用全文搜索,您需要类型为FULLTEXT
的索引。
ALTER TABLE `A` ADD FULLTEXT INDEX `fulltextindex` (`text`);
查询就像
$keyword = 'hello code';
$exloded = explode(' ', $keyword);
$where = '';
$i = 0;
$select = array();
$params = array();
foreach ($exploded as $value):
$select[]= ' MATCH(`text`) AGAINST(:value_'.$i.' IN BOOLEAN MODE) ';
if ($i == 0) {
$where .= ' WHERE MATCH(`text`) AGAINST(:value_'.$i.' IN BOOLEAN MODE)';
} else {
$where .= ' OR MATCH(`text`) AGAINST(:value_'.$i.' IN BOOLEAN MODE)';
}
$params[':value_'.$i] = $value ;
$i++;
endforeach;
$query ='SELECT *,'. implode( ' + ',$select).' AS score FROM A '.$where.' ORDER BY score DESC';
$sth = $db->query($query);
$sth->execute($params);
$rows = $sth->fetchAll();
echo '<pre>';print_r($rows);echo '</pre>';
以上代码将生成类似
的查询SELECT *,
MATCH(`text`) AGAINST('hello' IN BOOLEAN MODE)
+
MATCH(`text`) AGAINST('code' IN BOOLEAN MODE) AS score
FROM A
WHERE MATCH(`text`) AGAINST('hello' IN BOOLEAN MODE)
OR MATCH(`text`) AGAINST('code' IN BOOLEAN MODE)
ORDER BY score DESC
上述查询中的别名score
将为每一行及其匹配的分数赋值,因此您可以按降序排序结果,以便首先显示分数最高的记录。
注意:您可以在Myisam中使用全文搜索,但对于innodb,您可以使用 将Mysql升级到5.6,支持全文搜索 innodb也是
答案 1 :(得分:0)
您可以使用以下代码:
<?php
$keyword = 'hello code';
$exloded = explode(' ', $keyword);
$sql = "SELECT * FROM A WHERE ";
foreach($exploded as $value):
$sql .= "text LIKE '" . $value "%' OR ";
endforeach;
// remove last 'OR '
$sql = substr($sql, -3);
$result = mysqli_query($con, $sql);
//................
?>