|
|
|
PHP + MySQL: удалить с учетом иерархии...
|
|||
|---|---|---|---|
|
#18+
Доброе время суток, All! Помогите пожалуйста! Голова трещит, уже либо туплю окончательно, либо одно из двух... Есть в базе таблица - каталог с неограниченным (теоретически) возможным количеством подкаталогов... Организована примерно следующим образом (все лишнее для понимания удалено): id name level 1 <имя1> 0 2 <имя2> 0 6 <имя3> 0 7 <имя4> 1 8 <имя5> 1 13 <имя6> 8 12 <имя7> 8 ID - поле auto_increment просто счетчик, идентификатор каждого подкаталога... name - все понятно, просто название каталога/подкаталога... и level - это уровень иерархии (то есть где level = '0' - это корневой каталог, где level = '1' - это подкаталог, внутри каталога имеющего ID = 1) Вот так сумбурно написал, но смысл ясен, думаю... В моем примере каталог с именем "имя1" содержит 2 подкаталога: "имя4" и "имя5"... и в свою очередь подкаталог "имя5" содержит еще 2 подкаталога: "имя6" и "имя7"... Я удаляю главный каталог "имя1" и мне необходимо, чтобы все, что внутри тоже удалялось... Проблема в том, что глубина вложения не ограничена и может быть очень немалой! Каким образом на PHP мне лучше организовать удаление? Предлагайте алгоритмы/готовые куски кода - приветствуется ВСЁ! С базами работаю очень недавно, поэтому если что-то не так - прошу сильно не пинать! :) Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2006, 16:48 |
|
||
|
PHP + MySQL: удалить с учетом иерархии...
|
|||
|---|---|---|---|
|
#18+
неплохой ник :) а причем здесь php? это запрос к SQL серверу "УДАЛИТЬ ИЗ имя_таблицы ГДЕ level = 1" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2006, 16:57 |
|
||
|
PHP + MySQL: удалить с учетом иерархии...
|
|||
|---|---|---|---|
|
#18+
Duke1999, спасибо! :) Так понятное дело, что запрос к MySQL, но запрос-то я формирую из PHP скрипта... Так то ясно, что в моем случае сначала я должен получить в массив все IDшники через запрос (1) "SELECT * FROM table WHERE level=$id"($id - передаю потому что через переменную в PHP, это самый старший для удаления уровень)... Далее удалить старший уровень: (2) "DELETE FROM table WHERE id=$id" ... Затем аналогично пробегаться по всем элементам массива с полученными ID в результате первого запроса и т.д... Но еще раз повторюсь - вложений может быть до черта великого! :( Нужен некий цикл максимально оптимизированный... Я не могу больше уследить за всеми вложениями - поплыли мозги совершенно... Потому и прошу помощи!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2006, 17:54 |
|
||
|
PHP + MySQL: удалить с учетом иерархии...
|
|||
|---|---|---|---|
|
#18+
Удалять из таблицы можно указывая список значений: Код: plaintext 1. Таким образом нужно рекурсивно пройти по удаляемым подкаталогам и составить этот самый список: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Теперь осталось прикрутить подключение и отключение и вызывать RekurDel(<id удаляемого каталого>,<Ключевое поле>,<Название таблицы>). -------------------- Чтобы понять рекурсию, нужно понять рекурсию. (с) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2006, 18:56 |
|
||
|
PHP + MySQL: удалить с учетом иерархии...
|
|||
|---|---|---|---|
|
#18+
Только строчку Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2006, 18:58 |
|
||
|
PHP + MySQL: удалить с учетом иерархии...
|
|||
|---|---|---|---|
|
#18+
ВСЕ ОТЛИЧНО! Все супер! ЭТО ТО, что мне нужно было... ОГРОМНОЕ спасибо... Единственное - не хочет у меня MySQL выполнять $query = "DELETE FROM table WHERE `id` IN ($list)"; хотя в $list -все как нужно, переписаны id через запятую... Они не удаляются и все! :( Почему такое может быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2006, 11:57 |
|
||
|
PHP + MySQL: удалить с учетом иерархии...
|
|||
|---|---|---|---|
|
#18+
какую ошибку выдает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2006, 13:43 |
|
||
|
PHP + MySQL: удалить с учетом иерархии...
|
|||
|---|---|---|---|
|
#18+
может id без кавычек попробовать... Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2006, 14:39 |
|
||
|
PHP + MySQL: удалить с учетом иерархии...
|
|||
|---|---|---|---|
|
#18+
Пробовал и с кавычками и без кавычек - результиат тот же... Ошибку НЕ выдает! Все проглатывает, но из таблицы ничего не удаляется! :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2006, 14:56 |
|
||
|
PHP + MySQL: удалить с учетом иерархии...
|
|||
|---|---|---|---|
|
#18+
mysql_query($query) or die(mysql_error()); есть ошибка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2006, 15:06 |
|
||
|
PHP + MySQL: удалить с учетом иерархии...
|
|||
|---|---|---|---|
|
#18+
Чтоб очистить совесть рекомендую заменить Код: plaintext 1. 2. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2006, 15:22 |
|
||
|
PHP + MySQL: удалить с учетом иерархии...
|
|||
|---|---|---|---|
|
#18+
Подумалось об использовании CONTRAINT с ON DELETE CASCADE... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2006, 18:30 |
|
||
|
PHP + MySQL: удалить с учетом иерархии...
|
|||
|---|---|---|---|
|
#18+
Всем спасибо! :) Мой косяк - плохо соображаю что делаю уже... Выполняю $query = "DELETE FROM table WHERE id IN ($list)"; но это же не запрос, просто присвоил переменной $query и все (поэтому и нет ошибки MySQL никакой)! :) Просто конструкция "mysql_query($query) or die(mysql_error());" вынесена в отедльную функцию "SQLResult" - и поэтому надо писать $query = SQLResult("DELETE FROM table WHERE id IN ($list)"); что я пропустил мимо! :) Сам не пойму, как просмотрел... Простите за невнимательность! Все работает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2006, 18:40 |
|
||
|
PHP + MySQL: удалить с учетом иерархии...
|
|||
|---|---|---|---|
|
#18+
А всё таки, подумайте о предложенном мною варианте. Вот пример: Создаём таблицу Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2006, 19:02 |
|
||
|
PHP + MySQL: удалить с учетом иерархии...
|
|||
|---|---|---|---|
|
#18+
Как я поминаю, DocAl, Вы предлагаете сделать таблицу ссылающую на саму себя? Если да и это действительно работает, то снимаю перед Вами шляпу. Такое решение получается перекладывает обязанность искать подчиненные узлы в удаляемом узле полностью на СУБД, а не на скрипт, которому приходится делать множество рекурсивных обращений к таблице. Пожалуй такое решение стоит считать единсвенно правильным ! =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2006, 20:23 |
|
||
|
PHP + MySQL: удалить с учетом иерархии...
|
|||
|---|---|---|---|
|
#18+
DocAl очень красивое решение, но мне пока рановато видимо! Говорю же - с базами недавно работаю! Может что почитать посоветуешь редкое и полезное? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2006, 21:33 |
|
||
|
PHP + MySQL: удалить с учетом иерархии...
|
|||
|---|---|---|---|
|
#18+
Robert Tappan MorisКак я поминаю, DocAl, Вы предлагаете сделать таблицу ссылающую на саму себя? Если да и это действительно работает, то снимаю перед Вами шляпу. Такое решение получается перекладывает обязанность искать подчиненные узлы в удаляемом узле полностью на СУБД, а не на скрипт, которому приходится делать множество рекурсивных обращений к таблице. Пожалуй такое решение стоит считать единсвенно правильным ! =) Именно так. Единственное, что нельзя сделать таким способом полностью автоматически, это изменение id верхней записи с автоматическим обновлением parent у всех, ей принадлежащих. Но, во-первых, сложно представить себе ситуацию, в которой это могло бы практически потребоваться, во-вторых, реализовать это можно простым запросом, а учитывая, что InnoDB поддерживает транзакции, легко сделать так, чтобы ссылочная целостность при таком изменении также контролировалась движком базы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2006, 06:24 |
|
||
|
PHP + MySQL: удалить с учетом иерархии...
|
|||
|---|---|---|---|
|
#18+
Тупой!DocAl очень красивое решение, но мне пока рановато видимо! Говорю же - с базами недавно работаю! Может что почитать посоветуешь редкое и полезное? А вот посоветовать почитать что-либо, кроме официальной документации на сайте, не могу...( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2006, 06:27 |
|
||
|
PHP + MySQL: удалить с учетом иерархии...
|
|||
|---|---|---|---|
|
#18+
DocAl Именно так. Единственное, что нельзя сделать таким способом полностью автоматически, это изменение id верхней записи с автоматическим обновлением parent у всех, ей принадлежащих. Но, во-первых, сложно представить себе ситуацию, в которой это могло бы практически потребоваться, во-вторых, реализовать это можно простым запросом, а учитывая, что InnoDB поддерживает транзакции, легко сделать так, чтобы ссылочная целостность при таком изменении также контролировалась движком базы. Пара вопросов: Простите, но зачему изменять поле id верхней записи, ведь поле автоинкрементное? Разве что сортировка при выборке делается по этому полю, но это было бы не правильно, если важен порядок записей. На мой взглять лучше добавить поле, по которому будут сортироваться записи (и редактировать проще, и головняка никакого). Даже если предположить необходимость изменять поле id верхней записи можно сделать за 3 шага без проблем со ссылочной целостностью: 1) Вставлять в таблицу новую "верхнюю" запись (копию изменяемой). 2) Одним update'ом перевести все дочерние записи на вставленную. 3) Прибить оригинал записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2006, 12:02 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=33517182&tid=1476844]: |
0ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
177ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 490ms |

| 0 / 0 |
