当前位置: 首页 > 面试题库 >

PDO和MySQL全文搜索

巫马望
2023-03-14
问题内容

我正在将所有站点代码从使用mysql_
*函数转换为PDO。对于我的需求,PDO上的PHP文档尚不清楚。它为您提供了要使用的功能,但没有详细介绍它们在不同情况下的功能。

基本上,我有一个mysql全文搜索:

$sql = "SELECT ... FROM search_table WHERE MATCH(some_field) AGAINST ('{$searchFor}*' IN BOOLEAN MODE)";

实际的语句要长得多,但这基本上就是它的作用。

我的问题是,如何将其纳入PDO?

我知道您不是要在位置标记周围使用引号,那么您是否将它们放在AGAINST()函数中?我包括他们吗?如果我不考虑它们,通配符等会怎样?

$sql = $this->db->prepare("SELECT ... FROM search_table WHERE MATCH(some_field) AGAINST(:searchText IN BOOLEAN MODE");
$sql->bindValue(':searchText', $searchFor . '*');

问题答案:

不幸的是,这是使用查询参数的一个奇怪的例外( 编辑: 但显然不在每个MySQL分支的最新版本中,请参见下文)。

中的模式AGAINST() 必须
是常量字符串,而不是查询参数。与SQL查询中的其他常量字符串不同,您不能在此处使用查询参数,这仅仅是因为MySQL的限制。

要将搜索模式安全地插入查询中,请使用PDO ::
quote()
函数。请注意,PDO的quote()函数已经添加了引号定界符(与mysql_real_escape_string()不同)。

$quoted_search_text = $this->db->quote('+word +word');

$sql = $this->db->prepare("SELECT ... FROM search_table 
    WHERE MATCH(some_field) AGAINST($quoted_search_text IN BOOLEAN MODE");

来自@YourCommonSense的评论:

没错,我刚刚在MySQL 5.5.31、5.1.68和5.0.96(MySQL
Sandbox是一个很棒的工具)上进行了测试,看来这些版本确实接受aAGAINST()子句中的查询参数动态SQL查询。

我仍然回想起过去存在的冲突。也许已在每个分支机构的最新发行版中对其进行了更正。例如,我发现这些相关的错误:

  • 在AGAINST()子句中使用存储过程参数总是返回相同的结果:http : //bugs.mysql.com/bug.php?id=3734
  • 使用准备好的语句,MATCH和FULLTEXT导致崩溃或奇怪的结果:http ://bugs.mysql.com/bug.php?id= 14496


 类似资料:
  • 问题内容: 我想在我的网页中进行全文搜索。我需要分页进行搜索。我的数据库每张表有50,000+行。我已经改变了我的表,并使其成为索引。该表始终处于更新状态,仍然有一个自动增加的列。而最新的总是在表格的末尾。 但整个查询时间将花费。我通过Google搜索了许多文章,有的文章写道,只有限制字段字长才能帮助更快地进行搜索。但作为一种类型,它会像这样改变一定的长度(我尝试过标题TEXT(500) CHAR

  • 问题内容: 这是我测试过的。 这是create语句。 等号和“赞”效果很好。所以为什么? 问题答案: 全文搜索需要多种多样的方式来消除重复的“噪音”。用最少的数据进行测试将产生较差的结果。将您的整个收藏集投入其中,以获取有意义的内容。如以下某些链接所示,甚至可以尝试搜索最小字数的设置。 停用词 有各种语言的停用词 MySql 列表,这些词表示在搜索过程中忽略的无关紧要的词。该列表已编译到服务器中,

  • 问题内容: MySQL全文搜索似乎是一种很棒的方法,也是使用SQL进行搜索的最佳方法。但是,我似乎停留在以下事实:它不会搜索部分单词。例如,如果我有一篇标题为“ MySQL Tutorial”的文章并搜索“ MySQL”,它将找不到它。 完成一些搜索后,我发现MySQL 4中提供了各种支持该功能的参考(我使用的是5.1.40)。我曾尝试使用“ MySQL ”和“%MySQL%”,但均无效(我发现一

  • 回顾 在前面的章节(分页),我们已经加强了数据库查询,因此能够在页面上获取各种查询。 今天,我们会继续探讨数据库的话题,只是领域不同。所有存储内容的应用程序必须提供搜索能力。 许多其它类型的网站可能使用了谷歌、必应等索引所有的内容并且提供查询结果。这个对于大多数静态页面的网站,像论坛,是很好用。我们应用程序 microblog 的基本单元是用户短小的 blog,不是整个页面。我们希望搜索结果是动态

  • 带有Mongoose的MongoDB(3.2.0) 收藏: 用户 null 查询: =>找到 =>找到(搜索大小写敏感为false) =>找到(使用diacriticSensitive搜索为false) =>找到(部分搜索) =>未找到(部分搜索) =>未找到(部分搜索) 你知道为什么我用查询“Leo”或“L”得到0个结果吗? null

  • 问题内容: 经过多次尝试和多次搜索,我遇到了以下查询: 我使用此查询在包含音乐课程的大量页面中进行搜索。它相当不错。页面根据与查询的匹配程度获得得分。 除非用户搜索“ C Chord”或“ Am Chord”之类的内容,否则第一部分将被忽略。如果我搜索“ A和弦”或“ E和弦”,则称为“ C和弦”的页面始终位于顶部。 所以..我的问题的第1部分是:我该如何解决? 然后是第2部分。是否有可能使“标题