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

时间:2014-09-24 14:16:35

标签: php function mysqli

为什么这个函数会返回一个无限循环?我试图创建一个函数,你只需要给它查询,而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 />";
}

我想也许每次都在重新创建一个新的获取功能。这也没有用,导致无限循环。

2 个答案:

答案 0 :(得分:2)

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

e.g。您有5条返回的记录:

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

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

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

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

while($row = $result->fetchRow()) {
   ...
}

答案 1 :(得分:1)

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

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