Код (Text): class Db { public $dbh; function __construct() { $this->dbh = new \PDO('mysql:host=127.0.0.1;dbname=test', 'root', ''); // создаем соединение с БД } public function generator ($sql) { for ($id = 1; $feth !== false; $id++) { $sth = $this->dbh->prepare($sql . $id); $sth->execute(); $feth = $sth->fetch(); yield $feth; // генерируем запросы к БД } } } $db = new Db(); $test = $db->generator('SELECT * FROM news WHERE id='); foreach ($test as $item) { var_dump($item); } код работает но после его написания я понял что если будет пропуск в id он бессмысленный например есть id 1 id 2 id 4 когда функция дойдет до id 3 уведет что его нету и прекратит работу так вот как мене с помощью генератор и fetch() вывести все новости которые есть в БД ??
Извиняюсь конечно, что спрашиваю такое, но по каким религиозным соображениям нельзя просто сделать select * from news?
Код (Text): class Db { public $dbh; function __construct() { $this->dbh = new \PDO('mysql:host=127.0.0.1;dbname=test', 'root', ''); // создаем соединение с БД } public function generator ($sql) { $sth = $this->dbh->prepare($sql); $sth->execute(); $feth = $sth->fetch(); yield $feth; // генерируем запросы к БД } } $db = new Db(); $test = $db->generator('SELECT * FROM news'); foreach ($test as $item) { var_dump($item); } так ? он мне вернул 1 строку а мне надо все что есть в базе смысл всего этого в том что используя fetch() и генератор нагрузка на память будет меньше чем используя fetchAll() только сделать это у меня мозгов не хватает
Ну, с религией понятно: хранители тайных знаний прироста скорости от одинарной кавычки. Дык вот, вы собираетесь плюнуть в пользователя разом несколько тысяч новостей? Потому что если речь идет о 20-30 новостях на страницу, то профита не будет никакого. Вообще. Теперь по теме: у вас выводится одна строка, потому что вы одну строку и отдаете. Отдавать данные нужно тоже в цикле, построчно, примерно вот так: PHP: public function generator ($sql) { $sth = $this->dbh->prepare($sql); $sth->execute(); while ($feth = $sth->fetch()) { yield $feth; } } p.s. ну и на всякий: таки да, если количество итерируемых записей действительно велико, то оперативки с использованием генераторов потратится намного меньше.
@Impulse Или так тоже можно вытащить все строки: PHP: $db = new Db(); $test = $db->prepare('SELECT * FROM news'); $test->execute(); $result = $test->fetchall(); foreach ($result as $allnews) { echo $allnews; }
@Impulse Ты говоришь если id не будет то остановит вывод это же не так, он выведите все следующие что идут после id=3. Ты попробуй этот запрос что я написал и скажи что получилось, fetchall -вывести все строки fetch - вывести строку. Может ты попутал fetch и fetchall он и вертал тебе одну строку потому что использовал fetch.
@_ne_scaju_ ничего он не перепутал, разве что кроме синтаксиса генераторов. Просто ему нужно проитерировать большое количество записей и что-то с ними сделать, при этом не сожрав всю оперативку.