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

Форум MySQL

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

 

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

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

тема: Смещение статьи вверх\вниз
 
 автор: Dizels   (27.04.2009 в 15:53)   письмо автору
 
 

Таблица:
CREATE TABLE `dostoprim_articles` (
  `id_article` int(10) unsigned NOT NULL auto_increment,
  `name` tinytext NOT NULL,
  `pos` mediumint(9) NOT NULL default '0',
  `hide` enum('show','hide') NOT NULL default 'show',
  `id_page` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id_article`),
  KEY `id_page` (`id_page`)
) ENGINE=MyISAM;

Вот дамп БД которая получается:
INSERT INTO `dostoprim_articles` VALUES (1, 'Статья о золотых рыбках',5, 'show', 1);
INSERT INTO `dostoprim_articles` VALUES (11, 'Статья о черных кошках"',6, 'show', 3);
INSERT INTO `dostoprim_articles` VALUES (10, 'Статья о рыжих кошках', 5, 'show', 3);
INSERT INTO `dostoprim_articles` VALUES (4, 'Статья о барбусах', 8, 'show', 1);
INSERT INTO `dostoprim_articles` VALUES (5, 'Статья о пони, 5, 'show', 2);
INSERT INTO `dostoprim_articles` VALUES (6, 'Статья о беговых лошадях', 6, 'show', 2);
INSERT INTO `dostoprim_articles` VALUES (7, 'Статья о лошадях', 7, 'show', 2); 

Нужно сделать возможность сдвига статьи вверх\вниз. (т.е. изменять параметр pos). У каждой категории статей он начинается с 5.
Очень прошу помочь кодом.

  Ответить  
 
 автор: ШИМ   (27.04.2009 в 17:02)   письмо автору
 
   для: Dizels   (27.04.2009 в 15:53)
 

В Чем Вопрос??, делай update для двух строк!!

  Ответить  
 
 автор: cheops   (27.04.2009 в 17:05)   письмо автору
 
   для: Dizels   (27.04.2009 в 15:53)
 

Возможно вас заинтересуют следующие функции (только исключения замените на удобный вам способ обработки ошибок)
<?php
  
// Подъём блока на одну позицию вверх
  
function up($id_position$tbl_name$where ""$fld_name "id_position")
  {
    
// Извлекаем текущую позицию
    
$query "SELECT pos FROM $tbl_name
              WHERE 
$fld_name = $id_position
              LIMIT 1"
;
    
$pos mysql_query($query);
    if(!
$pos)
    {
      throw new 
ExceptionMySQL(mysql_error(), 
                               
$query,
                              
"Ошибка при извлечении 
                               текущей позиции"
);
    }
    if(
mysql_num_rows($pos))
    {
      
$pos_current mysql_result($pos0);
    }
    
// Извлекаем предыдую позицию
    
$query "SELECT pos FROM $tbl_name
              WHERE pos < 
$pos_current $where
              ORDER BY pos DESC
              LIMIT 1"
;
    
$pos mysql_query($query);
    if(!
$pos)
    {
      throw new 
ExceptionMySQL(mysql_error(), 
                               
$query,
                              
"Ошибка при извлечении 
                               предыдущей позиции"
);
    }
    if(
mysql_num_rows($pos))
    {
      
$pos_preview mysql_result($pos0);
  
      
// Меняем местами текущую и предыдущую позиции
      
$query "UPDATE $tbl_name
                SET pos = 
$pos_current + $pos_preview - pos
                WHERE pos IN (
$pos_current$pos_preview$where";
      if(!
mysql_query($query))
      {
        throw new 
ExceptionMySQL(mysql_error(), 
                                 
$query,
                                
"Ошибка изменения
                                 порядка следования позиций"
);
      }
    }
  }

  
// Опускание блока на одну позицию вниз
  
function down($id_position$tbl_name$where ""$fld_name "id_position")
  {
    
// Извлекаем текущую позицию
    
$query "SELECT pos FROM $tbl_name
              WHERE 
$fld_name = $id_position
              LIMIT 1"
;
    
$pos mysql_query($query);
    if(!
$pos)
    {
      throw new 
ExceptionMySQL(mysql_error(), 
                               
$query,
                              
"Ошибка при извлечении 
                               текущей позиции"
);
    }
    if(
mysql_num_rows($pos))
    {
      
$pos_current mysql_result($pos0);
    }
    
// Извлекаем следующую позицию
    
$query "SELECT pos FROM $tbl_name
              WHERE pos > 
$pos_current $where
              ORDER BY pos
              LIMIT 1"
;
    
$pos mysql_query($query);
    if(!
$pos)
    {
      throw new 
ExceptionMySQL(mysql_error(), 
                               
$query,
                              
"Ошибка при извлечении 
                               следующей позиции"
);
    }
    if(
mysql_num_rows($pos))
    {
      
$pos_next mysql_result($pos0);
  
      
// Меняем местами текущую и следующую позиции
      
$query "UPDATE $tbl_name
                SET pos = 
$pos_next + $pos_current - pos
                WHERE pos IN (
$pos_next$pos_current$where";
      if(!
mysql_query($query))
      {
        throw new 
ExceptionMySQL(mysql_error(), 
                                 
$query,
                                
"Ошибка изменения
                                 порядка следования позиций"
);
      }
    }
  }
?>

$id_position - первичный ключ смещаемой записи
$tbl_name - имя таблицы
$where - дополнительные WHERE-условия в виде " AND hie = 'show'"
$fld_name - название первичного ключа - в вашем случае "id_article"
<?php
  up
($id_article"dostoprim_articles""""id_article");
?>

  Ответить  
 
 автор: Dizels   (28.04.2009 в 13:18)   письмо автору
 
   для: cheops   (27.04.2009 в 17:05)
 

Чего-то у меня не получается применить данный код относительно моего примера.

Я заменил
throw new ExceptionMySQL(mysql_error(), 
                               $query,
                              "Ошибка при извлечении 
                               следующей позиции"); 

на
puterror("Ошибка при обращении к блоку статей");

Добавил перед функциями подключение к БД
    // Осуществляем соединение с базой данных
  require_once("../config.php");

и вот так вот осуществляю запрос к функции:
<?php
  down
($id_article"dostoprim_articles""""id_article");
?> 


Структура моей БД выложена выше.
Помогите плз.

  Ответить  
 
 автор: Dizels   (28.04.2009 в 13:56)   письмо автору
 
   для: Dizels   (28.04.2009 в 13:18)
 

Проблема решена!
Всем большое спасибо за помощь!

  Ответить  
 
 автор: mihdan   (29.04.2009 в 17:22)   письмо автору
 
   для: cheops   (27.04.2009 в 17:05)
 

Тут код работает верно, а в книге с ошибкой был. Возможно ли сделать поднятие/опускание по кругу. Если позиция 1 и жмем поднять, то по идеи, если зациклить, позиция должна стать наибольшей. Если позиция максимальна и жмем опустить, по идеи позиция станет 1

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

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