Только недавно начал заниматься PHP (1 неделя). Вопросы: 1) Как вообще реализация каталога (на использование класса прошу внимания не обращать он тут нафиг не нужен) 2) Прошу помочь советом в оформлении вывода, для этого я использую функцию(см в самом низу) 3) Ну и общая критика, как лучше было бы сделать. Структура таблиц. Таблицa catalog. Поля id INT AUTO_INCREMENT, parent_id INT Таблицa directory. Поля id INT, name VARCHAR(200) Таблицa goods(Таблицу товаров пока заполняю на уровне таблицы 'directory', то есть неполностью) Поля id INT, name VARCHAR(200), img VARCHAR(200), big_img VARCHAR(200), description TEXT PHP: <?php class Catalog{ public function __construct() { } /* Набор функций для работы с каталогом */ /* Добавляем новый элемент */ public function addElement($name, $parent_id = 0, $type = 'd') { $tbl = TBL_DIRECTORY; if ($type == 'goods') { $type = 'g'; $tbl = TBL_GOODS; } else { $type = 'd'; } // Step 1. $sql = "INSERT INTO `".TBL_CATALOG."` (`parent_id`, `type`, `ifopen`) VALUES(%d, '%s', 0)"; $sql = sprintf($sql, $parent_id, $type); mysql_query($sql) or die(mysql_error()); $new_id = mysql_insert_id(); // Step 2. $sql_sub = "INSERT INTO `".$tbl."` (`id`, `name`) VALUES(%d, '%s')"; $sql_sub = sprintf($sql_sub, $new_id, mysql_escape_string($name)); mysql_query($sql_sub) or die(mysql_error()); } // если inserter установлен в false удаляем выбранный id и дочерний public function remElement($id, $inserted) { $search_array = array(); $this->get_hierarchy($id, $search_array); // проверяем в каком режиме удалять: // 1) дочерние объекты + $id; (false) // 2) дочерние объекты; (true) if ($inserted) { array_shift($search_array); } $tmp_array = array(); //здесь будем хранить временные данные, после выборки // Шаг 1. Формирование временного массива if (count($search_array) > 0) { foreach($search_array as $value) { $sql = "SELECT * FROM `".TBL_CATALOG."` WHERE `id` = %d"; $sql = sprintf($sql, $value); $result = mysql_query($sql) or die(mysql_error()); $tmp_array[] = mysql_fetch_assoc($result); } $tbl = TBL_DIRECTORY; foreach ($tmp_array as $value) { $sql = "DELETE FROM `".TBL_CATALOG."` WHERE `id` = %d"; $sql = sprintf($sql, $value['id']); mysql_query($sql) or die(mysql_error()); if ($value['type'] == 'g') { $tbl = TBL_GOODS; } $sql = "DELETE FROM `".$tbl."` WHERE `id` = %d"; $sql = sprintf($sql, $value['id']); mysql_query($sql) or die(mysql_error()); } } } public function renElement($id, $new_name) { $sql = "SELECT `type` FROM `".TBL_CATALOG."` WHERE `id` = %d"; $sql = sprintf($sql, $id); $result = mysql_query($sql) or die(mysql_error()); $row = mysql_fetch_assoc($result); $tbl = TBL_DIRECTORY; if ($row['type'] == 'g') { $tbl = TBL_GOODS; } $sql = "UPDATE `".$tbl."` SET `name` = '%s' WHERE `id` = %d"; $sql = sprintf($sql, mysql_escape_string($new_name), $id); mysql_query($sql) or die(mysql_error()); } public function movElement($id, $new_parent_id) { if ($id != $new_parent_id) { $search_array = $this->get_hierarchy($id); if (!in_array($new_parent_id, $search_array)) { $sql = "UPDATE `".TBL_CATALOG."` SET `parent_id` = %d WHERE `id` = %d"; $sql = sprintf($sql, $new_parent_id, $id); mysql_query($sql) or die(mysql_error()); } } } /* Набор алгоритмическиъ функций */ /* Получаем всех родителей для текущего $id */ public function get_hierarchy_up($id = 0, &$tmp_array) { $sql = "SELECT * FROM `".TBL_CATALOG."` WHERE `id` = %d"; $sql = sprintf($sql, $id); $result = mysql_query($sql) or die(mysql_error()); if ($row = mysql_fetch_assoc($result)) { $tmp_array[] = $row['id']; $this->get_hierarchy_up($row['parent_id'], $tmp_array); } else { $tmp_array[] = 0; } } public function get_hierarchy($id = 0, &$tmp_array) { //static $tmp_array = array(); if (count($tmp_array) == 0) { $tmp_array[0] = $id; } $sql = "SELECT * FROM `".TBL_CATALOG."` WHERE `parent_id` = %d"; $sql = sprintf($sql, $id, $id); $result = mysql_query($sql) or die(mysql_error()); if (mysql_num_rows($result) > 0) { while ($row = mysql_fetch_array($result)) { $tmp_array[] = $row['id']; $this->get_hierarchy($row['id'], $tmp_array); } } //return $tmp_array; } // Получаем вложенный массив имитирующий структуру каталога public function get_cat($id = 0) { $up_array = array(); $this->get_hierarchy_up($id, $up_array); $tmp_array = array(); foreach($up_array as $value) { $sql = "SELECT * FROM `".TBL_CATALOG."` WHERE `parent_id` = %d"; $sql = sprintf($sql, $value); $result = mysql_query($sql) or die(mysql_error()); while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { $tbl = TBL_DIRECTORY; if ($row['type'] == 'g') { $tbl = TBL_GOODS; } $sql = "SELECT * FROM `".$tbl."` WHERE `id` = %d"; $sql = sprintf($sql, $row['id']); $sub_result = mysql_query($sql) or die(mysql_error()); $sub_row = mysql_fetch_assoc($sub_result); $tmp_array[$value][] = $row['id'].'/'.$row['type'].'/'.$sub_row['name']; } } $tmp_array_keys = array_keys($tmp_array); $n = count($tmp_array_keys) - 2; for ($i = 0; $i <= $n; $i++){ $cur_tmp_index_p = $tmp_array[$tmp_array_keys[$i+1]]; $cur_tmp_index = $tmp_array_keys[$i]; settype($cur_tmp_index_p, 'array'); // Для того чтобы убрать Warning в ниже вызванных функциях // ругается на то что $cur_tmp_index_p не массив =/ $tmp_index = array_search($cur_tmp_index, $cur_tmp_index_p); $tail_array = array_splice($cur_tmp_index_p, $tmp_index+1); $head_array = $cur_tmp_index_p; $end_array = array_merge($head_array, array($tmp_array[$cur_tmp_index]), $tail_array); $tmp_array[$tmp_array_keys[$i+1]] = $end_array; } return $tmp_array[0]; } } // данная функция выводит каталог товаров одновременно выводиться только одна ветка. function show_catalog($in_array) { echo '<ul>'; foreach($in_array as $key => $value) { if (is_array($value)) { $this->show_catalog($value); } else { $id_type_name = explode("/", $value); $path = 'cat'; if ($id_type_name[1] == 'g') { $path = 'goods'; }; $link = "<li><a href=\"http://localhost/".$id_type_name[0]."\">".$id_type_name[2]."</a></li>"; print $link.'<br/>'; } } echo '</ul>'; }?>