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

Форум MySQL

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

 

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

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

тема: универсальный алгоритм изменнеия следования записей
 
 автор: skinny   (18.10.2011 в 14:01)   письмо автору
 
 

часто при написании программ для работы с записями из базы требуется изменить порядок их вывода
постоянно связываюсь с проблемами.
Вроде бы получилось написать более менее универсальную функцию для изменения порядка, но после многократных изменений, в конце концов порядок всех записей становится равный нулю и они перестают "перескакивать"
может быть есть какое то готовое решение а то надоело каждый рас велосипед изобретать?

для следования по порядку обычно использую специальное поле, НЕ ID!

  Ответить  
 
 автор: virtus1k   (18.10.2011 в 14:06)   письмо автору
 
   для: skinny   (18.10.2011 в 14:01)
 

А код жалко показать? Просто телепатией лень заниматься, что б ошибку в Вашей функции узреть!

  Ответить  
 
 автор: cheops   (18.10.2011 в 15:21)   письмо автору
 
   для: skinny   (18.10.2011 в 14:01)
 

А поле id в таблице присутствует? И какое поле ответственно за порядко следования элементов?

  Ответить  
 
 автор: skinny   (18.10.2011 в 15:37)   письмо автору
 
   для: cheops   (18.10.2011 в 15:21)
 

функции передаётся id той записи, которую нужно двигать и если передаётся id в переменной up то двигать нада вверх, если в dn то в низ, передаётся просто черес Get параметр

примерно так:
server.com/edit.php?up=25
или
server.com/edit.php?dn=25



function act_up_dn($dn, $up, $fieldname, $tablename, $link)
    {
        if ($dn>0)
        {
            list($ord1)=mysql_fetch_row(mysql_query('SELECT `'.mysql_escape_string($fieldname).'`     FROM `'.mysql_escape_string($tablename).'`  WHERE (`id` =\''.mysql_escape_string($dn).'\' AND `deleted`=1) LIMIT 1'));
               list($id2,$ord2)=mysql_fetch_row(mysql_query('SELECT `id`, `'.mysql_escape_string($fieldname).'`     FROM `'.mysql_escape_string($tablename).'`  WHERE (`'.mysql_escape_string($fieldname).'` >\''.mysql_escape_string($ord1).'\' AND `deleted`=1) ORDER BY `'.mysql_escape_string($fieldname).'` LIMIT 1'));
            $zapros1='UPDATE `'.mysql_escape_string($tablename).'` SET `'.mysql_escape_string($fieldname).'` = '.mysql_escape_string($ord2).' WHERE `id` =\''.mysql_escape_string($dn).'\' LIMIT 1';
            $zapros2='UPDATE `'.mysql_escape_string($tablename).'` SET `'.mysql_escape_string($fieldname).'` = '.mysql_escape_string($ord1).' WHERE `id` =\''.mysql_escape_string($id2).'\' LIMIT 1';
              if (mysql_query($zapros1) && mysql_query($zapros2))
              return('<script>top.window.location.assign("'.$link.'")</script>');
            else return '<script>alert(\'Ошибкеа изменения позиции! \')</script>';
        }
        if ($up>0)
        {
            list($ord1)=mysql_fetch_row(mysql_query('SELECT `'.mysql_escape_string($fieldname).'`     FROM `'.mysql_escape_string($tablename).'`  WHERE (`id` =\''.mysql_escape_string($up).'\' AND `deleted`=1) LIMIT 1'));
              list($id2,$ord2)=mysql_fetch_row(mysql_query('SELECT `id`, `'.mysql_escape_string($fieldname).'`     FROM `'.mysql_escape_string($tablename).'`  WHERE (`'.mysql_escape_string($fieldname).'` <\''.mysql_escape_string($ord1).'\' AND `deleted`=1) ORDER BY `'.mysql_escape_string($fieldname).'` DESC LIMIT 1'));
            $zapros1='UPDATE `'.mysql_escape_string($tablename).'` SET `'.mysql_escape_string($fieldname).'` = '.mysql_escape_string($ord2).' WHERE `id` =\''.mysql_escape_string($up).'\' LIMIT 1';
            $zapros2='UPDATE `'.mysql_escape_string($tablename).'` SET `'.mysql_escape_string($fieldname).'` = '.mysql_escape_string($ord1).' WHERE `id` =\''.mysql_escape_string($id2).'\' LIMIT 1';
              if (mysql_query($zapros1) && mysql_query($zapros2))
              return('<script>top.window.location.assign("'.$link.'")</script>');
              else return '<script>alert(\'Ошибкеа изменения позиции! \')</script>';
        }
    }


таблица такая, но по идее она может быть любой

CREATE TABLE IF NOT EXISTS `tegs` (
  `id` int(5) unsigned NOT NULL auto_increment,
  `deleted` tinyint(1) NOT NULL default '1',
  `active` tinyint(1) NOT NULL default '1',
  `name` varchar(250) NOT NULL,
  `capt` varchar(250) NOT NULL,
  `mother_id` int(5) NOT NULL,
  `poriadok` int(5) NOT NULL default '1',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2675 ;

  Ответить  
 
 автор: cheops   (18.10.2011 в 16:12)   письмо автору
 
   для: skinny   (18.10.2011 в 15:37)
 

Ага... мы обычно используем другой подход, у нас поле позиции везде называется одинаково pos, а вот WHERE-условие может здорово отличаться, поэтому оно передается функциям через параметр. Может вам будет интересен наш подход.
<?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 query($query);
      if(
query_num_rows($pos))
      {
        
$pos_current query_result($query);
      }
      
// Извлекаем предыдую позицию
      
$query "SELECT pos FROM $tbl_name
                WHERE pos < 
$pos_current $where
                ORDER BY pos DESC
                LIMIT 1"
;
      
$pos query($query);
      if(
query_num_rows($pos))
      {
        
$pos_preview query_result($query);
    
        
// Меняем местами текущую и предыдущую позиции
        
$query "UPDATE $tbl_name
                  SET pos = 
$pos_current + $pos_preview - pos
                  WHERE pos IN (
$pos_current$pos_preview$where";
        
query($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 query($query);
      if(
query_num_rows($pos))
      {
        
$pos_current query_result($query);
      }
      
// Извлекаем следующую позицию
      
$query "SELECT pos FROM $tbl_name
                WHERE pos > 
$pos_current $where
                ORDER BY pos
                LIMIT 1"
;
      
$pos query($query);
      if(
query_num_rows($pos))
      {
        
$pos_next query_result($query);
    
        
// Меняем местами текущую и следующую позиции
        
$query "UPDATE $tbl_name
                  SET pos = 
$pos_next + $pos_current - pos
                  WHERE pos IN (
$pos_next$pos_current$where";
        
query($query);
      }
    }
?>

$id_position - первичный ключ записи, которая подвергается перемещению
$tbl_name - название таблицы
$where - дополнительные WHERE-условия
$fld_name - название первичного ключа, если оно отлично от id_position (самое распространенное в наших системах название).
Здесь, конечно, используются обертки query(), query_num_rows() и query_result(), чтобы генерировать исключения в случае возникновения ошибки, но при адаптации не составит труда использовать вместо них mysql_query(), mysql_num_rows() и mysql_result().

  Ответить  
 
 автор: skinny   (18.10.2011 в 16:34)   письмо автору
 
   для: cheops   (18.10.2011 в 16:12)
 

уже кое что увидел что раньше не мог понять как сделать

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

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