2014-05-17 298 views
1

我的思想完全被这个所打动。完全相同的查询在使用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 
+0

你运行SQL上都有相同的版本和变异? – BonzaiThePenguin

+0

Web应用程序和phpmyadmin都与数据库(MySQL 5.5.37)位于同一台服务器上,并连接到本地主机。两者都使用php-fpm。为了让它变得更加令人难以置信,两者都使用mysqli –

+0

我正在给出一个镜头,但是也许带有时间戳的'WHERE'过滤器在PHPMyadmin和mysqli中工作方式不同。我的意思是,PHPMyAdmin可以以某种方式操纵并显示正确的结果,mysqli没有这个功能。 –

回答

0

从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

+0

不幸的是,正如我的问题所述,我已经循环并手动计算返回的结果,以检查它是否与num_rows有关。 –

+0

您是否检查过数据库用户的选择权限? –

+0

是的。在PHP和phpmyadmin中都使用相同的用户。同一个用户也在网站的其他地方成功使用,实际上,在同一个文件中。 –

0

我设法“修复”这一点,但没有诊断的问题!

重新启动mysql服务器(服务mysql重新启动)没有工作,但重新启动服务器(重新启动)没有。

我很遗憾,这对引起问题的原因没有帮助。如果有人有任何想法,随时开导!

谢谢您的回答,

克里斯

+1

它最终可能安装了所有需要重新启动的软件更新。 :P – BonzaiThePenguin

+0

我希望解决方案很简单!当我从Apache 2.2切换到2.4,mod_php切换到php-fpm和Ubuntu 12.10到14.04时,服务器仅在几天前进行全新安装。随着所有这些变化,我认为新鲜可能更聪明:) –

0

的PM;ü原因是,你指向不同的数据库。

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

确保如果您正在从从设备读取并在主设备上写入,则同步过程正常工作。

同时检查配置文件等

要查看查询执行显示器用mysqladmin活动在你的数据库服务器。

希望得到这个帮助。

干杯, 耶稣

相关问题