Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Глупый вопрос про "кэширование" в цикле foreach
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Глупый вопрос про "кэширование" в цикле foreach

Страниц (1): [1]
 

1. Ticksy - 01 Мая, 2011 - 12:12:24 - перейти к сообщению
У меня вопрос по примерно следующему коду:
PHP:
скопировать код в буфер обмена
  1. foreach(mysql_query("SELECT * FROM ...") as $row) {
  2. // do something...
  3. }

PHP при каждой итерации цикла будет делать запрос или вызовет функцию только при первой, а в следующих итерациях будет юзать этот самый "кэш"?

Кто не понял про "кэш", то я имею подобное:
PHP:
скопировать код в буфер обмена
  1. $result = mysql_query("SELECT...");
  2. foreach($result as $row) ...
2. molchun201 - 01 Мая, 2011 - 12:58:12 - перейти к сообщению
а при чём тут кэш? Однако
в $result - попадает массив данных из БД и этот массив и выводится, т.е. 1 раз происходит запрос
3. Ticksy - 01 Мая, 2011 - 13:00:08 - перейти к сообщению
molchun201 пишет:
а при чём тут кэш? Однако
в $result - попадает массив данных из БД и этот массив и выводится, т.е. 1 раз происходит запрос

Тоже самое происходит и при foreach(mysql_query("SELECT...") as $row)... ? Функция один раз вызывается при таком?
4. molchun201 - 01 Мая, 2011 - 13:07:48 - перейти к сообщению
да, смари сам mysql_query("SELECT...") as $row, т.е. результат запроса mysql_query("SELECT...") помещаем в $row <- он уже массив с данными и foreach'ом его перебираем и выводим
5. Мелкий - 01 Мая, 2011 - 16:17:05 - перейти к сообщению
Не понял
Народ, вы вообще читаете описание функций, которыми пользуетесь?
mysql_query никогда массив не возвращает.

Цитата:
про "кэширование" в цикле foreach

В случае, если фореаху передаётся функция, которая должна вернуть массив, эта функция вызовется только один раз, а фореах будет работать с тем, что эта функция вернула.
Так, в foreach (range(1,10) as $el) {} функция range будет вызвана только 1 раз.
6. molchun201 - 01 Мая, 2011 - 16:20:06 - перейти к сообщению
Мелкий ну дык понятно, он возвращает resource, а как ещё можно работать с resource, кроме как перегнать в массив? Однако

Цитата:
в $result - попадает массив

здесь я чуть ввёл в заблуждение автора Закатив глазки

в $result - попадает ресурс, затем его записываем в массив $row

вот так будет точнее Подмигивание
7. Мелкий - 01 Мая, 2011 - 16:25:32 - перейти к сообщению
molchun201 пишет:
а как ещё можно работать с resource, кроме как перегнать в массив?

Корректно с ресурсами могут работать только функции, для этого и предназначенные.
Для ресурсов mysql_query - это семейство mysql_fetch_*. Замечу, что не все из них возвращают массив, есть и такая штука как mysql_fetch_object
8. grefon - 01 Мая, 2011 - 16:51:18 - перейти к сообщению
Ticksy, зачем Вы вообще используете цикл foreach при работе с базой данных? Этот цикл изначально создавался для других целей. Может тут все же лучше использовать while?
9. Ticksy - 01 Мая, 2011 - 17:35:57 - перейти к сообщению
Спасибо всем за ответы.

grefon пишет:
Ticksy, зачем Вы вообще используете цикл foreach при работе с базой данных? Этот цикл изначально создавался для других целей. Может тут все же лучше использовать while?

while($row = mysql_fetch_row())...? Потребление памяти уменьшится разве (вместе с ней и скорость увеличится значительно)?

 

Powered by ExBB FM 1.0 RC1