|
|
|
| часто при написании программ для работы с записями из базы требуется изменить порядок их вывода
постоянно связываюсь с проблемами.
Вроде бы получилось написать более менее универсальную функцию для изменения порядка, но после многократных изменений, в конце концов порядок всех записей становится равный нулю и они перестают "перескакивать"
может быть есть какое то готовое решение а то надоело каждый рас велосипед изобретать?
для следования по порядку обычно использую специальное поле, НЕ ID! | |
|
|
|
|
|
|
|
для: skinny
(18.10.2011 в 14:01)
| | А код жалко показать? Просто телепатией лень заниматься, что б ошибку в Вашей функции узреть! | |
|
|
|
|
|
|
|
для: skinny
(18.10.2011 в 14:01)
| | А поле id в таблице присутствует? И какое поле ответственно за порядко следования элементов? | |
|
|
|
|
|
|
|
для: 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 ;
|
| |
|
|
|
|
|
|
|
для: 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(). | |
|
|
|
|
|
|
|
для: cheops
(18.10.2011 в 16:12)
| | уже кое что увидел что раньше не мог понять как сделать | |
|
|
|