我已经使用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
?>
我似乎无法弄清楚为什么我不能在同一个类中使用两次结果集。有什么想法吗?
答案 0 :(得分:2)
据我所知,$results
是一个资源,因此X行数,fetch_assoc($ results)将从资源返回一行,或者当没有更多行时返回NULL。
因此,在某些时候,$row
将评估为false(因为没有更多行要返回),这将结束while循环。
并且传递给此函数的资源结果可以被认为是通过引用传递的,因为资源只是指向内存位置的指针。
因此,在将指针重置回起始位置之前,不能在同一脚本中循环两次资源结果。
答案 1 :(得分:1)
从数据库查询中读取结果涉及迭代某些通过结果行的游标。根据您的数据库类,您可能能够重置此游标以在需要时多次循环结果。如果没有,那么您将不得不再次执行查询。