За последние 24 часа нас посетили 62114 программистов и 1791 робот. Сейчас ищут 919 программистов ...

Пару вопросов по php: дерево в mysql, работа с zip_read

Тема в разделе "PHP для новичков", создана пользователем alexei, 5 авг 2008.

  1. alexei

    alexei Активный пользователь

    С нами с:
    25 июл 2006
    Сообщения:
    46
    Симпатии:
    0
    Адрес:
    Россия, Нижневартовск
    Доброго времени суток Уважаемые.
    1й вопрос скорей всего относится к mysql, но все же мне кажется реализация его только на mysql невозможна, начну:
    В общем имею следующую таблицу, вот такой вот структуры:
    id name parent_id
    1 Category 0
    2 SubCat 1
    3 SubSubCat 2
    Надо вывести эти данные деревом, т.е. в таком порядке
    Category
    SubCat
    SubSubCat
    При этом мы знаем ID только последней записи, остальные беруться от parent_id, возможно ли такое реализовать посредствам только mysql, т.е. одним запросом или несколькими вложеными запросами? Если нет, то как это сделать с помощью php, я так понимаю тут прийдется прибегнуть к рекурсии?

    2й вопрос по поводу распаковки zip архива на сервере, использую для примера следующий код:
    PHP:
    1.  
    2. <?php
    3. $zip = new ZipArchive;
    4. if ($zip->open('test.zip') === TRUE) {
    5.     $zip->extractTo('/my/destination/dir/');
    6.     $zip->close();
    7.     echo 'ok';
    8. } else {
    9.     echo 'failed';
    10. }
    11. ?>
    при это файлы рапаковываются, но если есть существующие то не заменяются, как сделать чтобы они заменялись ?
     
  2. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    1) Использовать другой способ хранения дерева. Тогда можно будет обойтись только 1 запросом. В данном случае придётся загрузить всё дерево и прибегнуть к рекурсии.
     
  3. alexei

    alexei Активный пользователь

    С нами с:
    25 июл 2006
    Сообщения:
    46
    Симпатии:
    0
    Адрес:
    Россия, Нижневартовск
    По подробней с этого места пожалуйста :)
     
  4. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  5. alexei

    alexei Активный пользователь

    С нами с:
    25 июл 2006
    Сообщения:
    46
    Симпатии:
    0
    Адрес:
    Россия, Нижневартовск
    спасибо конечно за мануал, пока его не читал, позже прочту, а пока что как вариант сделал функцию рекурсии:
    PHP:
    1.  
    2. <?php
    3. function obhod($id){
    4. $query = "SELECT * FROM `cat` WHERE `id`=$id";
    5. $result = mysql_query($query);
    6. $data = mysql_fetch_array($result);
    7. if ($data['parent'] == 0){
    8. echo $data['name']; // Выводим главную категорию
    9. return 0;
    10. }
    11. else{
    12. obhod($data['parent']);
    13. echo " -> ".$data['name']; // Выводим под категории
    14. }
    15. }
    16.  
    17. obhod(3); // Вызываем функцию с id 3
    18. ?>
    19.  
    На выходе получим следующее:
    Код (Text):
    1.  
    2. Category -> SubCat -> SubSubCat
    Жду Ваших комментариев
     
  6. alexei

    alexei Активный пользователь

    С нами с:
    25 июл 2006
    Сообщения:
    46
    Симпатии:
    0
    Адрес:
    Россия, Нижневартовск
    по поводу zip может кто помочь а ?
     
  7. Vitas

    Vitas Активный пользователь

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    Sergey89, можно же обойтись одним запросом. Просто сортируем по pid. Или я не прав?
     
  8. Vitas

    Vitas Активный пользователь

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    Можно выбрать все дерево одним запросом:
    PHP:
    1. <?
    2.  
    3. // Выбираем все узлы
    4. $res = mysql_query('SELECT * FROM nodes ORDER BY pid ASC, name DESC');
    5.  
    6. $order = $nodes = array();
    7. while ($node = mysql_fetch_object($res)) {
    8.     // Если родитель есть, то наш уровень будет родительский + 1
    9.     $node->level = isset($nodes[$node->pid]) ? $nodes[$node->pid]->level + 1 : 0;
    10.     // Добавляем узел в список
    11.     $nodes[$node->id] = $node;
    12.    
    13.     // Находим новую позицию для нашего узла:
    14.     // Ищем родителя
    15.     $parent_pos = array_search($node->pid, $order);
    16.     // Если родитель есть, то тавим сразу после него, если нет, то в начало списка
    17.     $pos = $parent_pos !== false ? $parent_pos + 1 : 0;
    18.    
    19.     // Вставляем номер узла в $order
    20.     $order = array_merge(array_splice($order, 0, $pos), array($node->id), $order);
    21. }
    22.  
    23. foreach ($order as $id) {
    24.     echo str_repeat("&nbsp;", $nodes[$id]->level * 4) . " " . $nodes[$id]->name . "<br />\n";
    25. }
    Где, $order — порядок отображения узлов, $nodes — их данные.