За последние 24 часа нас посетили 25775 программистов и 1726 роботов. Сейчас ищут 852 программиста ...

Построение дерева категорий ООП MYSQLI

Тема в разделе "Прочие вопросы по PHP", создана пользователем megavolt217, 16 мар 2015.

  1. megavolt217

    megavolt217 Новичок

    С нами с:
    16 мар 2015
    Сообщения:
    5
    Симпатии:
    0
    Помогите пожалуйста сделать функцию дерева категорий есть код с использованием New PDO А как мне сделать это же с использованием MYSQLI

    Вот пример:


    Код (Text):
    1.  <?php
    2.        /**
    3.          * PHP5 (ООП)
    4.          * Постоение дерева (меню неограниченной вложености)
    5.          * @author дизайн студия ox2.ru  
    6.          */
    7.        class TreeOX2 {
    8.      
    9.            private $_db = null;
    10.            private $_category_arr = array();
    11.      
    12.            public function __construct() {
    13.                //Подключаемся к базе данных, и записываем подключение в переменную _db
    14.                $this->_db = new PDO("mysql:dbname=ox2.ru-test-base;host=localhost", "root", "");
    15.                //В переменную $_category_arr записываем все категории (см. ниже)
    16.                $this->_category_arr = $this->_getCategory();
    17.            }
    18.      
    19.            /**
    20.              * Метод читает из таблицы category все сточки, и
    21.              * возвращает двумерный массив, в котором первый ключ - id - родителя
    22.              * категории (parent_id)
    23.              * @return Array
    24.              */
    25.            private function _getCategory() {
    26.                $query = $this->_db->prepare("SELECT * FROM `category`"); //Готовим запрос
    27.                $query->execute(); //Выполняем запрос
    28.                //Читаем все строчки и записываем в переменную $result
    29.                $result = $query->fetchAll(PDO::FETCH_OBJ);
    30.                //Перелапачиваем массим (делаем из одномерного массива - двумерный, в котором
    31.                //первый ключ - parent_id)
    32.                $return = array();
    33.                foreach ($result as $value) { //Обходим массив
    34.                    $return[$value->parent_id][] = $value;
    35.                }
    36.                return $return;
    37.            }
    38.      
    39.            /**
    40.              * Вывод дерева
    41.              * @param Integer $parent_id - id-родителя
    42.              * @param Integer $level - уровень вложености
    43.              */
    44.            public function outTree($parent_id, $level) {
    45.                if (isset($this->_category_arr[$parent_id])) { //Если категория с таким parent_id существует
    46.                    foreach ($this->_category_arr[$parent_id] as $value) { //Обходим ее
    47.                        /**
    48.                          * Выводим категорию
    49.                          *  $level * 25 - отступ, $level - хранит текущий уровень вложености (0,1,2..)
    50.                          */
    51.                        echo "<div style='margin-left:" . ($level * 25) . "px;'>" . $value->name . "</div>";
    52.                        $level++; //Увеличиваем уровень вложености
    53.                        //Рекурсивно вызываем этот же метод, но с новым $parent_id и $level
    54.                        $this->outTree($value->id, $level);
    55.                        $level--; //Уменьшаем уровень вложености
    56.                    }
    57.                }
    58.            }
    59.      
    60.        }
    61.      
    62.        $tree = new TreeOX2();
    63.        $tree->outTree(0, 0); //Выводим дерево
    64.      
    65.        ?>
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Код - не фантастика, но простой же. В чём проблема переделать на mysqli? Даже функции некоторые также называются... Запросы остаются теми же.
     
  3. megavolt217

    megavolt217 Новичок

    С нами с:
    16 мар 2015
    Сообщения:
    5
    Симпатии:
    0
    Проблема в том что пытался пытался пытался переделать, но все время не получается.
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Покажите ваш код.
     
  5. megavolt217

    megavolt217 Новичок

    С нами с:
    16 мар 2015
    Сообщения:
    5
    Симпатии:
    0
    Да я собственно этот код то что выше и переделывал, сейчас он у меня такой

    Код (Text):
    1. class TreeOX2 {
    2.  
    3.     private $_db = null;
    4.     private $_category_arr = array();
    5.  
    6.     public function __construct() {
    7.  
    8.                              global $user2;
    9.         //Подключаемся к базе данных, и записываем подключение в переменную _db
    10.          $this->_db  = $user2;
    11.         //$this->_db = new PDO("mysql:;megcms","localhost", $user, "");
    12.         //В переменную $_category_arr записываем все категории (см. ниже)
    13.         $this->_category_arr = $this->_getCategory();
    14.     }
    15.  
    16.     /**
    17.      * Метод читает из таблицы category все сточки, и
    18.      * возвращает двумерный массив, в котором первый ключ - id - родителя
    19.      * категории (parent_id)
    20.      * @return Array
    21.      */
    22.     private function _getCategory() {
    23.      global $user2;
    24.      global $mestopokaza;
    25.         $query = $this->_db->prepare("SELECT * FROM `meg_link`  WHERE `mest` = '".$mestopokaza."'"); //Готовим запрос
    26.         $query->execute(); //Выполняем запрос
    27.         //Читаем все строчки и записываем в переменную $result
    28.         $result = $query->fetchAll(PDO::FETCH_OBJ);
    29.         //Перелапачиваем массим (делаем из одномерного массива - двумерный, в котором
    30.         //первый ключ - parent_id)
    31.         $return = array();
    32.         foreach ($result as $value) { //Обходим массив
    33.             $return[$value->uid][] = $value;
    34.         }
    35.         return $return;
    36.     }
    37.  
    38.     /**
    39.      * Вывод дерева
    40.      * @param Integer $parent_id - id-родителя
    41.      * @param Integer $level - уровень вложености
    42.      */
    43.     public function outTree($parent_id, $level) {
    44.         if (isset($this->_category_arr[$parent_id])) { //Если категория с таким parent_id существует
    45.         echo'<ul class="vyp-menu">';
    46.             foreach ($this->_category_arr[$parent_id] as $value) { //Обходим ее
    47.                 /**
    48.                  * Выводим категорию
    49.                  *  $level * 25 - отступ, $level - хранит текущий уровень вложености (0,1,2..)
    50.                  */
    51.                 echo "<li><a href=''>" . $value->name . "</a>";
    52.                 $level++; //Увеличиваем уровень вложености
    53.                 //Рекурсивно вызываем этот же метод, но с новым $parent_id и $level
    54.                 $this->outTree($value->id, $level);
    55.                 echo'</li>';
    56.                 $level--; //Уменьшаем уровень вложености
    57.             }
    58.              echo'</ul>';
    59.         }
    60.     }
    61.  
    62. }
    63.  
    64.    $user = 'root';
    65.  $user2=new PDO("mysql:host=localhost;dbname=megcms", $user, $password);
    66.       function unregg($uu)
    67.     {
    68.         $mestopokaza=$uu;
    69.         $tree = new TreeOX2();
    70. $tree->outTree(0, 0);
    71.     }
    72.  $mestopokaza=2;
    73.  $rek1=unregg(1);
    Но как то очень неправильно весь скрипт использует mysqli а эта функция New PDO и функция не пойми какая, по сути думаю можно в одну все это сделать, но для начала главное что бы она просто c mysqli заработала.
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    В чём сложность переделки на mysqli? Я не понимаю. Запрос тот же, мануал по mysqli опубликован.

    Добавлено спустя 1 минуту 49 секунд:
    Покажите попытки переделки, если они были, или задайте конкретные вопросы
     
  7. megavolt217

    megavolt217 Новичок

    С нами с:
    16 мар 2015
    Сообщения:
    5
    Симпатии:
    0
    В недостаточных знаниях проблема(
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну остальное вы же как-то написали? Вам надо, чтоб за вас сделали - так это в другой раздел форума.
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Автор, "помогите сделать" подразумевает, что у вас что-то уже есть, но где-то почему-то не работает.
    "Не умею, а очень надо, сделайте за меня", это в соответствующий раздел, куда эта тема, вероятно, скоро попадет такими темпами.
     
  10. megavolt217

    megavolt217 Новичок

    С нами с:
    16 мар 2015
    Сообщения:
    5
    Симпатии:
    0
    Вот так у меня теперь работает
    Код (Text):
    1. class Tree {
    2.  
    3.         private $data;
    4.  
    5.         public function __construct($mestopokaza) {
    6.                                global $mysqli;
    7.                                global $prefix;
    8.  
    9.                         $query = $mysqli->query("SELECT * FROM `".$prefix."link`  WHERE `mest` = '".$mestopokaza."'  ORDER BY `position`"); //Готовим запрос
    10.         while($row = $query->fetch_assoc())
    11.             {
    12.  
    13.                 $data[] = $row;
    14.             }
    15.  
    16.                 $this->data = $data;
    17.         }
    18.  
    19.         public function outTree() {
    20.  
    21.                 $data = $this->getHierarchy($this->data);
    22.  
    23.                 $this->hierarchyOut($data, 0);
    24.         }
    25.  
    26.         private function getHierarchy($data) {
    27.                 $new_arr = array();
    28.  
    29.                 for ($i = 0, $c = count($data); $i < $c; $i++) {
    30.                         $new_arr[$data[$i]['uid']][] = $data[$i];
    31.                 }
    32.  
    33.                 return $new_arr;
    34.         }
    35.  
    36.         private function hierarchyOut($data, $parent = 0, $level = 0) {
    37.                 $arr = $data[$parent];
    38.                      echo'<ul class="vyp-menu">';
    39.                 for($i = 0; $i < count($arr); $i++) {
    40.  
    41.  
    42.                           echo "<li><a href=''>" . $arr[$i]['name'] . "</a>";
    43.                         $level++;
    44.  
    45.                         if(isset($data[$arr[$i]['id']])) {
    46.                                 $this->hierarchyOut($data, $arr[$i]['id'], $level);
    47.                         }
    48.                             echo'</li>';
    49.                         $level--;
    50.                 }
    51.                 echo'</ul>';
    52.         }
    53.  
    54.  
    55. }
    Вызывается это все у меня так

    Код (Text):
    1. $lin = new Tree(2);
    2. $lin->outTree();
    Как это сделать что бы это не вызывалось в том месте где вставленно а занести в переменную и выводить из нее
    $lin = new Tree(2);
    $per = $lin->outTree();
    это тоже отображается где она вписана, а не где я вставляю переменную $per
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну потому что у вас везде echo стоит. Чтоб было так, как вы хотите, два пути:
    1. Заменить echo на конкатенацию строк ($res .= "<ul>" и т.д.)
    2. Использовать ob_start()