php do while将无法使用next-> rowset

时间:2014-05-07 15:47:56

标签: php mysql pdo

嗨,我的计算机上有我的wamp服务器 PHP 5.4.12 Apache 2.4.4 MYSQL 5.6.12

我的服务器 PHP 5.5.3 Apache 2.4.6 MYSQL 5.5.37

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

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;
    }

}

3 个答案:

答案 0 :(得分:5)

我遇到了与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();
}

答案 1 :(得分:1)

问题是你正在使用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);

答案 2 :(得分:0)

while($rowset = $reponse->fetchAll(PDO::FETCH_ASSOC))
{
    $public[] = $rowset;
    $reponse->nextRowset();
}

这应该有效。有点变化。我们检查是否有行集然后转到下一行。然后,如果是,我们再一次这样做。现在试试吧。