Какой из циклов работает быстрее
Применяя 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 шт):
В вашем случае вполне возможно использовать while
для перебора результатов запроса через PDO
. Проблема возникает потому, что метод fetchAll()
возвращает сразу весь массив данных.
Для использования цикла while
можно изменить подход к выборке данных, применяя метод fetch()
вместо fetchAll()
. Метод fetch()
возвращает по одной записи за раз, что позволяет использовать цикл while
.
вот как можно сделать:
while ($r = $pdo->query_id->fetch()) {
echo $r['url'] . PHP_EOL;
}
Если вы используете fetchAll()
, то foreach
потребует больше памяти, так как все результаты будут загружены сразу. Использование while
с fetch()
может быть более производительным, если данных очень много, так как записи загружаются по одной.