在 MySQL 中使用 PHP 进行多词搜索
Multiple word search in MySQL with PHP
我在尝试使用文本框中的多个词进行搜索时遇到问题,但无法解决。下面的代码不起作用,但它适用于搜索 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)){
?>
您正在尝试将数组转换为字符串。 explode
returns 一个数组。试试看
$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)){
?>
您必须将字符串传递给 MATCH AGAINST
函数。
此外,要确保 post 包含所有单词,例如“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 错误报告以了解代码中的错误。空白页对您没有多大帮助。
希望对你有所帮助,祝你好运。
编辑:
由于错误信息:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error:
1191 Can't find FULLTEXT index matching the column list' in C:\xampp\htdocs\scraping\result.php:82
Stack trace: #0 C:\xampp\htdocs\scraping\result.php(82): PDOStatement->execute() #1 {main}
thrown in C:\xampp\htdocs\scraping\result.php on line 82
您必须通过 FULLTEXT
索引 table 列,并在 table 上启用 KEYS
:
ALTER TABLE weblinks ENABLE KEYS;
ALTER TABLE weblinks ADD FULLTEXT(post);
我在尝试使用文本框中的多个词进行搜索时遇到问题,但无法解决。下面的代码不起作用,但它适用于搜索 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)){
?>
您正在尝试将数组转换为字符串。 explode
returns 一个数组。试试看
$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)){
?>
您必须将字符串传递给 MATCH AGAINST
函数。
此外,要确保 post 包含所有单词,例如“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 错误报告以了解代码中的错误。空白页对您没有多大帮助。
希望对你有所帮助,祝你好运。
编辑:
由于错误信息:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error:
1191 Can't find FULLTEXT index matching the column list' in C:\xampp\htdocs\scraping\result.php:82
Stack trace: #0 C:\xampp\htdocs\scraping\result.php(82): PDOStatement->execute() #1 {main}
thrown in C:\xampp\htdocs\scraping\result.php on line 82
您必须通过 FULLTEXT
索引 table 列,并在 table 上启用 KEYS
:
ALTER TABLE weblinks ENABLE KEYS;
ALTER TABLE weblinks ADD FULLTEXT(post);