无法通过两种不同的方法循环结果集

时间:2017-09-25 09:58:33

标签: php

我已经使用while循环来迭代结果集。

我执行一个查询,并传入一个类,将其存储为私有变量。

然后我使用两个单独的方法在结果集上执行while循环。

第一种方法有效,第二种方法没有。

以下是一些显示示例的代码。

<?php

class DataFlow {

    private $resultSet;

    function __construct($results) {
        $this->resultSet = $results;
    }

    function method1() {
        while ($rows = CDB::GetAssoc($this->resultSet)) {
            // works here
            echo $rows;
        }
    }

    function method2() {
        while ($rows = CDB::GetAssoc($this->resultSet)) {
            // doesn't work here 
            echo $rows;
        }
    }

}

$sqlQuery = "....";
$results = CDB::ExecuteQuery($sql);
$dataFlow = new DataFlow($results);

echo $dataflow->method1(); // Works
echo $dataflow->method2(); // Doesn't work.
?>

现在,如果我编辑它以在本地包含查询执行...它可以正常工作

<?php

class DataFlow {

    private $resultSet;

    function __construct($results) {
        $this->resultSet = $results;
    }

    function method1() {
        while ($rows = CDB::GetAssoc($this->resultSet)) {
            // works here
            echo $rows;
        }
    }

    function method2() {
        $sqlQuery = "....";
        $results = CDB::ExecuteQuery($sql);

        while ($rows = CDB::GetAssoc($results)) {
            // now works here 
            echo $rows;
        }
    }

}

$sqlQuery = "....";
$results = CDB::ExecuteQuery($sql);
$dataFlow = new DataFlow($results);

echo $dataflow->method1(); // Works
echo $dataflow->method2(); // Works
?>

我似乎无法弄清楚为什么我不能在同一个类中使用两次结果集。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

据我所知,$results是一个资源,因此X行数,fetch_assoc($ results)将从资源返回一行,或者当没有更多行时返回NULL。

因此,在某些时候,$row将评估为false(因为没有更多行要返回),这将结束while循环。

并且传递给此函数的资源结果可以被认为是通过引用传递的,因为资源只是指向内存位置的指针。

因此,在将指针重置回起始位置之前,不能在同一脚本中循环两次资源结果。

答案 1 :(得分:1)

从数据库查询中读取结果涉及迭代某些通过结果行的游标。根据您的数据库类,您可能能够重置此游标以在需要时多次循环结果。如果没有,那么您将不得不再次执行查询。