Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2009, 17:39   #1
iankov
Форумчанин
 
Регистрация: 04.01.2009
Сообщений: 188
По умолчанию Перемещение элементов списка выше/ниже

В БД в таблице одно из полей - showorder типа int влияющее на порядок сортировки элемента в списке. Т.е. в таблице несколько записей и у каждой установлено поле showorder в какое-то значение. Далее при выборе элементов из базы используется select .... order by showorder.

Как сделать функции для перемещения конкретного элемента выше или ниже? Т.е. нужно будет изменять showorder. showorder в нескольких элементах может принимать одинаковые значения, так как при добавлении нового элемента ему автоматом присваивается 0.
showorder.png
Таблица - fields(id, name, showorder)

В общем в некоторых CMS есть возможность сортировать элементы(категории например). Мне нужно тоже самое по функциональности, но в цмсках у них свои фреймворки, ничего не разобрать.

Последний раз редактировалось iankov; 09.03.2009 в 18:19.
iankov вне форума Ответить с цитированием
Старый 09.03.2009, 18:01   #2
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Переместить где? (ВЗРЫВ МОЗГА!)
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 09.03.2009, 18:12   #3
wall66
Участник клуба
 
Аватар для wall66
 
Регистрация: 04.10.2008
Сообщений: 1,485
По умолчанию

лучше оставить такое поле обычным полем ввода (type="text") и выставлять значения вручную, с шагом например в сотню, чтобы можно было вставлять новые элементы между других

для понимания вышенаписанного советую переосмыслить название поля как "приоритет"



функция же могла бы выглядеть вроде update table set showorder=showorder+1 where showorder>$item_showorder
свободен...

Последний раз редактировалось wall66; 09.03.2009 в 18:19.
wall66 вне форума Ответить с цитированием
Старый 09.03.2009, 18:22   #4
iankov
Форумчанин
 
Регистрация: 04.01.2009
Сообщений: 188
По умолчанию

mv28jam
Подправил сообщение, добавил рисунок - думаю там все понятно. Кнопками вверх/вниз мы перемещаем элементы относительно друг друга.
iankov вне форума Ответить с цитированием
Старый 09.03.2009, 19:40   #5
iankov
Форумчанин
 
Регистрация: 04.01.2009
Сообщений: 188
По умолчанию

Сделал исходя из того что одинаковых showorder у меня не будет. Буду при добавлении новой записи автоматически ей присваивать showorder = максимальный текущий showorder + 1. Т.е. последний элемент будет в конце списка.
Данный код подымает требуемый элемент вверх по списку
PHP код:
//$id - это наш текущий id
// получаем своё текущее местоположение - showorder
$res mysql_query("SELECT showorder FROM formfields WHERE id='$id'");
$current mysql_fetch_assoc($res);

//ищем первого кто стоит выше нас, т.е. имеет меньший showorder
$res mysql_query("SELECT id, showorder FROM formfields WHERE showorder < $current[showorder] ORDER BY showorder DESC LIMIT 0,1");
$next mysql_fetch_assoc($res);

//если нашли кого нибудь стоящего выше за себя, то меняемся местами.
if(!empty($next)){
    
mysql_query("UPDATE formfields SET showorder='$next[showorder]' WHERE id='$id'");
    
mysql_query("UPDATE formfields SET showorder='$current[showorder]' WHERE id='$next[id]'");
//в ином случае, скорее всего мы и есть выше всех, поэтому ничего менять не будем 

Последний раз редактировалось iankov; 09.03.2009 в 19:43.
iankov вне форума Ответить с цитированием
Старый 09.03.2009, 19:45   #6
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

делал нечто подобное...
но! ваше высказывание, что могут быть одинаковые значения поля showorder - вообще убивают смысл сортировки.... как при одинаковых значениях определить кто выше/ниже?
Если гарантировать что поле уникальное - то нужно производить некий "обмен" ..... я делал это следующим способом:
для заданного элемента - находим первый следующий, showorder которого выше нашего.... и меняем значения нашего элемента и найденного.... все

чиста запросами здесь наверное не обойтись...

Код:
 ORDER BY showorder
думаю что лишне в вашем коде..... все равно 1 элемент

Последний раз редактировалось ADSoft; 09.03.2009 в 19:47.
ADSoft вне форума Ответить с цитированием
Старый 09.03.2009, 20:05   #7
wall66
Участник клуба
 
Аватар для wall66
 
Регистрация: 04.10.2008
Сообщений: 1,485
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
Код:
 ORDER BY showorder
думаю что лишне в вашем коде..... все равно 1 элемент
даже один элемент может быть как первым так и последним из таблицы
свободен...
wall66 вне форума Ответить с цитированием
Старый 09.03.2009, 20:32   #8
iankov
Форумчанин
 
Регистрация: 04.01.2009
Сообщений: 188
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
но! ваше высказывание, что могут быть одинаковые значения поля showorder - вообще убивают смысл сортировки.... как при одинаковых значениях определить кто выше/ниже?
Код:
 ORDER BY showorder
думаю что лишне в вашем коде..... все равно 1 элемент
CMSки различные делают такие вещи - оперируют с одинаковыми значениями. Если значения одинаковы, то сортировка произойдет по id - первичному элементу в порядке возростания.

Если вы про этот кусок
PHP код:
showorder $current[showorderORDER BY showorder DESC 
то совсем не лишнее. Допустим что наша позиция = 5, над нами есть элементы с позициями 4, 3, 2, 1 то без ORDER BY showorder запрос может вернуть любое из этих 4х значений (в зависимости от id, то о чем я написал выше), а нам нужно только это "4", т.е. самое большое из всех которые попадают под условие showorder < $current[showorder].
iankov вне форума Ответить с цитированием
Старый 09.03.2009, 21:08   #9
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

да, что- то невнимательно посмотрел... нужна сортировка
а насчет одинаковых - тогда order by showorder, id
ADSoft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Pascal] найти сумму элементов лежащих ниже побочной диагонали Рамик Помощь студентам 12 28.03.2011 22:53
в сглаженой матрице найти сумму модулей элементов расположенных ниже главной диагонали Sergeo_89 Паскаль, Turbo Pascal, PascalABC.NET 8 07.12.2010 00:02
Вычислить сумму элементов матрицы, расположенные на главной диагонали и выше нее MariyaVo Паскаль, Turbo Pascal, PascalABC.NET 9 10.05.2009 21:19
произведение всех элементов, расположенных на главной диагонали и выше ее матрицы размером 4х4, Pascal __FIRST__ Помощь студентам 2 12.12.2008 02:43
Перемещение и замена данных на один ряд выше Khabibula Microsoft Office Access 1 13.08.2008 12:57