За последние 24 часа нас посетили 17010 программистов и 1652 робота. Сейчас ищут 977 программистов ...

Node no longer exists :shock:

Тема в разделе "PHP для новичков", создана пользователем ShamahN, 18 май 2008.

  1. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Не понятно
    Есть объект. Он внутри себя собирает xml-дерево и записывает в одно из своих свойств. Этот объект на всех страничках одинаков, по-этому я посчитал что правильнее его будет серриализовать в сессии и потом в нужный момент ансериализовывать от туда.
    Не представите мое удивление, когда весь объект, кроме поля с деревом "вернулся" нормальный а на самое главное php мне ответил subj.
    Что может быть такое? Если чем поможет: дерево собирал simpleXML...
     
  2. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    покажи код
     
  3. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    кхм.кхм... :) сами напросились :)
    В общем объект который собирает дерево:
    PHP:
    1.  
    2. <?php
    3. class items
    4. {
    5.     public $itemsXML;
    6.   //В качестве параметра передаем собирать ли дерево при конструкте - труе - не собирать!!!
    7.     function __construct($notFormsXMLTree=0)
    8.     {
    9.         if ($notFormsXMLTree) return 0;
    10.         //Создаем хмл-дерево и корневой элемент
    11.         $xmlStr ="<?xml version='1.0' encoding = 'UTF-8'?>\n<items>\n</items>";
    12.         $this->itemsXML = new simpleXMLElement($xmlStr);
    13.         //Производим выборку базы данных и устанавливаем параметры корневого нода
    14.         $query = "SELECT *
    15.                             FROM tbitems
    16.                             WHERE tbitems.id='0';";
    17.  
    18.         $queryResult=mysql_query($query);
    19.         if (!$queryResult)
    20.             exit("Ошибка в запрсе при заполнении статей 0го уровня");
    21.     //Если есть элемент нулевого уровня
    22.     if (mysql_num_rows($queryResult))
    23.         $this->getItems($queryResult);
    24.     }
    25.  
    26.     public function getItems($queryResult, $currentItem=0)
    27.     {
    28.         if (!$currentItem) $currentItem = $this->itemsXML;
    29.  
    30.         //Определяем переменную-счетчик
    31.         $i=0;
    32.         while($itemData = mysql_fetch_assoc($queryResult))
    33.         {
    34.             $currentItem->addChild('item');
    35.             $this->setItemData($itemData, $currentItem->item[$i]);
    36.  
    37.             $query = "SELECT *
    38.                                 FROM tbitems
    39.                                 WHERE tbitems.idMaster =  '".$itemData['id']."'
    40.                                 ORDER BY
    41.                                  tbitems.sort ASC,
    42.                                  tbitems.itemDate DESC";
    43.  
    44.             $result = mysql_query($query);
    45.  
    46.             if (!$result) exit ("Ошибка в запросе");
    47.  
    48.             if (mysql_num_rows($result))
    49.             {
    50.                 //Заполним рекурсивно все item'ы
    51.                 $this->getItems($result, $currentItem->item[$i]);
    52.             }
    53.             $i++;
    54.         }
    55.     }
    56.  
    57.     private function setItemData($itemData, $currentItem)
    58.     {
    59.         //Разберем полученные дынные
    60.     foreach ($itemData as $attribute => $value)
    61.     {
    62.     //Заполним все непустые атрибуты.
    63.         if (((!$value)&&($attribute!='id'))||(($attribute=='itemDate')||($attribute=='itemFullCaption')||($attribute=='itemShortCaption'))) continue;
    64.             $currentItem->addAttribute($attribute, $value);
    65.     }
    66.     if (!$itemData['itemFullCaption']) $itemData['itemFullCaption'] = $itemData['itemFullCaption'];
    67.     //Добавим узлы со значениями полного и короткого наименования
    68.         $currentItem->addChild('itemShortCaption', $itemData['itemShortCaption']);
    69.         $currentItem->addChild('itemFullCaption', $itemData['itemFullCaption']);
    70.     }
    71. }
    72. ?>
    73.  
    Теперь. Каждый раз при попадании на индексную главную страничку проверяем размер (и ваабще существование) массива $_GET и элемента массива $_SESSION['items']. Если они есть, то производим ансериалиазацию. Если не определено что-то - пересобираем объект заново. Тоже объект (clssPage), но он большой и по-этому выведу только кусок который за это отвечает. Так что не пугайтесь слова this:
    PHP:
    1.  
    2. <?php
    3. $this->itemLevel=0;
    4.         if (isset($_GET['idItem']))
    5.         {
    6.                 $this->itemLevel=count($_GET['idItem']);
    7.         }
    8.  
    9.         if ((!$this->itemLevel)||(!isset($_SESSION['items'])))
    10.         {
    11.             //Заполним блоги из БД
    12.             $idItem = array();
    13.             if (isset($_GET['idItem'])) $idItem=$_GET['idItem'];
    14.             //Параметр 0 - неВыполнятьФормирование XML-дерева = Ложь.
    15.             //Т.е. будет произведено формирование дерева
    16.             $this->items = new items(False);
    17.         }
    18.         else
    19.         {
    20.             //В данном случае нет необходимости формировать дерево. Передадим его из сессии.
    21.             //следовательно в качестве параметра для конструктора передадим true - не формировать дерево
    22.             $this->items = new items(True);
    23.             $this->items = unserialize($_SESSION['items']);
    24.         }
    25.         printr($this->items);
    26. ?>
    27.  
    Вот такой вот код. Но сразу говорю, что когда то что сейчас xml-дерево было просто объектом все замечательно работало... Но пришло время повышать свой уровень :):):)
     
  4. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  5. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Как замечательно... Не понятно тогда для чего я это все делал.. проще не стало.. Да и в массивы смысла нет. Вложеннность объктов бешаная, а когда у меня было объектами, они еще и методы имели для работы с такими структурами. Тот же самый дом был.
    А если хранить в строке, а при работе ипмпортировать в симплХМЛ, думаю такое же возможно
     
  6. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Спасибо большое. Я уже выкрутился подобным же образом. Перед сериализацией все simplxml поля объекта пекидываешь в строку (asXML()). Потом спокойно сериализуешь. После ансериализации возвращаешь все обратно.
    Очень любопытно, конечно :)
    Но это, думаю, правильнее чем каждый раз делать бешеные выборки из БД.
    Sergey89
    Респект и спасибо.
    Тема закрыта!
     
  7. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    То что писал выше, если честно, извращение. Поэтому и потёр. Проще просто строку XML сохранить.