Какой из циклов работает быстрее

Применяя PDO для работы с базой данных.

Получается что единственный цикл который возможно использовать это foreach?

Так как на выходе получаю массив $pdo->fetchAll()...

Ранее использовал while, вопрос, while или foreach быстрее перебирает записи?

Что не так с моим кодом, возможно ли перебирать результат через while?

class bb
{

    public $db_id;
    public $query_id;

    function connect()
    {

        $this->db_id = new PDO('mysql:host=localhost;dbname=table', 'user', 'pass', [
            PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'", 
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION]);

        !$this->db_id && $this->display_error('No connect');

    }

    function query($sql, $value = [])
    {
        !$this->db_id && $this->connect();

        !($this->query_id = $this->db_id->prepare($sql)) 
              && $this->display_error(false, $sql);

        $this->query_id->execute($value);

        return $this->query_id;

    }

    function fetchAll()
    {
        return $this->query_id->fetchAll();
    }

    function display_error($error, $sql= '')
    {
        die('-----------');
    }

}

$pdo = new bb;


$pdo->query("SELECT * FROM `error` WHERE `code` in (?,?) ORDER BY `type` ASC", [404,410]);
        
//while ($r = $pdo->fetchAll())
//  print('sdf');
foreach ($pdo->fetchAll() as $r) 
    echo $r['url'].PHP_EOL;

Возможно сделать так:

function fetchAll()
{
  return $this->fetchAll();
}

То есть обращаться внутри объекта, к объекту что ли. Не понимаю...


Ответы (1 шт):

Автор решения: Insight Seeker

В вашем случае вполне возможно использовать while для перебора результатов запроса через PDO. Проблема возникает потому, что метод fetchAll() возвращает сразу весь массив данных.

Для использования цикла while можно изменить подход к выборке данных, применяя метод fetch() вместо fetchAll(). Метод fetch() возвращает по одной записи за раз, что позволяет использовать цикл while.

вот как можно сделать:

while ($r = $pdo->query_id->fetch()) {
    echo $r['url'] . PHP_EOL;
}

Если вы используете fetchAll(), то foreach потребует больше памяти, так как все результаты будут загружены сразу. Использование while с fetch() может быть более производительным, если данных очень много, так как записи загружаются по одной.

→ Ссылка