Помощь в коде

Sav2907

Новичок
Привет, есть такой код для дерева категорий
Код:
INSERT INTO `categories` (`id`, `parent_id`, `name`) VALUES
(1, 0, 'Раздел 1'),
(2, 0, 'Раздел 2'),
(3, 0, 'Раздел 3'),
(4, 1, 'Раздел 1.1'),
(5, 1, 'Раздел 1.2'),
(6, 4, 'Раздел 1.1.1'),
(7, 2, 'Раздел 2.1'),
(8, 2, 'Раздел 2.2'),
(9, 3, 'Раздел 3.1');
Код:
//Выбираем данные из БД
$result=mysql_query("SELECT * FROM  categories");
//Если в базе данных есть записи, формируем массив
if   (mysql_num_rows($result) > 0){
    $cats = array();
//В цикле формируем массив разделов, ключом будет id родительской категории, а также массив разделов, ключом будет id категории
    while($cat =  mysql_fetch_assoc($result)){
        $cats_ID[$cat['id']][] = $cat;
        $cats[$cat['parent_id']][$cat['id']] =  $cat;
    }
}
Код:
function build_tree($cats,$parent_id,$only_parent = false){
    if(is_array($cats) and isset($cats[$parent_id])){
        $tree = '<ul>';
        if($only_parent==false){
            foreach($cats[$parent_id] as $cat){
                $tree .= '<li>'.$cat['name'].' #'.$cat['id'];
                $tree .=  build_tree($cats,$cat['id']);
                $tree .= '</li>';
            }
        }elseif(is_numeric($only_parent)){
            $cat = $cats[$parent_id][$only_parent];
            $tree .= '<li>'.$cat['name'].' #'.$cat['id'];
            $tree .=  build_tree($cats,$cat['id']);
            $tree .= '</li>';
        }
        $tree .= '</ul>';
    }
    else return null;
    return $tree;
}
echo build_tree($cats,0);
Задача: если parent_id = 4, а родителя с id =4 нет, тогда вывести эту строку как будто бы parent_id = 0
 

fixxxer

К.О.
Партнер клуба
Это неправильная постановка задачи. Задачу надо ставить так, чтобы подобная ситуация (неконсистентные данные) была невозможна.

1) 0 такое же число как и 4. "Отсутствие данных" в базе обозначается не 0, -1 или 999, а через специально придуманный для этого NULL.
2) обнуление parent_id у деток при удалении родителя проще всего делается автоматичски средствами базы: foreign key + on delete set null

И назови тему нормально, про "помощь в коде" тут практически каждая тема.
 

scorpion-ds

Новичок
Это неправильная постановка задачи. Задачу надо ставить так, чтобы подобная ситуация (неконсистентные данные) была невозможна.
Я думаю ТС взял задачу из методички в своем учебном заведении, не знаю как у него но в моем заведении не все подобные задачи были адекватными с точки зрения логики и используемой технологии. К примеру, если ТС заявит, что использовал бы внешние ключи, ему бы сказали, что внешних ключей мы еще не проходили, а значит ответ неправильный.

Я на практике на 5 курсе, писал задачи для методички преподавателя, по MSSQL при том, что до того (и после) я никогда не сталкивался с этой СУБД, мы тогда вообще общими усилиями (несколько человек из группы) написали задачи ко всей методичке, я думаю случай не исключение ...
 

Sav2907

Новичок
Это неправильная постановка задачи. Задачу надо ставить так, чтобы подобная ситуация (неконсистентные данные) была невозможна.

1) 0 такое же число как и 4. "Отсутствие данных" в базе обозначается не 0, -1 или 999, а через специально придуманный для этого NULL.
2) обнуление parent_id у деток при удалении родителя проще всего делается автоматичски средствами базы: foreign key + on delete set null

И назови тему нормально, про "помощь в коде" тут практически каждая тема.
Такая ситуация бывает когда мне нужно не все данные, и тут parent_id = 4. Тот код построен так что если нет родителя с id =4 и parent_id = 0, тогда данные не показывает, а нужно что бы показывало
 

Sav2907

Новичок
Например
$result=mysql_query("SELECT * FROM categories" WHERE id != '1');
Тодга ID 4 и 5 не показывает, а нужно что бы показывало
 
Сверху