radiocity
Новичок
Здравствуйте. Существует задача удаления "папки" в каталоге товаров и услуг со всем содержимым. Все данные хранятся в БД на MySQL. Удаление вызывается GET запросом с указанием ID цели. Для сокращения кол-ва запросов все параметры папок из таблицы копируются в массив-буфер.
Подскажите, пожалуйста, где может быть ошибка? Как заставить код функционировать?
Таблица mysql, содержащая каталоги:
---------------------------------
ID (int) - уникальный идентификатор
PID (int) - иднтификатор родителя
data (text) - прочая информация
Переменные:
----------------------------------
$ecmode - тип операции (в данном случае удаление)
$_SITE['DB_PREFIX'] - некоторый префикс бд (s_)
$ecdir - id папки, которую удаляем
$ecbuffer = array (); - буфер со значениями каталогов
$ecdbuffer[] = array(); - буфер, удаляемых элементов, который в конечном счете чистится
Функция ecdirdrop():
В итоге страница виснет и удаление не происходит. Предполагаю, что ошибка в рекурсии где то =(
Подскажите, пожалуйста, где может быть ошибка? Как заставить код функционировать?
Таблица mysql, содержащая каталоги:
---------------------------------
ID (int) - уникальный идентификатор
PID (int) - иднтификатор родителя
data (text) - прочая информация
Переменные:
----------------------------------
$ecmode - тип операции (в данном случае удаление)
$_SITE['DB_PREFIX'] - некоторый префикс бд (s_)
$ecdir - id папки, которую удаляем
$ecbuffer = array (); - буфер со значениями каталогов
$ecdbuffer[] = array(); - буфер, удаляемых элементов, который в конечном счете чистится
PHP:
<?php
# DELETE FOLDER:
if ($ecmode==5)
{
$sql = "SELECT id, pid FROM ".$_SITE['DB_PREFIX']."gCatalogGroups ORDER BY id";
$ecfbuffer_sz =0;
if ($rowq=mysql_query($sql))
{
# создаем буфер вида: $ecbuffer[<id>] = <pid>
while ($row = mysql_fetch_object($rowq))
{
$ecfbuffer[$row->id] = $row->pid;
$ecfbuffer_sz++;
}
mysql_free_result($rowq);
# ищем ключик в буфере
if (array_key_exists($ecdir, $ecfbuffer)){
@oops('dir exists');
ecdirdrop($ecdir, $ecfbuffer);
@oops('set parent');
for ($i=0; $i<count($ecdbuffer); $i++)
{
# удаляем "файлы"
$sql="DELETE FROM ".$_SITE['DB_PREFIX']."gCatalogGoodies WHERE pid='".$ecdbuffer[$i]."'";
mysql_query($sql);
# удаляем "папки"
$sql="DELETE FROM ".$_SITE['DB_PREFIX']."gCatalogGroups WHERE pid='".$ecdbuffer[$i]."'";
mysql_query($sql);
}
$ecdir = $ecfbuffer[$ecdir];
}
else
{
@oops('Del: target folder does not exists.');
$ecdir = 0;
}
}
else
{
@oops('Del: buffer is empty');
}
}
?>
PHP:
<?php
function ecdirdrop($fid, $fbuf){
# Пока есть наследник FindFirstChild мы ищем конец
while(($ecdd=array_search($fid,$fbuf))&&($ecdd!==NULL)){
if ($ecdd!=NULL)
ecdirdrop($ecdd,$fbuf);
oops(array_search($fid,$fbuf));
} #while
# Когда конечный каталог найден и у него нет наследника, мы его чистим от файлов и удаляем
$ecdbuffer[] = $fid;
# При этому станавливаем его ключ в буфере в минус, чтобы не находить
$fbuf[$fid]=1000000;
@oops('Удалена папка');
}
?>