gpt4 book ai didi

PHP/MYSQL - bool 全文搜索 - 精确字符串运算符 ("")在准备语句与 SQL 查询中给出不同的结果集

转载 作者:行者123 更新时间:2023-11-29 08:30:51 25 4
gpt4 key购买 nike

我正在我的网站上使用 PHP 准备好的语句创建一个高级搜索页面,以使用 bool 全文搜索来查询 MySQL 数据库 MyISAM 表。

它非常类似于 Google 提供的高级搜索的第一部分,涵盖以下条件:

  • 所有这些词
  • 准确的单词或陈述(注意:这就是问题所在)
  • 这些词中的任何一个
  • 这些都不是

我检索每个输入值,清理并处理字符串集合的每个部分,然后附加适当的信息以通过准备好的语句形成 mySQL 查询。

本质上是以下搜索:

  • 全部 -
  • 准确 -
  • 任何 - 希捷东芝
  • 无 -

将输出为以下字符串:

seagate* toshiba*

查询结果将如下所示:

SELECT id, description
FROM `items`
WHERE MATCH (description)
AGAINST ('seagate* toshiba*' IN BOOLEAN MODE)

这将列出描述字段中带有“seagate”后跟任何内容和“toshiba”后跟任何内容的所有行。

这工作正常,输出如下:

-(750gb*) -(320gb*) seagate* toshiba*

这将列出上述所有行,但排除描述字段中带有“750gb”和“320gb”的任何行。

通过向“所有这些单词”字符串添加一个值,我们将得到以下输出:

+(16mb*) +(7200rpm*) -(750gb*) -(320gb*) seagate* toshiba*

这将列出如上所述的所有行,但仅显示描述字段中同时包含“16mb”和“7200rpm”的下降。

现在来说说有问题的部分。如果我要使用“Exact word of statements”字符串并添加值“serial ata 600”,我们将得到以下输出:

+(16mb*) +(7200rpm*) -(750gb*) -(320gb*) +("serial ata 600") seagate* toshiba*

使用 phpmyadmin 作为 SQL 查询运行此字符串和生成的查询,我得到了与搜索条件匹配的 2 行结果集。

但是,当在我的网站上运行此命令时,我得到 6 行结果,这表明 +("serial ata 600")"被完全忽略。

如果我仅输入字符串“Exact word of statements”的值,以便我们得到输出:

+("serial ata 600")

结果表明该字符串将列出包含“serial”或“ata”或“600”的所有行。

通过直接在 mysql 中运行相同的查询,此结果将列出完全包含单词“serial ata 600”的所有行。

MySQL definition of this operator它指出:

A phrase that is enclosed within double quote (“"”) characters matches 
only rows that contain the phrase literally, as it was typed.

MySQL 中就是这种情况,但是当使用 PHP 作为预准备语句运行相同的查询时,会返回不同的结果集。

这是准备好的语句:

if ($result = $link->prepare("
SELECT id, description
FROM `items`
WHERE MATCH (description)
AGAINST (? IN BOOLEAN MODE)
"))
{
$result->bind_param("s", $pattern);
... ETC
}

这是在此之前的 $pattern 的输出:

+("serial ata 600")

任何人都可以提出这种行为的原因吗,因为我不认为 PHP 和 MySQL 之间的工作方式有任何差异。

我可以提供与如何根据请求生成字符串相关的任何其他代码,但输出与我的示例中相同。

任何建议/意见/意见/反馈或评论将不胜感激。

最佳答案

这是一个让他们事先准备好的陈述落空的地方。在内部,准备引擎将执行相当于:

$quoted = mysql_real_escape_string('+("serial ata 600")');

这相当于

+(\"serial ata 600\")

现在您不再使用 3 个单词的引用短语,您将发送以下单独的单词:

+("serial

ata

600")

这是因为 " 引号是 SQL 元字符,您需要将它们视为元字符。但是,因为它们是元字符,所以准备引擎将引用它们,将它们简化为普通的明文- jane 引号,现在它们不再包含您的搜索短语。它们已成为搜索短语的一部分。

不知道这是否真的有效,但您可能需要重写准备好的语句以使其更像

... MATCH AGAINST (CONCAT('("', ?, '")'))

关于PHP/MYSQL - bool 全文搜索 - 精确字符串运算符 ("")在准备语句与 SQL 查询中给出不同的结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16674139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com