Объясните логику работы while с fetch_row в php?
1. Кучи запросов нет. Запрос один и загружает все данные разом и хранит в своем кэше, а fetchRow выдает вам строки из кэша по одной.
2. Потому что while выполняет выражение в скобках при каждой итерации, таким образом вы получаете каждый раз новую строку. foreach же первое выражение в скобках выполняет один раз, и получив значение этого выражения на каждой итерации только обновляет $dataKey и $dataValue. Если использовать foreach($db->fetchAll() as $dataKey => $dataValue), то будет работать так же, как while
fetchRow это не запрос к бд