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 :: Версия для печати :: Помогите с циклом
Форумы портала PHP.SU » » Вопросы новичков » Помогите с циклом

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

1. Vechnost - 31 Августа, 2014 - 15:16:56 - перейти к сообщению
Всем привет.

Смотрю видеокурсы УЦ "Специалист" - хорошие курсы, серьёзные. Но вот на последнем уроке 2 уровня без видимых причин затык случился.

Ребят, помогите! Я уже всю голову сломал!

Ксати, у них Apache, PHP и MySql отдельну ставилисть, а у меня - денвер.

Итак, суть проблемы.

Строим книжный магазин. Есть БД под именем eshop а в ней (в числе прочих) - таблица catalog с полями author, title, pubyear и price. В ней - несколько записей. Есть файл catalog.php, который всю эту прелесть выводит. Вот он:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?php
  3.         // запуск сессии
  4.         session_start();
  5.         // подключение библиотек
  6.         require "eshop_db.inc.php";
  7.         require "eshop_lib.inc.php";
  8. ?>
  9. <html>
  10. <head>
  11.         <title>Каталог товаров</title>
  12. </head>
  13. <body>
  14. <p>Товаров в <a href='basket.php'>корзине:</a> <?=$count?></p>
  15. <?php
  16.  
  17. ?>
  18. <table border="1" cellpadding="5" cellspacing="0" width="100%">
  19. <tr>
  20.         <th>Автор</th>
  21.         <th>Название</th>
  22.         <th>Год издания</th>
  23.         <th>Цена, руб.</th>
  24.         <th>В корзину</th>
  25. </tr>
  26. <?php
  27.         $goods = select_all();
  28.         foreach($goods as $item){
  29. ?>
  30.                 <tr>
  31.                         <td><?=$item["author"]?></td>
  32.                         <td><?=$item["title"]?></td>
  33.                         <td><?=$item["pubyear"]?></td>
  34.                         <td><?=$item["price"]?></td>
  35.                         <td><a href='add2basket.php?id=<?=$item["id"]?>'>в корзину</a></td>
  36.                 </tr>
  37. <?php  
  38.         }
  39. ?>
  40. </table>
  41. </body>
  42. </html>
  43.  

Вверху подключается библиотека, вот её функции, которые вызвыаются в этом файле:


PHP:
скопировать код в буфер обмена
  1. // конвертируем данные из базы в массив
  2. function db2array($data){
  3.         $arr = array();
  4.         while ($row = mysql_fetch_assoc($data)){
  5.                 $arr[] = $row;
  6.                 return $arr;
  7.         }
  8. }
  9.  
  10. // возвращает все содержимое каталога товаров
  11. function select_all(){
  12.         $sql = "SELECT * FROM catalog";
  13.         $result = mysql_query($sql) or die(mysql_error());
  14.         return db2array($result);
  15. }
  16.  

Вроде бы всё понятно, только выдодится лишь ОДНА запись, а их в БД несколько. Чтобы понять, в чём тут подвох,я в файле catalog.php после $goods = select_all() псиал print_r($goods); exit; и понял, что ошибка происходит в функции db2array() на уровне цикла while - он почему-то срабатывает однократно.

Самое интересное, что у препода на видео всё работает! Я этот код буквально с экрана списывал. Думаю-думаю - и понять ничего не могу. Ну какие у него могут быть причины работать не правильно?! Код-то вроде хороший, все должно быть ОК
2. teddy - 31 Августа, 2014 - 15:22:17 - перейти к сообщению
В функции db2array вынесите return $arr; за пределы тела цикла while.

После return жизни нет. Получается так, что в массив $arr заносится только одна запись, которая тут же возвращается при помощи return, тем самым завершая работу цикла.
3. Vechnost - 31 Августа, 2014 - 15:27:19 - перейти к сообщению
СПАСИБО!!!! Заработало. Всё-таки я это упустил... Глаза замыливаются, когда долго на код смотришь.

 

Powered by ExBB FM 1.0 RC1