为什么mysqli fetch在函数中创建了一个无限循环


why does mysqli fetch create an infinite loop when in function?

为什么这个函数返回一个无限循环?我试图创建一个函数,你只需要给它一个查询,while循环就可以处理剩下的。但由于某种原因,只有当我让函数返回$q->fetch_assoc()时,它才会进入一个无限循环。如果我只返回$q,然后在while循环中调用$q->fetch_assoc(),那么它不会导致无限循环。

public function fetch($query){
    $con = $this->con;
    $q = $con->query($query);
    return $q->fetch_assoc();
}
while($r = $sqli->fetch("SELECT id FROM users LIMIT 5")){
    echo $r['id']."<br />";
}

也尝试过

public function fetch($query){
    $con = $this->con;
    $q = $con->query($query);
    return $q->fetch_assoc();
}
$x = $sqli->fetch("SELECT id FROM users LIMIT 5");
while($r = $x){
    echo $r['id']."<br />";
}

我想也许它每次都在重新创建一个新的获取函数。这也不起作用,导致了无限循环。

每次调用函数时,都会重新运行查询,从而将数据集重置为第一条记录。

例如,您有5条记录被退回:

function get() {
    .... run query
    return 1st record
}

您将NEVER获取记录2,3,4,5,因为您一直将查询重置到开头。

您的函数应该返回结果HANDLE:

function do_query($sql) {
    $result = $con->query($sql);
    return $result;
}
while($row = $result->fetchRow()) {
   ...
}

fetch函数有问题,当调用此函数时,重置查询(重新初始化查询)并只提取第一行而不提取下一行。如果有两种方法,第一种方法是使用query函数,然后在while循环中使用fetch函数。

public function query($sql){
    $con = $this->con;
    return $con->query($sql); // as result

}
public function fetch($result){
    return $result->fetch_assoc();
}
$query_r=this->query("SELECT id FROM users LIMIT 5"); // as result
while($r = $this->fetch($query_r)){
    echo $r['id']."<br />";
}

第二种方法更聪明,使用key/value查询缓存保存查询(避免重置/重新命名查询),这样就更接近prototype

public $query_cache=array();
private function query($sql){
    $con = $this->con;
    return $con->query($sql); // as result

}
public function fetch($sql){
    $cache_item=@$this->query_cache[$sql];
    if(!$cache_item) { $cache_item=$this->query($sql);$this->query_cache[$sql]=$cache_item; }
    $row=$cache_item->fetch_assoc();
    if(!$row) unset($this->query_cache[$sql]);
    return $row;
}
while($r = $this->fetch("SELECT id FROM users LIMIT 5")){
    echo $r['id']."<br />";
}