Помогите пожалуйста сделать функцию дерева категорий есть код с использованием New PDO А как мне сделать это же с использованием MYSQLI Вот пример: Код (Text): <?php /** * PHP5 (ООП) * Постоение дерева (меню неограниченной вложености) * @author дизайн студия ox2.ru */ class TreeOX2 { private $_db = null; private $_category_arr = array(); public function __construct() { //Подключаемся к базе данных, и записываем подключение в переменную _db $this->_db = new PDO("mysql:dbname=ox2.ru-test-base;host=localhost", "root", ""); //В переменную $_category_arr записываем все категории (см. ниже) $this->_category_arr = $this->_getCategory(); } /** * Метод читает из таблицы category все сточки, и * возвращает двумерный массив, в котором первый ключ - id - родителя * категории (parent_id) * @return Array */ private function _getCategory() { $query = $this->_db->prepare("SELECT * FROM `category`"); //Готовим запрос $query->execute(); //Выполняем запрос //Читаем все строчки и записываем в переменную $result $result = $query->fetchAll(PDO::FETCH_OBJ); //Перелапачиваем массим (делаем из одномерного массива - двумерный, в котором //первый ключ - parent_id) $return = array(); foreach ($result as $value) { //Обходим массив $return[$value->parent_id][] = $value; } return $return; } /** * Вывод дерева * @param Integer $parent_id - id-родителя * @param Integer $level - уровень вложености */ public function outTree($parent_id, $level) { if (isset($this->_category_arr[$parent_id])) { //Если категория с таким parent_id существует foreach ($this->_category_arr[$parent_id] as $value) { //Обходим ее /** * Выводим категорию * $level * 25 - отступ, $level - хранит текущий уровень вложености (0,1,2..) */ echo "<div style='margin-left:" . ($level * 25) . "px;'>" . $value->name . "</div>"; $level++; //Увеличиваем уровень вложености //Рекурсивно вызываем этот же метод, но с новым $parent_id и $level $this->outTree($value->id, $level); $level--; //Уменьшаем уровень вложености } } } } $tree = new TreeOX2(); $tree->outTree(0, 0); //Выводим дерево ?>
Код - не фантастика, но простой же. В чём проблема переделать на mysqli? Даже функции некоторые также называются... Запросы остаются теми же.
Да я собственно этот код то что выше и переделывал, сейчас он у меня такой Код (Text): class TreeOX2 { private $_db = null; private $_category_arr = array(); public function __construct() { global $user2; //Подключаемся к базе данных, и записываем подключение в переменную _db $this->_db = $user2; //$this->_db = new PDO("mysql:;megcms","localhost", $user, ""); //В переменную $_category_arr записываем все категории (см. ниже) $this->_category_arr = $this->_getCategory(); } /** * Метод читает из таблицы category все сточки, и * возвращает двумерный массив, в котором первый ключ - id - родителя * категории (parent_id) * @return Array */ private function _getCategory() { global $user2; global $mestopokaza; $query = $this->_db->prepare("SELECT * FROM `meg_link` WHERE `mest` = '".$mestopokaza."'"); //Готовим запрос $query->execute(); //Выполняем запрос //Читаем все строчки и записываем в переменную $result $result = $query->fetchAll(PDO::FETCH_OBJ); //Перелапачиваем массим (делаем из одномерного массива - двумерный, в котором //первый ключ - parent_id) $return = array(); foreach ($result as $value) { //Обходим массив $return[$value->uid][] = $value; } return $return; } /** * Вывод дерева * @param Integer $parent_id - id-родителя * @param Integer $level - уровень вложености */ public function outTree($parent_id, $level) { if (isset($this->_category_arr[$parent_id])) { //Если категория с таким parent_id существует echo'<ul class="vyp-menu">'; foreach ($this->_category_arr[$parent_id] as $value) { //Обходим ее /** * Выводим категорию * $level * 25 - отступ, $level - хранит текущий уровень вложености (0,1,2..) */ echo "<li><a href=''>" . $value->name . "</a>"; $level++; //Увеличиваем уровень вложености //Рекурсивно вызываем этот же метод, но с новым $parent_id и $level $this->outTree($value->id, $level); echo'</li>'; $level--; //Уменьшаем уровень вложености } echo'</ul>'; } } } $user = 'root'; $user2=new PDO("mysql:host=localhost;dbname=megcms", $user, $password); function unregg($uu) { $mestopokaza=$uu; $tree = new TreeOX2(); $tree->outTree(0, 0); } $mestopokaza=2; $rek1=unregg(1); Но как то очень неправильно весь скрипт использует mysqli а эта функция New PDO и функция не пойми какая, по сути думаю можно в одну все это сделать, но для начала главное что бы она просто c mysqli заработала.
В чём сложность переделки на mysqli? Я не понимаю. Запрос тот же, мануал по mysqli опубликован. Добавлено спустя 1 минуту 49 секунд: Покажите попытки переделки, если они были, или задайте конкретные вопросы
Автор, "помогите сделать" подразумевает, что у вас что-то уже есть, но где-то почему-то не работает. "Не умею, а очень надо, сделайте за меня", это в соответствующий раздел, куда эта тема, вероятно, скоро попадет такими темпами.
Вот так у меня теперь работает Код (Text): class Tree { private $data; public function __construct($mestopokaza) { global $mysqli; global $prefix; $query = $mysqli->query("SELECT * FROM `".$prefix."link` WHERE `mest` = '".$mestopokaza."' ORDER BY `position`"); //Готовим запрос while($row = $query->fetch_assoc()) { $data[] = $row; } $this->data = $data; } public function outTree() { $data = $this->getHierarchy($this->data); $this->hierarchyOut($data, 0); } private function getHierarchy($data) { $new_arr = array(); for ($i = 0, $c = count($data); $i < $c; $i++) { $new_arr[$data[$i]['uid']][] = $data[$i]; } return $new_arr; } private function hierarchyOut($data, $parent = 0, $level = 0) { $arr = $data[$parent]; echo'<ul class="vyp-menu">'; for($i = 0; $i < count($arr); $i++) { echo "<li><a href=''>" . $arr[$i]['name'] . "</a>"; $level++; if(isset($data[$arr[$i]['id']])) { $this->hierarchyOut($data, $arr[$i]['id'], $level); } echo'</li>'; $level--; } echo'</ul>'; } } Вызывается это все у меня так Код (Text): $lin = new Tree(2); $lin->outTree(); Как это сделать что бы это не вызывалось в том месте где вставленно а занести в переменную и выводить из нее $lin = new Tree(2); $per = $lin->outTree(); это тоже отображается где она вписана, а не где я вставляю переменную $per
Ну потому что у вас везде echo стоит. Чтоб было так, как вы хотите, два пути: Заменить echo на конкатенацию строк ($res .= "<ul>" и т.д.) Использовать ob_start()