【问题标题】:why does mysqli fetch create an infinite loop when in function?为什么mysqli fetch在函数中会创建一个无限循环?
【发布时间】:2014-11-19 02:01:57
【问题描述】:

为什么这个函数会返回一个无限循环?我正在尝试创建一个函数,您只需向它提供查询,而 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 />";
}

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

【问题讨论】:

  • return $q-&gt;fetch_assoc(); 只返回 1 行,不受LIMIT 5 的影响,所以你的函数fetch() 总是返回true,所以while($r = $sqli-&gt;fetch(...))while($r = $x) 会无限运行。
  • 应该如何解决?我需要能够为函数提供查询,并且只需要遍历它。

标签: php function mysqli


【解决方案1】:

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

例如您有 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()) {
   ...
}

【讨论】:

  • 但是当函数设置为while循环外的变量时它不应该工作吗?
  • 是的,但是第二个 sn-p 中的循环也是错误的。您只需将 $x 分配给 $r,只要 $x 有值,它就会继续。
  • 怎么样? fetch_assoc() 被分配给变量,因此只运行一次。哪里错了?
  • 您的第二个函数执行$x = get_first_record(),然后一直在 $x 上循环,这始终是正确的。除了fetchAll(),fetch() 类型的函数只从结果集中返回 ONE 记录。
  • 谢谢。我不知道 fetch 只返回了一条记录。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 2018-02-22
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多