За последние 24 часа нас посетили 18287 программистов и 1597 роботов. Сейчас ищут 897 программистов ...

Проблема с классом. обьясните пожалуйста.

Тема в разделе "Прочие вопросы по PHP", создана пользователем Tinvul, 17 июн 2009.

  1. Tinvul

    Tinvul Активный пользователь

    С нами с:
    13 мар 2009
    Сообщения:
    31
    Симпатии:
    0
    Адрес:
    Хабаровск
    добрый день!

    Подскажите пожалуйста, почему у меня выдает ошибку
    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in XXX on line 12

    при следующем фрагменте кода.

    PHP:
    1.  
    2. class child
    3. {
    4.     function select($parentid)
    5.     {
    6.         $sql = "SELECT * FROM modx_catalog WHERE parent=$parentid ORDER BY title ASC";
    7.         $result = mysql_query($sql);
    8.     }
    9.  
    10.     function action($parentid)
    11.     {
    12.         $select_array = $this -> select($parentid) -> result;
    13.         printf (mysql_fetch_array($select_array));
    14.     }
    15. }
    16.  
    17. $obj = new child;
    18. $obj -> action(0);
    19.  
    должен вывести инфу об одной записи
     
  2. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    PHP:
    1. <?
    2. class child
    3.  {
    4.      function select($parentid)
    5.      {
    6.          $sql = "SELECT * FROM modx_catalog WHERE parent=$parentid ORDER BY title ASC";
    7.          return mysql_query($sql);
    8.      }
    9.  
    10.      function action($parentid)
    11.      {
    12.          $select_array = $this -> select($parentid);
    13.            printf (mysql_fetch_array($select_array));
    14.        }
    15.  }
     
  3. Tinvul

    Tinvul Активный пользователь

    С нами с:
    13 мар 2009
    Сообщения:
    31
    Симпатии:
    0
    Адрес:
    Хабаровск
    Ti
    спасибо. забыл про функцию return
     
  4. Tinvul

    Tinvul Активный пользователь

    С нами с:
    13 мар 2009
    Сообщения:
    31
    Симпатии:
    0
    Адрес:
    Хабаровск
    обьясните пожалуйста
    PHP:
    1.  class child
    2.   {
    3.      function select($parentid)
    4.      {
    5.          $sql = "SELECT * FROM modx_catalog WHERE parent=$parentid ORDER BY title ASC";
    6.          echo "$sql <br />";
    7.          return mysql_query($sql);
    8.      }
    9.  
    10.      function action($parentid)
    11.      {
    12.          $select_array = $this -> select($parentid);
    13.          for ($z = 0; $z < mysql_num_rows($select_array); $z++)
    14.          {
    15.             $catalog_array = mysql_fetch_array($select_array);
    16.             if ($catalog_array[isFolder] == 0)
    17.             {
    18.                 $wraperr = $wraperr."<div style=\"margin-left: 15px;\">$catalog_array[title]</div>";
    19.             }
    20.             else
    21.             {
    22.                 $title = $this -> action($catalog_array[id]);
    23.                 $wraperr = $wraperr."<div style=\"margin-left: 15px;\">
    24.                 <div style=\"margin-left: 15px;\">$catalog_array[title]</div>
    25.                 <div style=\"margin-left: 15px;\">
    26.                 <div style=\"margin-left: 15px;\">$title</div>
    27.                 </div>";
    28.  
    29.             }
    30.          }
    31.          echo ($wraperr);
    32.      }
    33.   }
    34.  
    35. $obj = new child;
    36. $obj -> action(0);
    должен вывести, по идее, следущий список:
    Лесной Комплекс
    Оборудование
    Вентиляционное
    Конверс, ООО
    Сантехника


    Но вместо этого получаю
    Конверс, ООО
    Вентиляционное
    Сантехника
    Лесной Комплекс
    Оборудование
     
  5. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    Tinvul
    - уберите, пожалуйста, весь мусор, и оставьте только то, где происходит сортировка (запрос)
    - объясните, какой порядок вы ожидаете и почему.
     
  6. Tinvul

    Tinvul Активный пользователь

    С нами с:
    13 мар 2009
    Сообщения:
    31
    Симпатии:
    0
    Адрес:
    Хабаровск
    armadillo


    PHP:
    1.  class child
    2.    {
    3.      // Данная функция делает запрос в БД MySQL
    4.      function select($parentid)
    5.      {
    6.          $sql = "SELECT * FROM modx_catalog WHERE parent=$parentid ORDER BY title ASC";
    7.          return mysql_query($sql);
    8.      }
    9.      //Собственно в этой функции идет основная работа - обработка и сортировка полученной информации из БД
    10.      function action($parentid)
    11.      {
    12.          //Получение массива компаний, у которых один родитель
    13.          $select_array = $this -> select($parentid);
    14.          //обработка массива
    15.          for ($z = 0; $z < mysql_num_rows($select_array); $z++)
    16.          {
    17.              $catalog_array = mysql_fetch_array($select_array);
    18.              //Если полученая строка не является папкой (то есть isFolder=0), то
    19.              if ($catalog_array[isFolder] == 0)
    20.              {
    21.                  //то строковой переменной $wrapper добавляем блок див с Названием строки
    22.                  $wraperr = $wraperr."<div style=\"margin-left: 15px;\">$catalog_array[title]</div>";
    23.              }
    24.              else
    25.              {
    26.                  // Если же Строка является родительской папкой, то получаем ее дочерние компании/строки
    27.                  // В данном случае переменой $title = Новый вызов функции, с уже измененым $parentid(нужна для выборки строк, где указаны у параметра parent передоваемое значение)
    28.                  $title = $this -> action($catalog_array[id]);
    29.                  //снова в конец $wraperr добавляем полученное значение;
    30.                  $wraperr = $wraperr."<div style=\"margin-left: 15px;\">
    31.                 //это блок для название Папки
    32.                 <div style=\"margin-left: 15px;\">$catalog_array[title]</div>
    33.                 <div style=\"margin-left: 15px;\">
    34.                 //Этот блок выводит полученный контейнер с дочерними документами
    35.                 <div style=\"margin-left: 15px;\">$title</div>
    36.                 </div>";
    37.  
    38.              }
    39.          }
    40.          echo ($wraperr);
    41.      }
    42.    }
    43.  //Создаем экземпляр класса, и просим начать с строк у которых Нет собственно родительской папки....
    44.  $obj = new child;
    45.  $obj -> action(0);
    Собствено, я ожидал, что сначало он мне выдаст Строку с Лесной комплекс, т.к. Сортировка стоит по убыванию, потом пойдет Раздел Оборудование, у которого есть Два дочерних документа - Сантехника И вентиляция. У Вентиляции есть еще один дочерний документ.

    Я собственно предполагаю, что надо делать в нутри (при повторном вызове функции) новые экземпляры класса. Но не уверен что так можно и вообще ли я правильно мыслю...
    Или же нужна еще одна функция которая будет все это дело выводить уже после окончательной обработки
    Если надо то могу кинуть БД...
    З.Ы. я знаю что телепаты вымерли, если что-то упустил, то дополню
     
  7. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    1. А где return для метода action?

    2.Происходит следующее: Берется первая верхняя папка (Лесной Комплекс), до записи в переменную в 32 строке опять вызывается action и берется следующая папка (Оборудование). Таким образом спускаемся до "Конверс, ООО", выводим его. И начинаем подниматься. Выводим "Вентиляционное" и т.д.
    Думаю надо заменить echo ($wraperr); (40 строка) на return $wraperr;. И соответственно $obj -> action(0); (45 строка) на echo $obj -> action(0);
     
  8. Tinvul

    Tinvul Активный пользователь

    С нами с:
    13 мар 2009
    Сообщения:
    31
    Симпатии:
    0
    Адрес:
    Хабаровск
    Volt(220)
    СПАСИБО!!! оно самое! теперь работает