相同的查询,相同的数据库,不同的结果

Posted

技术标签:

【中文标题】相同的查询,相同的数据库,不同的结果【英文标题】:Same Query, Same Database, Different Results 【发布时间】:2014-07-06 01:19:11 【问题描述】:

我的想法完全被这个震撼了。当使用 mysqli_query() 运行时,完全相同的查询返回零个结果,但通过 phpmyadmin 得到预期的两个结果。我进行了双重和三重检查,我正在运行相同的查询。

PHP:

$sql = "SELECT assignment_id, next_deadline FROM " . TBL_ASSIGNMENTS . " WHERE ( next_deadline >= $after_from AND next_deadline < $after_to ) OR ( next_deadline >= $before_from AND next_deadline < $before_to ) AND stage = 1";
$result = $db->query($sql);
if ( !$result )

    trigger_error($db->error(), E_USER_ERROR);


die('Count: '.$db->numRows($result).'<br /><br />'.$sql);

$db 对象是我长期使用的 mysqli 函数的简单包装,所以问题不存在。包装器正在其他地方处理类似的查询。

输出:

Count: 0

SELECT assignment_id, next_deadline FROM assignments WHERE ( next_deadline >= 1400306400 AND next_deadline < 1400310000 ) OR ( next_deadline >= 1400436000 AND next_deadline < 1400439600 ) AND stage = 1

然后我在 phpmyadmin 中运行相同的 SQL 查询 (Ced + Ped),并获得预期的 2 个结果。

注意,我也循环了结果并手动计数,没有使用 mysqli_num_rows,结果相同。

任何想法可能导致这种情况?我真的是大吃一惊,毕竟 phpmyadmin 也是通过 PHP 运行它们的……

PS,如果你怀疑包装器,这里是相关的功能:

function __construct() 
$this->link = mysqli_connect($this->dbhost, $this->dbuser, $this->dbpass, $this->dbname);
mysqli_set_charset($this->link, 'utf8');
$this->config = $this->createConfig();
// tell the server to run the close function on script shutdown
register_shutdown_function(array(&$this, 'close'));

function query($query)
$this->lastQuery = $query;
$this->querycount++;
$timestart = microtime(true);
$result = mysqli_query($this->link, $query);
$querytime = microtime(true) - $timestart;
$this->querytotal = $this->querytotal + $querytime;
$this->queryarray[$this->querycount] = array('query' => $query, 'time' => $querytime);
return $result;

function numRows($result)
return mysqli_num_rows($result);

非常感谢您提供的任何帮助..

克里斯

编辑: 现在也尝试了同一个sql查询的变种都无济于事,包括加括号:

SELECT assignment_id, next_deadline FROM assignments WHERE ( ( next_deadline >= 1400306400 AND next_deadline < 1400310000 ) OR ( next_deadline >= 1400436000 AND next_deadline < 1400439600 ) ) AND stage = 1 

我还尝试从末尾删除 stage = 1 以隔离问题,并自行运行每个括号,但没有运气。例如

SELECT assignment_id, next_deadline FROM assignments WHERE next_deadline >= 1400306400 AND next_deadline < 1400310000

【问题讨论】:

您是否在两者上运行相同版本和变体的 SQL? web 应用程序和 phpmyadmin 都与数据库(MySQL 5.5.37)在同一台服务器上,连接到 localhost。两者都使用 php-fpm。更令人难以置信的是,两者都在使用 mysqli 我试一试,但可能带有时间戳WHERE 过滤器在 PHPMyadmin 和 mysqli 中的工作方式不同。我的意思是,PHPMyAdmin 可以以某种方式进行操作并显示正确的结果,而 mysqli 没有该功能。 phpmyadmin 也在使用 mysqli,根据 phpmyadmin 的首页。我也确实认为 phpmyadmin 可能以某种方式“纠正”了 sql 查询,但是使用肯定不会是错误语法的变体会产生相同的结果(请参阅我问题底部的编辑)。 我知道它们是同一个数据库,但我在问他们是否使用相同版本的 SQL(也就是用于解析语句并实际检索值的系统)。可能两者之一使用的是旧版本的 mysqli。 【参考方案1】:

来自 PHP 文档 (http://www.php.net/manual/en/mysqli-result.num-rows.php):

如果你在这个 num_rows 工作时遇到问题,你必须先声明 ->store_result()。

$mysqli = new mysqli("localhost","root", "", "tables");

$query = $mysqli->prepare("SELECT * FROM table1");
$query->execute();
$query->store_result();

在您的情况下,请考虑在以下位置定义的程序样式:http://www.php.net/manual/en/mysqli.store-result.php

【讨论】:

不幸的是,正如我的问题中提到的,我已经手动循环并计算返回的结果以检查它是否与 num_rows 有问题。 您是否检查了数据库用户的选择权限? 是的。在 PHP 和 phpmyadmin 中使用相同的用户。同一个用户也在网站的其他地方成功使用,事实上,在同一个文件中。【参考方案2】:

我已经设法“解决”了这个问题,但没有诊断出问题!

重启mysql服务器(service mysql restart)没用,但是重启服务器(reboot)可以。

我很遗憾这对导致问题的原因没有帮助。如果有人有什么想法,欢迎不吝赐教!

感谢您的回答,

克里斯

【讨论】:

它可能最终安装了所有需要重新启动的软件更新。 :P 我希望解决方案就这么简单!就在几天前,服务器是全新安装的,因为我从 Apache 2.2 切换到 2.4,mod_php 切换到 php-fpm,Ubuntu 12.10 切换到 14.04。有了所有这些变化,我认为新鲜可能更明智:)【参考方案3】:

PM;U 这样做的原因是您指向不同的数据库。

SQL 应该始终具有相同的行为。

确保如果您正在从从站读取并在主站写入同步过程正常工作。

还要检查配置文件等。

要查看执行查询的位置,请使用数据库服务器中的 mysqladmin 监控活动。

希望对您有所帮助。

干杯, 耶稣

【讨论】:

以上是关于相同的查询,相同的数据库,不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

PHP 和 MySQL 使用相同的查询显示不同的结果

PHP MySQL 相同的查询返回不同的行数

SQL查找某一字段相同,某一字段不同的数据

Google Location API vs. Maps:为啥相同的查询会产生不同的结果?

尝试查找不同数据时返回相同的结果

如何使用相同的语句和结果集运行多个选择查询? [复制]