За последние 24 часа нас посетили 16475 программистов и 1561 робот. Сейчас ищут 2034 программиста ...

как с помошью генератор и fetch() вывести все новости

Тема в разделе "PHP и базы данных", создана пользователем Impulse, 1 июл 2017.

  1. Impulse

    Impulse Новичок

    С нами с:
    23 янв 2017
    Сообщения:
    23
    Симпатии:
    0
    Код (Text):
    1.  
    2. class Db
    3. {
    4.     public $dbh;
    5.     function __construct()
    6.     {
    7.         $this->dbh = new \PDO('mysql:host=127.0.0.1;dbname=test', 'root', '');
    8.         // создаем соединение с БД
    9.     }
    10.  
    11.     public function generator ($sql)
    12.     {
    13.         for ($id = 1; $feth !== false; $id++) {
    14.             $sth = $this->dbh->prepare($sql . $id);
    15.             $sth->execute();
    16.             $feth = $sth->fetch();
    17.             yield $feth;
    18.             // генерируем запросы к БД
    19.         }
    20.     }
    21. }
    22.  
    23. $db = new Db();
    24. $test = $db->generator('SELECT * FROM news WHERE id=');
    25.  
    26. foreach ($test as $item) {
    27.     var_dump($item);
    28. }
    код работает но после его написания я понял что если будет пропуск в id он бессмысленный
    например есть id 1 id 2 id 4
    когда функция дойдет до id 3 уведет что его нету и прекратит работу

    так вот как мене с помощью генератор и fetch() вывести все новости которые есть в БД ??
     
  2. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Извиняюсь конечно, что спрашиваю такое, но по каким религиозным соображениям нельзя просто сделать select * from news?
     
    Impulse нравится это.
  3. Impulse

    Impulse Новичок

    С нами с:
    23 янв 2017
    Сообщения:
    23
    Симпатии:
    0
    Код (Text):
    1. class Db
    2. {
    3.     public $dbh;
    4.     function __construct()
    5.     {
    6.         $this->dbh = new \PDO('mysql:host=127.0.0.1;dbname=test', 'root', '');
    7.         // создаем соединение с БД
    8.     }
    9.  
    10.     public function generator ($sql)
    11.     {
    12.             $sth = $this->dbh->prepare($sql);
    13.             $sth->execute();
    14.             $feth = $sth->fetch();
    15.             yield $feth;
    16.             // генерируем запросы к БД
    17.  
    18.     }
    19. }
    20.  
    21. $db = new Db();
    22. $test = $db->generator('SELECT * FROM news');
    23.  
    24. foreach ($test as $item) {
    25.     var_dump($item);
    26. }
    так ?
    он мне вернул 1 строку
    а мне надо все что есть в базе
    смысл всего этого в том что используя fetch() и генератор нагрузка на память будет меньше чем используя fetchAll()
    только сделать это у меня мозгов не хватает
     
    #3 Impulse, 1 июл 2017
    Последнее редактирование: 1 июл 2017
  4. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Ну, с религией понятно: хранители тайных знаний прироста скорости от одинарной кавычки. Дык вот, вы собираетесь плюнуть в пользователя разом несколько тысяч новостей? Потому что если речь идет о 20-30 новостях на страницу, то профита не будет никакого. Вообще.

    Теперь по теме: у вас выводится одна строка, потому что вы одну строку и отдаете. Отдавать данные нужно тоже в цикле, построчно, примерно вот так:

    PHP:
    1. public function generator ($sql)
    2.     {
    3.         $sth = $this->dbh->prepare($sql);
    4.         $sth->execute();
    5.         while ($feth = $sth->fetch()) {
    6.             yield $feth;
    7.         }
    8.     }
    p.s. ну и на всякий: таки да, если количество итерируемых записей действительно велико, то оперативки с использованием генераторов потратится намного меньше.
     
    Impulse нравится это.
  5. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Impulse
    Или так тоже можно вытащить все строки:
    PHP:
    1. $db = new Db();
    2. $test = $db->prepare('SELECT * FROM news');
    3. $test->execute();
    4. $result = $test->fetchall();
    5.  
    6. foreach ($result as $allnews) {
    7.     echo $allnews;
    8. }
     
  6. Impulse

    Impulse Новичок

    С нами с:
    23 янв 2017
    Сообщения:
    23
    Симпатии:
    0
    в первом посту я писал почему я так не делаю
     
  7. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Impulse
    Ты говоришь если id не будет то остановит вывод это же не так, он выведите все следующие что идут после id=3. Ты попробуй этот запрос что я написал и скажи что получилось, fetchall -вывести все строки fetch - вывести строку. Может ты попутал fetch и fetchall он и вертал тебе одну строку потому что использовал fetch.
     
    #7 _ne_scaju_, 8 июл 2017
    Последнее редактирование: 8 июл 2017
  8. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    @_ne_scaju_ ничего он не перепутал, разве что кроме синтаксиса генераторов. Просто ему нужно проитерировать большое количество записей и что-то с ними сделать, при этом не сожрав всю оперативку.