Всем привет, хочу уточнить.
Я пишу while($data = $db->fetchRow()) получается пока true while будет выводить вызываемые строки.
Моменты которые мне не понятны:
1. получается у меня к бд идёт куча запросов в которых спрашивается есть ли ещё строка?
2. почему while такой умный понимает, что нужно запрашивать её строку, а допустим foreach( $db->fetchRow() as $dataKey => $dataValue) не такой умный и не запрашивает сверх строки?
1. Кучи запросов нет. Запрос один и загружает все данные разом и хранит в своем кэше, а fetchRow выдает вам строки из кэша по одной.
2. Потому что while выполняет выражение в скобках при каждой итерации, таким образом вы получаете каждый раз новую строку. foreach же первое выражение в скобках выполняет один раз, и получив значение этого выражения на каждой итерации только обновляет $dataKey и $dataValue. Если использовать foreach($db->fetchAll() as $dataKey => $dataValue), то будет работать так же, как while
Спасибо за ответ, хочется больше внутренностей, что и как работает.
Понятно что fetchAll вытаскивает и преобразовывает в массив, но почему/как тогда while понимает что если дело заходит о бд, то нужно лезть в буфер (который похоже для бд свой) и вытаскивать от туда по строчке. Надеюсь понятно объяснил.
Stadinov Denis: Возможно, поздно ответил, но все же
while ничего не знает о бд и буфере. while только выполняет выражение в скобках - $db->fetchRow().
А вот метод fetchRow класса, который реализует доступ к бд, как раз таки и читает строки из кэша.
То есть, если вы напишите 10 одинаковых строк кода $row = $db->fetchRow(), то в $row будет 10я строчка из набора данных, полученных в результате запроса (если таковая есть, конечно).
Чтобы стало понятнее, посмотрите код классов, реализующих доступ к бд в каком нибудь фреймворке