|
|
|
| Всем привет
Всем известная книга "PHP. Практика создания Web-сайтов (2 издание)" содержит исходные коды к тому сайту, который и разбирается книге (приведены ниже). Разбираю модуль СМС, структура сайта. Так вот, есть возможность создавать неограниченное множество подразделов, а удаляет неверно. Подробней, если есть например такая вот иерархия:
Раздел 1
Подраздел 1
Подраздел 1
Если удалить Подраздел 1, все ок, а вот если Раздел 1, то остаются все ниж лежащие подразделы, статьи, параграфы и все все все... Может кто знает исправленные материалы к этому диску? или как лучше сделать одной большой рекурсией?
CREATE TABLE system_catalog (
id_catalog int(11) NOT NULL auto_increment,
`name` tinytext NOT NULL,
description text NOT NULL,
keywords tinytext NOT NULL,
modrewrite tinytext NOT NULL,
pos int(11) NOT NULL default '0',
hide enum('show','hide') NOT NULL default 'show',
id_parent int(11) NOT NULL default '0',
PRIMARY KEY (id_catalog)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
// Одна из таблиц
<?php
////////////////////////////////////////////////////////////
// 2005-2008 (C) Кузнецов М.В., Симдянов И.В.
// PHP. Практика создания Web-сайтов
// IT-студия SoftTime
// http://www.softtime.ru - портал по Web-программированию
// http://www.softtime.biz - коммерческие услуги
// http://www.softtime.mobi - мобильные проекты
// http://www.softtime.org - некоммерческие проекты
////////////////////////////////////////////////////////////
// Выставляем уровень обработки ошибок
// (http://www.softtime.ru/info/articlephp.php?id_article=23)
error_reporting(E_ALL & ~E_NOTICE);
// Устанавливаем соединение с базой данных
require_once("../../config/config.php");
// Подключаем блок авторизации
require_once("../utils/security_mod.php");
// Подключаем SoftTime FrameWork
require_once("../../config/class.config.dmn.php");
// Защита от SQL-инъекции
$_GET['id_catalog'] = intval($_GET['id_catalog']);
try
{
// Извлекаем все изображения, принадлежащие каталогу и удаляем их
$query = "SELECT * FROM $tbl_paragraph_image
WHERE id_catalog=$_GET[id_catalog]";
$img = mysql_query($query);
if(!$img)
{
throw new ExceptionMySQL(mysql_error(),
$query,
"Ошибка при извлечении
параметров изображения");
}
if(mysql_num_rows($img))
{
while($image = mysql_fetch_array($img))
{
if(file_exists("../../".$image['big']))
@unlink("../../".$image['big']);
if(file_exists("../../".$image['small']))
@unlink("../../".$image['small']);
}
}
// Формируем и выполняем SQL-запрос на удаление изображений
$query = "DELETE FROM $tbl_paragraph_image
WHERE id_catalog=$_GET[id_catalog]";
if(!mysql_query($query))
{
throw new ExceptionMySQL(mysql_error(),
$query,
"Ошибка при удалении позиции");
}
// Формируем и выполняем SQL-запрос на удаление параграфов
$query = "DELETE FROM $tbl_paragraph
WHERE id_catalog=$_GET[id_catalog]";
if(!mysql_query($query))
{
throw new ExceptionMySQL(mysql_error(),
$query,
"Ошибка при удалении позиции");
}
// Формируем и выполняем SQL-запрос на удаление позиции каталога
$query = "DELETE FROM $tbl_position
WHERE id_catalog=$_GET[id_catalog]";
if(!mysql_query($query))
{
throw new ExceptionMySQL(mysql_error(),
$query,
"Ошибка при удалении позиции");
}
// Формируем и выполняем SQL-запрос на удаление каталога
$query = "DELETE FROM $tbl_catalog
WHERE id_catalog=$_GET[id_catalog]
LIMIT 1";
if(!mysql_query($query))
{
throw new ExceptionMySQL(mysql_error(),
$query,
"Ошибка при удалении каталога");
}
header("Location: index.php?id_parent=$_GET[id_parent]&page=$_GET[page]");
}
catch(ExceptionMySQL $exc)
{
require("../utils/exception_mysql.php");
}
?>
|
| |
|
|
|
|
|
|
|
для: ДобрыйУхх
(17.05.2010 в 19:17)
| | Нужно получить список всех подразделов текущего раздела при помощи функции
<?php
// Возвращает список подчинённых каталогов
function get_subcatalog_list($id_catalog = 0, $tbl = '')
{
// Объявляем имена таблиц глобальными
global $tbl_catalog;
// Предотвращаем SQL-инъекцию
$id_catalog = intval($id_catalog);
if((empty($tbl))
{
$tbl = $tbl_catalog;
}
$query = "SELECT id_catalog FROM $tbl
WHERE id_parent = $id_catalog";
$cat = query($query);
if(query_num_rows($cat))
{
$arr = array();
while($catalog = query_fetch($cat))
{
$arr[] = $catalog['id_catalog'];
$new = get_subcatalog_list($catalog['id_catalog'], $tbl, $force);
if(!empty($new)) $arr = array_merge($arr, $new);
}
return $arr;
}
else return FALSE;
}
?>
|
и вместо конструкции
WHERE id_catalog=$_GET[id_catalog]
|
использовать
WHERE id_catalog IN (".implode(",", $arr).")"
|
PS В идеале лучше вообще создать таблицу, где кэшировать список подчиненных каталогов и функции get_subcatalog_list() брать данные от туда, не прибегая к рекурсии (впрочем в случае удаления подкаталога - это не критично). | |
|
|
|