|
|
|
| Таблица:
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.
Очень прошу помочь кодом. | |
|
|
|
|
|
|
|
для: Dizels
(27.04.2009 в 15:53)
| | В Чем Вопрос??, делай update для двух строк!! | |
|
|
|
|
|
|
|
для: 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($pos, 0);
}
// Извлекаем предыдую позицию
$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($pos, 0);
// Меняем местами текущую и предыдущую позиции
$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($pos, 0);
}
// Извлекаем следующую позицию
$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($pos, 0);
// Меняем местами текущую и следующую позиции
$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");
?>
|
| |
|
|
|
|
|
|
|
для: 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:18)
| | Проблема решена!
Всем большое спасибо за помощь! | |
|
|
|
|
|
|
|
для: cheops
(27.04.2009 в 17:05)
| | Тут код работает верно, а в книге с ошибкой был. Возможно ли сделать поднятие/опускание по кругу. Если позиция 1 и жмем поднять, то по идеи, если зациклить, позиция должна стать наибольшей. Если позиция максимальна и жмем опустить, по идеи позиция станет 1 | |
|
|
|
|