Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с реализацией класса 
:(
    Опции темы
DimaSiK
Дата 25.4.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 390
Регистрация: 20.8.2006

Репутация: нет
Всего: нет



Имеется БД состоящая из трез таблиц, который связаны между собой. Я решил реализовать работу с ним в виде класса, причем отдельный класс описываю отдульную таблицу, и классы связываются по принципы связи таблиц в БД. Вот реаоизация:

Код

<?php
   
    // --------------------------------------- news_class START -------------------------------------------------------------//
    class CPage_news
    {
    
        var $id_pages;
        var $name_pages;
        var $parent;
   
        var $category_arr   =   array();
        
           
        function CPage_news($id_pages, $name_pages, $parent)
        {
              
            $this->id_pages         =   $id_pages;
            $this->name_pages       =   $name_pages;
            $this->parent           =   $parent;
                
            $querry =   sprintf('SELECT *
                                 FROM n_category
                                 WHERE id_pages=%u
                                 ORDER BY id_pages
                                 DESC',$id_pages);
           
          
           
           $querry_result   =   mysql_query($querry);
           
           if(!$querry_result)
           {
              echo '<br> Error 4: SELECT from n_category';
              exit;   
           }
           
            $row_count = mysql_num_rows($querry_result);
            for($i=0;$i<$row_count;$i++)
           {
                $data_from_db                           =   mysql_fetch_array($querry_result);
                $this->category_arr[$data_from_db[1]]   =   new CCategory_news($data_from_db[0],$data_from_db[1],$data_from_db[2],&$this);
                
           }      
            
        }
        // -------------------------------------------------//
        //----------- Метод добовления категории -----------//
        // -------------------------------------------------// 
        function add_category($id_pages,$category)
        {
            $id_category                        =   $this->last_cat();  
            $this->category_arr[$id_category]   =   new CCategory_news($id_pages,$id_category,$category,&$this);
                       
        }
        
        // -------------------------------------------------//
        //-------Метод поиска последнего id категории-------//
        // -------------------------------------------------//
        function last_cat()
        {
             $news_arr  =   $this->parent->news_arr;
             $last_cat  =   0;
             foreach($news_arr as $page )
             {
                $category_arr   =   $page->category_arr; 
                foreach ($category_arr as $category )
                {
                    $id_category    =   $category->id_category;
                    if($id_category>$last_cat)
                     $last_cat    =   $id_category;
                           
                }
             }   
                
             return  ++$last_cat;   
        }
        // -------------------------------------------------//
        //----------- Метод удаления категории -------------//
        // -------------------------------------------------//
        function del_category($id)
        {
            if(isset($this->category_arr[$id]))
              unset($this->category_arr[$id]);
            
        }
        // -------------------------------------------------//
        //-------- Метод изменения данных категории ---------//
        // -------------------------------------------------//
        function update_data_cat($id,$new_name)
        {
           $this->category_arr[$id]->category =   $new_name;
          
        }
        // -------------------------------------------------//
        //- Метод проверки на существование именикатегории -//
        // -------------------------------------------------//
        function chek_name_cat($name_cat)
        {
          foreach($this->parent->news_arr as $news_page)
          {
            foreach($news_page->category_arr    as  $category)
            {
              if($category->category===$name_cat)
                return 0;
            }
          }
            return 1;    
        }
        // -------------------------------------------------//
        //----------- Метод сохранения данных в БД ---------//
        // -------------------------------------------------//
        function save_data()
        {
            if(count($this->category_arr)>0)
            {
                $format_string   =   sprintf('INSERT INTO n_category VALUES'); 
                
                foreach($this->category_arr as $category)
                {
                    $format_string  =   sprintf("%s (%u ,%u ,'%s'),",
                                                $format_string, $category->id_pages,$category->id_category,$category->category);
                                                
                    $category->save_data();                             
                }
                
                $format_string[strlen($format_string)-1]    =   ';'; 
                $querry_result    =   mysql_query($format_string);
                
                if(!$querry_result)
                {
                     echo '<br> Error 5: INSERT into n_category';
                     exit;   
                }
            }
         
           
        }
        
      
} 
    
    class CCategory_news
    {
      var $id_pages;
      var $id_category;
      var $category;
      var $parent;
   
      var $news_arr =   array();
      
         
     function CCategory_news($id_pages, $id_category, $category, $parent)
     {
            $this->id_pages         =   $id_pages;
            $this->id_category      =   $id_category;
            $this->category         =   $category;
            $this->parent           =   $parent;
            
            $querry =   sprintf('SELECT * 
                                 FROM n_news 
                                 WHERE  id_category=%u 
                                 ORDER BY id_news
                                 DESC',$id_category);
                
           $querry_result   =   mysql_query($querry);
           
           if(!$querry_result)
           {
              echo '<br> Error 6: SELECT from n_news';
              exit;   
           }
           
            $row_count = mysql_num_rows($querry_result);
            for($i=0;$i<$row_count;$i++)
           {
                $data_from_db                           =   mysql_fetch_array($querry_result);
                $this->news_arr[$data_from_db[1]]       =   new CNews($data_from_db[0],$data_from_db[1],$data_from_db[2],
                                                                      $data_from_db[3],$data_from_db[4],$data_from_db[5]);
                
           }      
     
     }
     
    // -------------------------------------------------//
    //-------- Метод подсчета новостей в катеогрии------//
    // -------------------------------------------------//
    function get_count_news()
    {
        $count  =   count($this->news_arr);
        
           return $count;   
    }
     // -------------------------------------------------//
    //--------------- Метод удаление новости ------------//
    // -------------------------------------------------// 
     function del_news($id)
     {
         unset($this->news_arr[$id]);
     }
     // -------------------------------------------------//
    //--------------- Метод добовления новости ----------//
    // --------------------------------------------------// 
     function add_news($id_category,$head_news,$text_news,$foto_news)
     {
     
         $date_news          =  date('Y-m-d');
         $id_news            =  $this->last_id();
         
         $this->news_arr[$id_news]   =   new CNews($id_category,$id_news,$head_news,$text_news,$date_news,$foto_news);
     
     }
     // -------------------------------------------------//
    //-------Метод поиска последнего id новости --------//
    // -------------------------------------------------//
     function last_id()
     {
         
         $last_id         =   0;
         $page_arr    =   $this->parent->parent->news_arr;
         
                 
         foreach($page_arr  as $page  )
         {
            $category_arr   =   $page->category_arr;  
            
            foreach($category_arr as $category)
            {
                $news_arr  =   $category->news_arr;
                
                foreach($news_arr as $news)
                {
                    echo  $news->id_news;
                    if($news->id_news>$last_id)
                        $last_id   =   $news->id_news;   
                }
            }
               
         }
      
         
         return ++$last_id;
     }
     // -------------------------------------------------//
    //------- Метод извлечение данных о новости ---------//
    // -------------------------------------------------//
     function get_news($id_news)
     {
         if(isset($this->news_arr[$id_news[0]]))
          return  $this->news_arr[$id_news[0]];   
     }
     // -------------------------------------------------//
    //-------- Метод обновления данных новости ----------//
    // -------------------------------------------------//
     function update_news($id,$head_news,$text_news, $foto, $date)
     {
      
                $this->news_arr[$id]->head_news  =   $head_news;
                $this->news_arr[$id]->text_news  =   $text_news;
                $this->news_arr[$id]->date_news  =   $date;
                $this->news_arr[$id]->foto_news  =   $foto;
                  
     }
     
     function save_data()
     {
        
         if(count($this->news_arr)>0)
         {
             $format_string  =   sprintf('INSERT INTO n_news VALUES'); 
            
            foreach($this->news_arr as $news)
            {
                $format_string  =   sprintf("%s (%u, %u, '%s', '%s', '%s', '%s'),", $format_string, $news->id_category,$news->id_news,
                                            $news->head_news, $news->text_news, $news->date_news, $news->foto_news);
                
            
            }
            
                $format_string[strlen($format_string)-1]    =   ';';
                $querry_result    =   mysql_query($format_string);
                  
                if(!$querry_result)
                {
                  echo '<br> Error 7: INSERT into n_news';
                  exit;   
                }    
     
     }
   }
}
    
    class CNews
    {
        var $id_category;
        var $id_news;
        var $head_news;
        var $text_news;
        var $date_news;
        var $foto_news;
               
        function CNews($id_category, $id_news, $head_news, $text_news, $date_news, $foto_news)
        {
            $this->id_category  =   $id_category;
            $this->id_news      =   $id_news;
            $this->head_news    =   $head_news;
            $this->text_news    =   $text_news;
            $this->date_news    =   $date_news;
            $this->foto_news    =   $foto_news;
            $this->parent       =   $parent;
            
               
        } 
        
    }
    // --------------------------------------- news_class END -------------------------------------------------------------//
    
/*
    $admin_class    =   new CAdmin();
    
    print_r($admin_class->news_arr);
    
    $admin_class->news_arr[1]->category_arr[1]->del_news(1);                          // удаление одной новости
    
     $admin_class->news_arr[1]->category_arr[1]->add_news(1,'asddd','dddddd','1.jpg');    // добовление
     $admin_class->news_arr[1]->category_arr[1]->add_news(1,'asddd','dddddd','1.jpg'); 
    
    $del_arr=   array(1,2);
    
    $admin_class->news_arr[1]->category_arr[1]->del_news($del_arr);                     // удаление нескольких новостей
    
    $some_news=$admin_class->news_arr[1]->category_arr[1]->get_news(3);                    // извлечение данных
    
    
   

    $admin_class->news_arr[1]->category_arr[1]->update_news(3,'DimaSiK','Some new TEXT');   // изменение данных
    echo 'Get';
    
    $admin_class->news_arr[1]->del_category(1);                                              // удаление категории
    
    $admin_class->news_arr[1]->add_category(1,'Туцццццццццццццццц');
  
    $admin_class->news_arr[1]->category_arr[2]->add_news(1,'asddd','dddddd','1.jpg');
*/   
?>



Тесть класс CPage_news описывает первую таблицу БД, класс CPage_news описывает следующую таблицу, которая вложена в таблицу №1 и так далее. Для того, чтобы знать, какие данные имеются в верхней таблице - классе, я пытаюсь передать адрес указателя &$this, вот так - new CCategory_news($id_pages,$id_category,$category, &$this) и так далее до самой последней таблиц. При инициализации самого верхнего класса, я получаю объект, в котором таблицы связана так же как и в БД и это объект содержит все записи БД. Далее объект запихивается в сессию и вот тут начинаются проблемы. Проблемы возникают именно из-за &$this, так как при распечатке данных находящихся в объекте я получаю уйму данных, которые не помещаются в сессию и все из-за &$this. Как мне обойти это и знать о том, что происходит в самом верху объекта находясь при этом с низу?

  



--------------------
Мы не стараемся быть первыми, мы стараемся быть лучшими.

PM MAIL   Вверх
WolfON
Дата 25.4.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: 6
Всего: 8



Используйте позднее инстанирование, чтобы подгружать информацию из БД по мере ее надобности.
Шаблон проектирования - Factory

Все-таки грузить всю БД, да потом еще писать ее в сессию слишком экстравагантное решение
PM MAIL ICQ   Вверх
DimaSiK
Дата 25.4.2007, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 390
Регистрация: 20.8.2006

Репутация: нет
Всего: нет



Просто много чего уже сделано и неохота переделовать. Кто знает почему при написании &$this, именно при взятии адреса, дрес не берется, а вместо этого передеатся весь объект целиком?. Имеено поэтому объект и не помещается в сессию, так как все вышестоящии экземпляры дублируется очень большое количество раз.


--------------------
Мы не стараемся быть первыми, мы стараемся быть лучшими.

PM MAIL   Вверх
WolfON
Дата 25.4.2007, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: 6
Всего: 8



По тому, что надо было читать про устройство памяти в компьютере.
Гарантировать то, что после десериализации все объекты будут размещены по тем-же адресам, что и до сериализации - невозможно
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0629 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.