即使查询相同,PHP 返回的结果也比 phpmyadmin 少

Posted

技术标签:

【中文标题】即使查询相同,PHP 返回的结果也比 phpmyadmin 少【英文标题】:PHP returning less results than phpmyadmin even though the query is the same 【发布时间】:2012-12-18 02:01:30 【问题描述】:

当我在 phpmyadmin 中运行以下查询时,我得到了 18 个结果——所有这些结果都是正确的,并且是我正在寻找的。但是,当我将查询复制并粘贴到 php 文件中并运行该页面时,我得到了 17 个结果。

SELECT 
    ta.jobTaskID, 
    jt.customTaskTitle, jt.taskID, jt.status, 
    d.dealershipName, 
    j.jobNumber, j.jobID, j.title, j.jobSpec,
    wt.taskName, 
    po.dueToProduction
FROM taskassignments ta 
INNER JOIN jobTasks jt ON ta.jobTaskID = jt.jobTaskID
INNER JOIN jobs j ON jt.jobID = j.jobID
INNER JOIN dealerships d ON j.dealershipID = d.dealershipID
LEFT JOIN workflowtasks wt ON jt.taskID = wt.taskID
LEFT JOIN purchaseorders po ON j.jobID = po.jobID
WHERE ta.userID = 1 AND jt.status != 'Completed';

编辑:Here's a snapshot of my phpmyadmin result 和here's a snapshot of my var_dump。

这是我的 PHP 代码(我使用我创建的 DB 类)

$myTasks = $connection->runQuery("
SELECT 
    ta.jobTaskID, 
    jt.customTaskTitle, jt.taskID, jt.status, 
    d.dealershipName, 
    j.jobNumber, j.jobID, j.title, j.jobSpec,
    wt.taskName, 
    po.dueToProduction
FROM taskassignments ta 
INNER JOIN jobTasks jt ON ta.jobTaskID = jt.jobTaskID
INNER JOIN jobs j ON jt.jobID = j.jobID
INNER JOIN dealerships d ON j.dealershipID = d.dealershipID
LEFT JOIN workflowtasks wt ON jt.taskID = wt.taskID
LEFT JOIN purchaseorders po ON j.jobID = po.jobID
WHERE ta.userID = " . $userID . " AND jt.status != 'Completed'");

最后,这是连接类用来运行查询的代码:

// runs the user defined query
public function runQuery($runMe)

    $outArray = array();
    if ($this->checkConnection()) // if the connection is a resource
    
        $returned = mysql_query($runMe, $this->dbConnection);
        if ($returned === false) // if there was an error during sql execution
        
            echo "SQL Query error: " . mysql_error();
        

        if ($returned === true) // if a update, insert, delete, etc... command was run
            return true;
        if (is_resource($returned)) 
        
            $outArray = array(); // returned array with query results
            for ($i = 0; $i < mysql_num_rows($returned); $i++)
            
                $outArray[] = mysql_fetch_assoc($returned);
            
        
        if (count($outArray) < 1)
            return null;
        else
            return $outArray;
    
        else
            echo "Your Database Connection Was Unable To Be Authenticated.";
    

【问题讨论】:

请出示您的 PHP 代码。 显示你的 php 代码,你可能在某处丢了一行。例如做$row = fetch(); while(...) $row = fetch(); print $row; 【参考方案1】:

更好的解决方案是不使用mysql_num_rows(),而只是重复调用mysql_fetch_assoc(),直到它停止返回结果:

$outArray = array();
while ( $row = mysql_fetch_assoc($returned) ) 
    $outArray[] = $row;

(Ps. 你知道吗,你的代码使用的 original PHP mysql API 已在 PHP 5.5.0 中被弃用,并将在未来的某个版本中删除。你真的应该转移到 one of the supported APIs,或者 @ 987654323@或PDO。)

【讨论】:

让我得到与之前相同的结果...比我需要的少 1 个。 @Brds:那么您的 PHP 查询确实只返回 17 个结果。如果 SQL 文本完全相同,那么差异肯定在其他地方。您确定要使用同一用户对同一数据库中的同一表运行这两个查询吗? (我特别问的原因是缺少的行似乎是一条测试记录。也许您的 PHPMyAdmin 查询正在针对您的数据库的测试副本运行,而 PHP 代码正在直接访问生产数据库?) 似乎断开连接在 db 类中的某个位置。我最终用 mysql_query() 运行查询,它工作得很好。虽然看了课程,但我找不到任何不同的地方。 直接分配给数组 ($outArray[] = mysql_fetch_assoc...) 将在数组末尾添加一个值 false @mcrumley:感谢您指出这一点。在我建议之前我应该​​测试一下。【参考方案2】:

尝试替换这一行:

 for ($i = 0; $i < mysql_num_rows($returned); $i++)

与:

 for ($i = 0; $i < mysql_num_rows($returned) + 1; $i++)

【讨论】:

您可以使用 当我这样做时,我得到了正确数量的条目,但最后一个总是“假”。它还弄乱了使用连接类的网站的其他部分...... I.E. - 我的数据库驱动的导航项目在它们的末尾有一个额外的(假)项目。 另外,mysql_num_rows 返回项目的数量......所以假设有 10 个项目被发回......我的声明是说“$i 【参考方案3】:

您的最后一行被跳过,因为您只是检查$i 是否小于mysql_num_rows($returned)。你应该在哪里检查它是否小于或等于。

因此您需要更改以下行:

for ($i = 0; $i < mysql_num_rows($returned); $i++)

for ($i = 0; $i <= mysql_num_rows($returned); $i++)

然后您将按照您的预期将所有数据返回到您的 PHP 中。

【讨论】:

最后一个项目现在是 False...虽然返回的项目数量是正确的。 mysql_num_rows 返回项目的数量......所以假设有 10 个项目被退回......我的声明是说“$i 【参考方案4】:

尝试清除循环内使用的所有数组,方法是在循环后调用 unset 函数清除所有数组,如

while()
//your code

unset(array);

这将解决您的问题,因为它解决了我的问题。

【讨论】:

以上是关于即使查询相同,PHP 返回的结果也比 phpmyadmin 少的主要内容,如果未能解决你的问题,请参考以下文章

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

Mysql 查询在 Codeigniter 中返回空结果,但在本机 PHP 中工作正常

即使查询返回结果,Twitter-typeahead 也不显示任何结果

即使使用 DefaultIfEmpty,Linq 查询也不返回预期结果

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

jquery ajax 加载结果列表,即使没有任何查询