gpt4 book ai didi

php - 通过 PHP 执行的 REGEXP 的奇怪 MySQL 结果集

转载 作者:行者123 更新时间:2023-11-29 05:41:47 25 4
gpt4 key购买 nike

我有具有以下结构的 MySQL 表:

+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| dept | varchar(5) | NO | MUL | | |
| sudoc | varchar(255) | NO | | | |
| title | varchar(255) | NO | | | |
| type | tinyint(1) | NO | | 0 | |
| date | date | NO | MUL | | |
| comment | mediumtext | NO | | | |
+---------+--------------+------+-----+---------+----------------+

我正在开发一个基本的搜索页面,它应该在“sudoc”和“title”字段中搜索任意短语并返回匹配的记录。

目前,我的数据库中只有一条记录的标题中包含“Lava”一词。当我通过在 MySQL 命令行中键入以下 SQL 来手动执行它时,它工作正常:

PREPARE test FROM "SELECT * FROM govdocs WHERE LCASE(sudoc) REGEXP ? OR LCASE(title) REGEXP ? ORDER BY sudoc";
SET @a = "Lava";
SET @b = "Lava";
EXECUTE test USING @a, @b;

它返回一条匹配的记录。

然后我执行这个 PHP:

<?php

$DSN = "mysql:host=db.example.edu;port=3306;dbname=govdocs";
$DB = new PDO($DSN, "govdocs", "password", array(PDO::ATTR_PERSISTENT => true));

$SQL = "SELECT * FROM govdocs WHERE LCASE(sudoc) REGEXP :phrase ";
$SQL .= "OR LCASE(title) REGEXP :phrase ORDER BY sudoc";

$query = $DB->prepare($SQL);

$query->execute(array(':phrase' => "Lava",));

if($query){
$results = $query->fetchall(PDO::FETCH_ASSOC);
print "There are ".count($results)." results.";
} else {
print $DB->errorInfo();
}

print "\n";

它返回 236 个结果。 “熔岩”记录不是其中之一。

我用其他短语试过,结果一点也不一致。

  • 搜索任何单字母字符都会返回看似正常的结果
  • 搜索任意两个字符会返回 238 个结果,各占 5
  • 搜索任何三个或更多字符会返回 236 个结果

据我所知,当我在数据库服务器上手动执行时,SQL 工作正常。只有当它由 PHP 执行时,事情才会变得不稳定。

在这一点上,我不知道发生了什么。我错过了什么?

编辑:

这是一个新的测试用例,它尝试从没有绑定(bind)参数的 PHP 查询,正如 QTax 所建议的:

<?php

$DSN = "mysql:host=db.example.edu;port=3306;dbname=govdocs";
$DB = new PDO($DSN, "govdocs", "password", array(PDO::ATTR_PERSISTENT => true));

// First, do it with a static query -- no bound parameters.
$SQL = "SELECT * FROM govdocs WHERE LCASE(sudoc) REGEXP 'Lava' ";
$SQL .= "OR LCASE(title) REGEXP 'Lava' ORDER BY sudoc";

$Query = $DB->prepare($SQL);
$Query->execute();

$results = $Query->fetchall(PDO::FETCH_ASSOC);
print "There are ".count($results)." results for a query with no bound parameters.\n";

// Then do it WITH bound parameters
$SQL2 = "SELECT * FROM govdocs WHERE LCASE(sudoc) REGEXP :phrase ";
$SQL2 .= "OR LCASE(title) REGEXP :phrase ORDER BY sudoc";

$Query = $DB->prepare($SQL2);
$Query->execute(array(':phrase' => "Lava",));

$results = $Query->fetchall(PDO::FETCH_ASSOC);
print "There are ".count($results)." results for a query WITH bound parameters.";

print "\n";

我运行时的输出是:

There are 1 results for a query with no bound parameters.
There are 236 results for a query WITH bound parameters.

绑定(bind)参数有些奇怪。我刚刚用 php -v 检查了服务器的 PHP 版本,它说:

PHP 5.1.6 (cli) (built: Nov 13 2010 16:05:12)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies

5.1.6 已经快五年了。我想知道这是否是某种已在较新版本中修复的古老错误?

最佳答案

试试这个:

$sql = "SELECT * FROM govdocs WHERE sudoc REGEXP ? OR title REGEXP ? ORDER BY sudoc";
$param = "Lava";

$query = $DB->prepare($sql);
$query->execute(array($param, $param));

关于php - 通过 PHP 执行的 REGEXP 的奇怪 MySQL 结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6280947/

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