【问题标题】:Multiple word search in MySQL with PHP使用 PHP 在 MySQL 中进行多词搜索
【发布时间】:2017-07-10 03:45:43
【问题描述】:

我在尝试使用文本框中的多个单词进行搜索时遇到问题,但我无法解决。下面的代码不起作用,但它适用于搜索 LIKE '%$keywords%'

请看看,如果你能帮助我解决任何问题!

 $search = $_POST['search'];
 $search = trim($search);
 $search = preg_replace('/\s+/', ' ', $kerko);
 $keywords = explode(" ", $kerko);

 $sql = $conn->prepare("SELECT * FROM weblinks WHERE MATCH(post) AGAINST('$keywords')");


 $sql->execute();
 while($row = $sql->fetch(PDO::FETCH_ASSOC)){    
 ?>

【问题讨论】:

  • 什么是“不工作”?您收到任何错误消息吗?
  • 页面为空,没有任何返回,但使用 LIKE '%$keywords%' 正常返回 LIKE 可以做什么
  • 好的,预期的输出是什么?每个关键字都需要吗?
  • 举一个 $keywords 失败的例子。然后阅读您可以在AGAINST 中添加的注意事项。

标签: php mysql regex preg-match-all


【解决方案1】:

您必须将字符串传递给MATCH AGAINST 函数。

此外,为确保帖子包含每个字词,例如“LIKE”,您必须在所需字词的开头添加“+”符号。

$search = $_POST['search'];
$search = trim($search);
$search = preg_replace('/\s+/', ' ', $kerko);
$keywords = explode(" ", $kerko); // create array of keywords

// here we build the string to require all keywords
$keywds_str = "+" . implode(" +", $keywords);

然后是 SQL 查询:

$sql = $conn->prepare("SELECT * FROM weblinks WHERE MATCH(post) AGAINST ('".$keywds_str."')");

请注意字符串连接。在您的示例中,查询必须按字面意思查找“$keywords”。

最后一点,启用 php 错误报告以了解代码中的问题。空白页对您没有多大帮助。

希望对你有帮助,祝你好运。

编辑:

由于错误信息:

致命错误:未捕获的异常“PDOException”和消息“SQLSTATE[HY000]:一般错误:

1191 在 C:\xampp\htdocs\scraping\result.php:82 中找不到与列列表匹配的 FULLTEXT 索引

堆栈跟踪:#0 C:\xampp\htdocs\scraping\result.php(82): PDOStatement->execute() #1 {main}

在第 82 行的 C:\xampp\htdocs\scraping\result.php 中抛出

您必须通过FULLTEXT 为表格列建立索引,并在该表格上启用KEYS

ALTER TABLE weblinks ENABLE KEYS; 
ALTER TABLE weblinks ADD FULLTEXT(post);

【讨论】:

  • 致命错误:未捕获的异常 'PDOException' 带有消息 'SQLSTATE[HY000]:一般错误:1191 在 C:\xampp\htdocs\scraping\result 中找不到匹配列列表的 FULLTEXT 索引.php:82 堆栈跟踪:#0 C:\xampp\htdocs\scraping\result.php(82): PDOStatement->execute() #1 {main} 在 C:\xampp\htdocs\scraping\result.php 中抛出在第 82 行和第 82 行是 $sql->execute();
  • 好的,当我们知道错误时,我们可以搜索解决方案。似乎搜索到的列没有被FULLTEXT 索引(需要与MATCH AGAINST 一起使用)。在Can't find FULLTEXT 上查看此链接或自行google,您会找到解决方案。
  • 无法修复,请问有关于搜索的想法吗?
  • 是的,它说您可以启用表上的键:ALTER TABLE weblinks ENABLE KEYS; 或者该表没有被 FULLTEXT 索引。所以你必须索引它:ALTER TABLE weblinks ADD FULLTEXT(post);
  • 现在可以了
【解决方案2】:

您正在尝试将数组转换为字符串。 explode 返回一个数组。试试吧

$search = $_POST['search'];
$search = trim($search);
$search = preg_replace('/\s+/', ' ', $kerko);
$keywords = explode(" ", $kerko);

$query = "SELECT * FROM weblinks WHERE ";
foreach ($keywords as $keyword) {
    $query .= " post LIKE '%$keyword%' OR";
}
$query = rtrim($query, 'OR');

$sql = $conn->prepare($query);    

$sql->execute();
while($row = $sql->fetch(PDO::FETCH_ASSOC)){    
?>

【讨论】:

  • 还是什么都没有,我也用$search更新了$kerko..又什么都没有
  • 在@wogslands 示例中的post 之前添加一个空格:$query .= " post LIKE '%$keyword%' OR"; 缺少空格,因此使用多个关键字的查询最终会像foreach 循环中的ORpost LIKE...
  • 没有 foreach 循环的替代短版本:$query = "SELECT * FROM weblinks"; 然后:$query .= empty($keywords) ? '' : " WHERE post LIKE '%". implode("%' OR post LIKE '%", $keywords) ."%'";
猜你喜欢
  • 2019-07-24
  • 1970-01-01
  • 2014-11-18
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
相关资源
最近更新 更多