使用PHP+;实现(几乎)功能齐全的全文搜索;mysql

使用PHP+;实现(几乎)功能齐全的全文搜索;mysql,php,mysql,search,mysqli,full-text-search,Php,Mysql,Search,Mysqli,Full Text Search,我正在做一个需要搜索引擎的项目。 我知道MySQL的布尔模式全文功能。但我当前的实现可以通过在文本字段中添加引号来打破… 我需要什么: 允许使用诸如+必选、可选、“完整短语”和等功能的搜索引擎不得包含,并相应地对结果进行排序(大多数匹配项位于顶部等)。 我想到的可能解决方案: 一个以某种方式转义搜索字符串的函数,所提到的功能仍然存在,但是如果语法完全错误,MySQL不会发疯。 一个完整的、独立于mysql的搜索算法,用PHP编写(请告诉我,如果您有任何建议的库),它也可以做同样的事情(并且可能允

我正在做一个需要搜索引擎的项目。
我知道MySQL的布尔模式全文功能。但我当前的实现可以通过在文本字段中添加引号来打破…
我需要什么:
允许使用诸如
+必选
可选
“完整短语”
等功能的搜索引擎不得包含
,并相应地对结果进行排序(大多数匹配项位于顶部等)。

我想到的可能解决方案:
一个以某种方式转义搜索字符串的函数,所提到的功能仍然存在,但是如果语法完全错误,MySQL不会发疯。

一个完整的、独立于mysql的搜索算法,用PHP编写(请告诉我,如果您有任何建议的库),它也可以做同样的事情(并且可能允许自动完成-完全可选)

如果你问自己我当前的实现是什么,它目前是一些基本的和未完成的东西,比如

$result = $mysqli -> query("SELECT * FROM table WHERE MATCH(TITLE) AGAINST('$q' IN BOOLEAN MODE) ORDER BY MATCH(TITLE) AGAINST('$q' IN BOOLEAN MODE)")

感谢您的帮助

您确实希望使用mysqli::prepare,而不是在查询中插入搜索字符串(请参阅)。结果应该是这样的

$statement = $mysqli->prepare("SELECT * FROM table WHERE MATCH(TITLE) AGAINST(? IN BOOLEAN MODE) ORDER BY MATCH(TITLE) AGAINST(? IN BOOLEAN MODE)");
$statement->bind_param("ss", $q, $q);
$statement->execute();
$result = $statement->get_result();

首先准备语句,然后将参数绑定到问号占位符。不需要手动转义。

您确实希望使用mysqli::prepare,而不是在查询中插入搜索字符串(请参阅)。结果应该是这样的

$statement = $mysqli->prepare("SELECT * FROM table WHERE MATCH(TITLE) AGAINST(? IN BOOLEAN MODE) ORDER BY MATCH(TITLE) AGAINST(? IN BOOLEAN MODE)");
$statement->bind_param("ss", $q, $q);
$statement->execute();
$result = $statement->get_result();

首先准备语句,然后将参数绑定到问号占位符。不需要手动转义。

考虑过使用它。不幸的是,这并不能解决所有问题。例如,字符串
+-
导致查询不起作用,因为这不是某种SQL注入,而是与syntaxAh的匹配中的语法错误。如果我理解正确,我认为用双引号引用包含+,-等的短语应该起作用。美元是从哪里来的?它包含一个单词还是多个单词?$q在我的例子中是HTML表单文本字段(也称为原始用户输入)的$\u GET['q']变量,因此它只是用户输入的单词,您希望查找与任何单词或所有单词匹配的所有行吗?在任何情况下,将字符串拆分为单词,用双引号引用每个单词,并转义单词中的任何双引号都应该有效。但是在这种情况下,我失去了要求特定搜索词的能力…考虑使用它。不幸的是,这并不能解决所有问题。例如,字符串
+-
导致查询不起作用,因为这不是某种SQL注入,而是与syntaxAh的匹配中的语法错误。如果我理解正确,我认为用双引号引用包含+,-等的短语应该起作用。美元是从哪里来的?它包含一个单词还是多个单词?$q在我的例子中是HTML表单文本字段(也称为原始用户输入)的$\u GET['q']变量,因此它只是用户输入的单词,您希望查找与任何单词或所有单词匹配的所有行吗?在任何情况下,将字符串拆分为单词、用双引号引用每个单词并转义单词中的任何双引号都应该有效。但在这种情况下,我无法要求特定的搜索词…警告:使用
mysqli
时,您应该使用和向查询中添加用户数据。不要使用字符串插值或串联来完成此操作,因为您已经创建了严重的错误。永远不要把
$\u POST
$\u GET
数据直接放入查询中,如果有人试图利用你的错误,这可能是非常有害的。编写自己的搜索引擎非常非常困难。如果全文搜索不够,请尝试使用或之类的工具。如果你能编写自己的搜索引擎,你就可以为谷歌工作了。我知道,但在我的项目完成之前,这样做比较容易……我知道他们是如何工作的,只是懒散而已。。。当我的项目大约完成80%时,我会改变它们。如果这是一个典型的软件项目,那么在前80%之后,你将有另外80%的时间去做。在您在不可行的路径上过度提交之前,请立即尝试并评估方向。警告:当使用
mysqli
时,您应该使用并将用户数据添加到查询中。不要使用字符串插值或串联来完成此操作,因为您已经创建了严重的错误。永远不要把
$\u POST
$\u GET
数据直接放入查询中,如果有人试图利用你的错误,这可能是非常有害的。编写自己的搜索引擎非常非常困难。如果全文搜索不够,请尝试使用或之类的工具。如果你能编写自己的搜索引擎,你就可以为谷歌工作了。我知道,但在我的项目完成之前,这样做比较容易……我知道他们是如何工作的,只是懒散而已。。。当我的项目大约完成80%时,我会改变它们。如果这是一个典型的软件项目,那么在前80%之后,你将有另外80%的时间去做。在你在一条不可行的道路上过度投入之前,现在就尝试评估一下方向。