Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在while循环中工作的自定义PDO fetch函数_Php_Pdo - Fatal编程技术网

Php 在while循环中工作的自定义PDO fetch函数

Php 在while循环中工作的自定义PDO fetch函数,php,pdo,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()) {

如果这行得通

$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); }
这可以做到:

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

  • 它将只执行一次查询
  • 收益率是php5.5+
  • fetch()迷你函数上使用
    foreach
您最初的尝试不起作用的原因是该操作一直在无限期地循环。对原始
fetch()
的每次调用都会执行查询每次调用,从而返回第一个结果。这将使
,而
继续进行。

这样做:

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

  • 它将只执行一次查询
  • 收益率是php5.5+
  • fetch()迷你函数上使用
    foreach

您最初的尝试不起作用的原因是该操作一直在无限期地循环。对原始
fetch()
的每次调用都会执行查询每次调用,从而返回第一个结果。这将使
while
持续不断。

如果您不使用mid-foreach而不是while

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

如果你不在每小时中而不是在

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

你的解决方案非常笨拙,有错误倾向我肯定是的,这就是为什么我说我会推荐公认的答案而不是那个解决方案你的解决方案非常笨拙,有错误倾向我肯定是的,这就是为什么我说我会推荐公认的答案而不是那个解决方案发电机的好例子!我真的希望它能在函数外运行一个while循环。如果我使用foreach,那么即使这样也可以使用
函数fetch(){return DB::$DB->query('SELECT*FROM users');}
@Rick这个答案确实向您展示了如何在函数之外使用函数。标题上说的是“在while循环中”。。对不起,如果这让人困惑的话。。我还通过添加一个使用类的版本来更新这个问题。也许可以使用某种类型的类迭代器扩展/实现使其工作..哦,很好。我认为实际上最好使用while和生成器,而不是全部返回。尽管如此。但是PDO等等。它已经相当优化了。发电机的好例子!我真的希望它能在函数外运行一个while循环。如果我使用foreach,那么即使这样也可以使用
函数fetch(){return DB::$DB->query('SELECT*FROM users');}
@Rick这个答案确实向您展示了如何在函数之外使用函数。标题上说的是“在while循环中”。。对不起,如果这让人困惑的话。。我还通过添加一个使用类的版本来更新这个问题。也许可以使用某种类型的类迭代器扩展/实现使其工作..哦,很好。我认为实际上最好使用while和生成器,而不是全部返回。尽管如此。但是PDO等等。它已经非常优化了。这只是简单的优雅。这只是简单的优雅。