【问题标题】:PHP MySQL Different results between query on web server and phpmyadminPHP MySQL Web 服务器和 phpmyadmin 上的查询结果不同
【发布时间】:2012-09-25 04:05:41
【问题描述】:

我有一个如下所示的字段:

智力:0/75

我有一个表单,用户可以搜索此字符串的值。在我的实时网络服务器上,这是查询:

SELECT * FROM `test` WHERE `id` IS NOT NULL AND `file` REGEXP CONCAT('Intelligence(: | : )([', :var2, '-9]|[0-9]{2,3})[ ]{0,1}/[ ]{0,1}([', :var2, '-9]|[0-9]{1,3})')
$var2 = $_POST['int'];
$stmt->bindValue(':var2', $var2);

:var2 是 $_POST 值。我一直在使用4 的情况。这是插入 4 时的文字正则表达式:

Intelligence(: | : )([4-9]|[0-9]{2,3})[ ]{0,1}/[ ]{0,1}([4-9]|[0-9]{1,3})

由于我的数据库中的字段是Intelligence: 0/75,因此该查询不应产生任何结果。但它确实在我的实时网络服务器上。它返回字段Intelligence: 0/75

如果我在 phpmyadmin 中运行这个 EXACT 查询,我不会得到任何结果。我已经在我的文本编辑器中排列了来自 phpmyadmin 和我的服务器的查询,它们是相同的。就这样我没疯,这是从 phpmyadmin 复制/粘贴的查询:

SELECT *
FROM `test`
WHERE `id` IS NOT NULL
AND `file`
REGEXP CONCAT( 'Intelligence(: | : )([4-9]|[0-9]{2,3})[ ]{0,1}/[ ]{0,1}([4-9]|[0-9]{1,3})' )

谁能明白为什么这会产生两个差异。结果?

更新:

我认为我已将其范围缩小到 PHP。如果我将绑定到:var2 的值更改为喜欢

$stmt->bindValue(':var2', '6284');

结果是一样的。返回所有带有Intelligence: 0/75 的行。

如果我删除bindValue代码,那么:var2没有绑定任何东西,结果还是一样!

print_r($stmt) =

SELECT * FROM `test` WHERE `id` IS NOT NULL AND `file` REGEXP
                    CONCAT('(INT:[  ]{1,2}([', :var2, '-9]|[0-9]{2,3})[  ]{1,2}/[  ]{1,2}([', :var2, '-9]|[0-9]{1,3})|Intelligence(: | : )([', :var2, '-9]|[0-9]{2,3})[ ]{0,1}/[ ]{0,1}([', :var2, '-9]|[0-9]{1,3}))')

【问题讨论】:

  • 也许你应该在 php 中而不是在 mySQL 中对其进行正则表达式。
  • @MarkGarcia 我做了,这是我原帖中的最后一个例子。
  • $stmt->bindValue(':var2', $var2); 你给我们的查询中的 var2 在哪里?
  • @MateiMihai 对不起,错字。更新帖子。
  • 看不出有什么问题,PDO 或 mySQL 搞砸了。它可能是别的东西 - 你能发布更多代码,只是为了检查其他一切是否正常 - 例如例如,您正在查看正确的结果集或执行正确的查询 - 以防万一您在专注于正则表达式时错过了它?

标签: php mysql phpmyadmin


【解决方案1】:

北欧,

当您说“在我的实时网络服务器上”时,您是指在您的由 PHP 或 SQL 命令行实用程序呈现的网页上吗?

sql 恶魔记录查询。您将能够比较执行的确切查询! log query (MySQL doc)

您的文件列中似乎有更多的数据单元。一般来说,尽量在每一列中包含一个数据单元,并尽可能尊重范式 (Database_normalization)。您将获得更快、更简单的查询,而无需正则表达式。但是,在您的情况下,这可能是不可能的。

【讨论】:

  • 我尝试在 mySQL 中记录查询以查看 PDO 是否破坏了它,但事实并非如此。所以我做了一个SELECT CONCAT... 来检查mysql 没有弄乱concat,但事实并非如此。你有什么不同吗?
  • 所以您正在记录查询。你执行第一种方法。然后你在 5 分钟后执行第二个。您可以清楚地看到在您放入 demo 参数的日志文件中执行的两个查询。而且它们完全一样?
  • 我确实使用了 OP 提供的代码 - 通过 PDO,然后通过 phpMyAdmin,它们是相同的。只是想知道您是否看到了不同的东西?
  • 我不是。到目前为止,显然很少有人没有。 MySQL 引擎执行的 SQL 查询和您在 phpMyAdmin 中看到的查询可能不同。 phpMyAdmin尽了最大的努力,但最终还是一个界面。如果您告诉 MySQL 恶魔记录您的查询,您将获得 MySQL 执行的确切查询。中间没有接口。
  • (我写这封信是为了和你再次确认执行查询的是同一个 MySQL 引擎,没有缓存、修改或介于两者之间的任何内容。:))
【解决方案2】:

我认为,查询是不同的。

$stmt 上执行print_r()var_dump() 以获得通过php 执行的确切查询,以确保正则表达式部分按原样进行,并且不会被任何其他操作(如bind)在中间进行调整.

【讨论】:

    猜你喜欢
    • 2020-02-15
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 2017-07-07
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    相关资源
    最近更新 更多