queryFactoryResult类遍历问题




Zencart的queryFactoryResult类是queryFactory类查询完sql语句后返回的结果类,但是这个结果类有点不足。

问题

$r = $db->Execute($sql,false,true,3600);
//第一次遍历
while (!$r->EOF){
echo $r->fields['categorie_id'];
$r->MoveNext();
}
//循环输出1,2,3,4,5,6

//第二次遍历
$r->Move(0);
while (!$r->EOF){
echo $r->fields['categorie_id'];
$r->MoveNext();
}
//循环输出6,6,6,6,6,6
//这里我们本来希望输出的跟第一次一样的

原因

//这个方法是queryFactoryResult类中的
function MoveNext($test=false) {
    global $zc_cache;
    $this->cursor++;
    if ($this->is_cached) {
      if ($this->cursor >= sizeof($this->result)) {
        $this->EOF = true;
      } else {
//由于我们使用了缓存机制,result变量保存的是数组,第一次遍历时已经将指针移动了数组末尾,所以这里无法更新fields变量的值,始终是第一次遍历后最一条数据的值了
        while(list($key, $value) = each($this->result[$this->cursor])) {
          $this->fields[$key] = $value;
        }
      }
    } else {
      $zp_result_array = @mysql_fetch_array($this->resource);
      if (!$zp_result_array) {
        $this->EOF = true;
      } else {
        while (list($key, $value) = each($zp_result_array)) {
          if (!preg_match('/^[0-9]/', $key)) {
            $this->fields[$key] = $value;
          }
        }
      }
    }
  }

解决方法

  function MoveNext() {
    global $zc_cache;
    $this->cursor++;
    if ($this->is_cached) {
      if ($this->cursor >= sizeof($this->result)) {
        $this->EOF = true;
      } else {
reset($this->result[$this->cursor]);//这行是另外添加解决方案,将数组指针移回开头
        while(list($key, $value) = each($this->result[$this->cursor])) {
          $this->fields[$key] = $value;
        }
      }
    } else {
      $zp_result_array = @mysql_fetch_array($this->resource);
      if (!$zp_result_array) {
        $this->EOF = true;
      } else {
        while (list($key, $value) = each($zp_result_array)) {
          if (!preg_match('/^[0-9]/', $key)) {
            $this->fields[$key] = $value;
          }
        }
      }
    }
  }
谢 懿茂
关于

IT浪潮瞬息万变,争做一名弄潮的程序员! QQ:2646739154

标签: ,

发表评论