【问题标题】:php do while won't work with next->rowsetphp do while 不适用于 next->rowset
【发布时间】:2014-05-07 15:47:55
【问题描述】:

嗨,我的电脑上有我的 wamp 服务器 PHP 5.4.12 阿帕奇 2.4.4 MYSQL 5.6.12

还有我的服务器 PHP 5.5.3 阿帕奇 2.4.6 MYSQL 5.5.37

当我在我的服务器上执行此功能时出现此错误:SQLSTATE[HY000]: 一般错误但在我的本地主机中我没有任何错误

function getinformationpublic($nocate)
{
    try
    {
        $public = array();
        global $Cnn;
        $reponse = $Cnn->prepare("CALL GetInfoPublicCible(:nocategorie)");
        $reponse->bindParam('nocategorie',$nocate,PDO::PARAM_INT);
        $reponse->execute();
        do {
            $rowset = $reponse->fetchAll(PDO::FETCH_ASSOC);
            $public[] = $rowset; 

        } while ($reponse->nextRowset());

        $reponse->closeCursor();
        return $public;
    }
    catch (PDOException $erreur)
    {
        $msg[]=$erreur->getMessage();
        $_SESSION["message"]["d"]=$msg;
    }

}

但是当我在我的服务器上执行此操作时,我没有错误

function getinformationpublic($nocate)
{
    try
    {
        $public = array();
        global $Cnn;
        $reponse = $Cnn->prepare("CALL GetInfoPublicCible(:nocategorie)");
        $reponse->bindParam('nocategorie',$nocate,PDO::PARAM_INT);
        $reponse->execute();
            $rowset = $reponse->fetchAll(PDO::FETCH_ASSOC);
            $public[] = $rowset; 
                        $reponse->nextRowset();
                        $rowset = $reponse->fetchAll(PDO::FETCH_ASSOC);
            $public[] = $rowset; 
                        $reponse->nextRowset();
                        $rowset = $reponse->fetchAll(PDO::FETCH_ASSOC);
            $public[] = $rowset; 
                $reponse->nextRowset();
                         $rowset = $reponse->fetchAll(PDO::FETCH_ASSOC);
            $public[] = $rowset; 
        $reponse->closeCursor();
        return $public;
    }
    catch (PDOException $erreur)
    {
        $msg[]=$erreur->getMessage();
        $_SESSION["message"]["d"]=$msg;
    }

}

【问题讨论】:

  • 在你的 } while (....) 之前添加 echo $i++; 你会看到它到底是什么时候失败的。
  • 它在最后一个失败。当我在我的页面上 echo $i++ 时,我有 123

标签: php mysql pdo


【解决方案1】:

我对 PDO::nextRowset() 有同样的问题,因为即使没有更多可用的行集它也会返回 true,因此在调用 fetchAll() 时,它会引发异常 HY000。 (在 PHP 5.5.12 windows、Mysql 5.5.17 linux 上测试)

解决此问题的方法是在获取行集之前使用方法 PDO::columnCount() 检查列数。如果它不为零,则您有一个有效的行集,因此您可以调用 PDO::fetchAll()。

即使 PDO::nextRowset() 报告为 true,columnCount() 也会在移动到下一个行集之前报告列数。

例子:

while ($objQuery->columnCount()) {
    $tab[] = $objQuery->fetchAll(\PDO::FETCH_ASSOC);
    $objQuery->nextRowset();
}

【讨论】:

  • as it returns true even there is no more rowsets available 这不是真的。阅读here。问题是他正在使用do...while。 do部分将在验证while是否为真之前执行,因此在最后一次迭代中,即使while为假,do部分也会被执行。
【解决方案2】:

问题是您使用的是 do...while 表单,它将在验证 while 条件之前执行 do 部分中的代码。这意味着在最后一次迭代中,即使 nextRowset() 刚刚返回 false,do 部分也会最后一次执行。

只需删除 do 部分,然后将所有内容放在一段时间内。即使没有行集,nextRowset 也不会返回 true。阅读do...whilenextRowset()

$public[] = $reponse->fetchAll(PDO::FETCH_ASSOC);
// so that the first rowset gets into your array
while ($reponse->nextRowset()) {
    $public[] = $reponse->fetchAll(PDO::FETCH_ASSOC);
}

您的 bindParam 还需要一个双点,就像它绑定到的参数一样

$reponse->bindParam(':nocategorie',$nocate,PDO::PARAM_INT);

【讨论】:

    【解决方案3】:
    while($rowset = $reponse->fetchAll(PDO::FETCH_ASSOC))
    {
        $public[] = $rowset;
        $reponse->nextRowset();
    }
    

    这应该可行。一点变化。我们检查是否有行集,然后转到下一个。然后,如果是这样,我们会再次这样做。立即尝试。

    【讨论】:

    • 这仅在您的查询没有答案时解决了问题。现在我们将修复最后一次失败的检查。
    • 当我所有的 fetchall 返回值时它工作。我在 php.net 上看到: PDO::nextRowset() 目前似乎不受 Firebird PDO 驱动程序的支持。不幸的。也许是那个?
    • 好吧,我知道我的存储过程返回 4 个数组,我会这样做 for($i =0; $i<4; $i++){ $rowset = $reponse>fetchall(PDO::FETCH_ASSOC); $public[] = $rowset; $reponse->nextRoeset(); }
    • 可能是这样,但如果它返回所有数据 - 只是在最后它会产生一些问题(但仍然 - 检索所有数据)然后你我的 try {} catch () {} 它......只需放一些 HUGE可见//TODO: comment,因此您将来会记住这一点。它可能是火鸟——我知道它只适用于 mysql(测试了这两个代码,这就是为什么我发布了一个对我有用的代码)。
    猜你喜欢
    • 1970-01-01
    • 2011-07-19
    • 2012-04-15
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多