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等等。它已经非常优化了。这只是简单的优雅。这只是简单的优雅。