Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Есть одна тут книга
 
 автор: ДобрыйУхх   (17.05.2010 в 19:17)   письмо автору
 
 

Всем привет

Всем известная книга "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"); 
  }
?>

  Ответить  
 
 автор: cheops   (21.05.2010 в 10:00)   письмо автору
 
   для: ДобрыйУхх   (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() брать данные от туда, не прибегая к рекурсии (впрочем в случае удаления подкаталога - это не критично).

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования