在while循环

时间:2018-03-06 17:56:06

标签: php pdo

如果这样做..

$stmt = DB::$db->query('SELECT * FROM users');
while ($r = $stmt->fetch()) { print_r($r); }

有没有办法让这样的东西起作用?

function fetch() {
    $stmt = DB::$db->query('SELECT * FROM users');
    return $stmt->fetch();
}
while ($r = fetch()) { print_r($r); }

更新

或者,如果它在一个类中,它可以通过使用某种类迭代器扩展/实现来工作?

class User {
    public static function fetch() {
        $stmt = DB::$db->query('SELECT * FROM users');
        return $stmt->fetch();
    }
}
while ($r = User::fetch()) { print_r($r); }

好吧,我最终找到了一个可行的解决方案,但使用生成器的接受答案可能是更好的方法。

class User {
    private static $stmt;
    public static function fetch() {
        if (static::$stmt === null) {
            static::$stmt = DB::$db->query('SELECT * FROM users');
        }
        return static::$stmt->fetch();
    }
}
while ($r = User::fetch()) { print_r($r); }

2 个答案:

答案 0 :(得分:4)

这样就可以了:

function fetch() {
    $stmt = DB::$db->query('SELECT * FROM users');
    while($row = $stmt->fetch()) { yield $row; }
}
foreach (fetch() as $r) { print_r($r); }

注意:

  • 它只会执行一次查询。
  • yield是php 5.5 +。
  • foreach迷你功能上使用fetch()

您的初始尝试不起作用的原因是该操作只是无限循环。每次调用原始fetch()进行查询 每次调用 ,从而返回第一个结果。这将使while继续下去。

答案 1 :(得分:2)

如果你不是在foreach中间而不是在

之前
function fetch() {
    return DB::$db->query('SELECT * FROM users');
}
foreach (fetch() as $r) { print_r($r); }