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

Форум MySQL

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

 

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

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

тема: Сортировка таблицы
 
 автор: SaIdEr   (09.04.2013 в 20:38)   письмо автору
 
 

У меня такая проблема, есть скрипт который создает разделы меню, запись происходить в таблицу MySql id каждого раздела записывается в разноброс, тоесть 1,3,6,5... и т. д. так же есть скрипт на jquery который производит сортировку разделов http://isocra.com/2008/02/table-drag-and-drop-jquery-plugin/ как мне записать в mysql таблицу измененные местами разделы?

  Ответить  
 
 автор: cheops   (09.04.2013 в 21:48)   письмо автору
 
   для: SaIdEr   (09.04.2013 в 20:38)
 

Введите дополнительный столбец pos с порядком следования пунктов меню и используйте его для сортировки и редактирования.

  Ответить  
 
 автор: SaIdEr   (09.04.2013 в 22:03)   письмо автору
 
   для: cheops   (09.04.2013 в 21:48)
 

а запрос к Mysql тогда как выглядеть будет?

  Ответить  
 
 автор: SaIdEr   (10.04.2013 в 20:43)   письмо автору
 
   для: SaIdEr   (09.04.2013 в 22:03)
 

Если кому вдруг не понятно что янаписал, вот наглядный пример что мне надо. Вот структура самой таблицы:

pos--id--name--message
 1---3----A------A
 2---2----B------B
 3---6----C------C
 4---9----D------D

А мне ее надо отсортировать вот так:

pos--id--name--message
 1---6----C------C
 2---2----B------B
 3---3----A------A
 4---9----D------D

какой мне нужно составить запрос к таблице mysql что бы так отредактировать?

  Ответить  
 
 автор: Sfinks   (11.04.2013 в 09:39)   письмо автору
 
   для: SaIdEr   (10.04.2013 в 20:43)
 

Для этого скрипт, который на JS, который сортирует строки на клиенте должен после сортировки передать на сервер полную картину результата сортировки. Тогда, имея позицию по каждой строке ее можно будет занести в БД.

После этого запрос на выборку будет выглядеть так же как и раньше, но в конце дописано:
ORDER BY pos

  Ответить  
 
 автор: saider   (11.04.2013 в 16:20)   письмо автору
 
   для: Sfinks   (11.04.2013 в 09:39)
 

Ну это что вы привели код, это я как понял это выводить список после сортировки товара на экран, а как будет выглядеть сам sql запрос на редактирование списка разделов?

  Ответить  
 
 автор: Sfinks   (12.04.2013 в 08:10)   письмо автору
 
   для: saider   (11.04.2013 в 16:20)
 

Может вы сперва покажете код который пришлет от клиента результат сортировки?
В общем виде это будет куча простейших UPDATE-запросов на каждую строку отдельно:
UPDATE table_name SET pos=значение_принятое_от_клиента WHERE id=значение

  Ответить  
 
 автор: saider   (12.04.2013 в 09:03)   письмо автору
 
   для: Sfinks   (12.04.2013 в 08:10)
 

Вот таким запросом я уже решил проблему, но код покажу по позже, может быть какие предложения будут по улучшению кода

  Ответить  
 
 автор: SaIdEr   (12.04.2013 в 14:09)   письмо автору
 
   для: saider   (12.04.2013 в 09:03)
 

Вот что у меня получилось, это весть код обработки таблицы на который происходит запрос на языке ajax
$data=$_POST['container_icon']; // получение массива id таблицы средством ajax
$json_sort = preg_replace('/\[*"(-?\d+\.?\d*)"\]*/', '$1', json_encode($data)); //убираем лишние символы

// выбираем столбцы, которые надо отредактировать согласно его id
$result=db_query("SELECT * FROM grn_icons_shop WHERE id in ($json_sort)");
while ($row = mysql_fetch_array($result)) {
$id_sort=$row['id'];
$row['name_shop']=iconv('cp1251', 'utf-8', $row['name_shop']);
$array_name[$id_sort]=$row;
}
// сортируем id а pos оставляем на месте
foreach( $data as $sort_order => $id ){
if($sort_order>0){
db_query("UPDATE grn_icons_shop SET id=$id,
                                    name_img='".$array_name[$id]['name_img']."',
                                    name_shop='".iconv('utf-8', 'cp1251', $array_name[$id]['name_shop'])."' 
                              WHERE pos=$sort_order ORDER BY pos");
}
}
// выводим результат
$ok_text=iconv('cp1251', 'utf-8', 'СОХРАНЕН');
$arrayJson=array('ok' => $ok_text); // передаем назад на ajax

  Ответить  
 
 автор: Sfinks   (12.04.2013 в 16:57)   письмо автору
 
   для: SaIdEr   (12.04.2013 в 14:09)
 

Ерунда какая-то.

Не нужно менять местами все поля таблицы.
И уж тем более не нужно делать этого в цикле.

(не нужно - следует читать как "категорически противопоказано").

Когда я просил показать код, я имел ввиду не код обработчика, а код JS, или еще лучше - данные, которые приходят в обработчик.
Для этого достаточно было в начале обработчика вставить: print_r($_POST);

Нет - значит буду объяснять так, как понятно мне.

Во-первых - как происходит сортировка? На сколько я понял - перетаскиванием.
Перетаскиванием чего? Допустим DIV'ов.
Следовательно - достаточно в каждый див вставить <input type=hidden name=id[] value=ид_строки>
Тогда при сериализации и отправке формы в обработчик придет массив id в нужном порядке и print_r($_POST) будет выглядеть так:
Array
(
    [id] => Array
        (
            [0] => 757
            [1] => 187
            [2] => 366
        )
)

Теперь в цикле (тут я сделаю сноску на то, что сразу не сообразил как сделать массовый UPDATE, но это все-таки возможно) формируем запрос:
<?php

  $id 
$_POST['id'];
  
$a = array();
  foreach(
$id as $k => $v)
    
$a[] = "SELECT ".intval($v)." id, ".intval($k)." pos";
  
$a implode(' UNION ALL ',$a);
  
$sql "UPDATE grn_icons_shop AS t1
               , ("
.$a.")t2
          SET t1.pos = t2.pos 
          WHERE t1.id = t2.id"
;
?>

Полученный запрос будет иметь вид:
UPDATE grn_icons_shop AS t1
     , (SELECT 757 id, 0 pos
        UNION ALL
        SELECT 187 id, 1 pos
        UNION ALL
        SELECT 366 id, 2 pos)t2
SET t1.pos = t2.pos 
WHERE t1.id = t2.id
и обновит сразу все строки.

  Ответить  
 
 автор: SaIdEr   (12.04.2013 в 20:50)   письмо автору
 
   для: Sfinks   (12.04.2013 в 16:57)
 

Да, все вы поняли правильно, именно так и сортируется, только я вот ваш код немного изменил, так можно писать?


$data=$_POST['container_icon']; // получение массива id таблицы средством ajax
$json_sort = preg_replace('/\[*"(-?\d+\.?\d*)"\]*/', '$1', json_encode($data)); //убираем лишние символы 

// выбираем столбцы, которые надо отредактировать согласно его id 
$result=db_query("SELECT * FROM grn_icons_shop WHERE id in ($json_sort)"); 
while ($row = mysql_fetch_array($result)) { 
$id_sort=$row['id']; 
$array_name[$id_sort]=$row; 


$a = array(); 
foreach($data as $k => $v){
$a[] = "SELECT ".intval($v)." id, 
                             ".intval($k)." pos,
                             '".$array_name[$v]['name_img']."' name_img,
                             '".$array_name[$v]['name_shop']."' name_shop";
}
$a = implode(' UNION ALL ',$a);
$sql = "UPDATE grn_icons_shop AS t1, (".$a.")t2
             SET t1.id = t2.id,
                  t1.name_img = t2.name_img,
                  t1.name_shop = t2.name_shop
          WHERE t1.pos = t2.pos"; 

db_query($sql);

// выводим результат
$ok_text=iconv('cp1251', 'utf-8', 'СОХРАНЕН');

  Ответить  
 
 автор: Sfinks   (13.04.2013 в 09:14)   письмо автору
 
   для: SaIdEr   (12.04.2013 в 20:50)
 

Конечно можно!

А еще вместо того, чтобы вырыть котлован экскаватором можно нагнать 100500 гасторбайтеров, которые будут рыть лопатами в 100 раз дольше, в 50 раз дороже да еще и криво. А так конечно можно.

Вы идете по второму пути.

А то, что вы вместо того чтоб по первичному ключу обновить позицию, обновляете 3 поля в том числе и первичный ключ по позиции - это все равно что вместо того чтоб разметить землю и по разметке вырыть котлован, начать рыть и от центра ямы измерять размеры.

  Ответить  
 
 автор: SaIdEr   (16.04.2013 в 15:57)   письмо автору
 
   для: Sfinks   (13.04.2013 в 09:14)
 

Еще один вопрос столбик pos идет как 1,2,3,4,5,6 ... но если удалить допустим 2, 3 то сортировка перестает работать, как это исправить?

  Ответить  
 
 автор: Sfinks   (17.04.2013 в 10:03)   письмо автору
 
   для: SaIdEr   (16.04.2013 в 15:57)
 

> если удалить допустим 2, 3 то сортировка перестает работать

Что значит перестает работать?

Перестает работать сортировка или сохранение сортировки?

Думаю сохранение. Потому что при выводе цифры 6,4,1,5 в любом случае будут отсортированы как 1,4,5,6

А если сохранение, то какой из вариантов: мой или ваш?

Думаю ваш, т.к. если мерить котлован изнутри, ошибки не избежать.
Поэтому я и говорил, что нужно pos менять в соответствии с id, а не наоборот.

  Ответить  
 
 автор: SaIdEr   (19.04.2013 в 23:14)   письмо автору
 
   для: Sfinks   (17.04.2013 в 10:03)
 

сортировка столбика id перестает работать, если в столбике pos сбить порядок 1,2,3,4,5 на порядок 1,3,4,5 то в столбике id сортировка перестает работать и все поля из id стераются

  Ответить  
 
 автор: Sfinks   (20.04.2013 в 16:37)   письмо автору
 
   для: SaIdEr   (19.04.2013 в 23:14)
 

Как можно о программировании говорить без кода?

Да, и сортируются не столбики, а строчечки.

  Ответить  
 
 автор: SaIdEr   (20.04.2013 в 22:54)   письмо автору
 
   для: Sfinks   (20.04.2013 в 16:37)
 

:), все, разобрался в чем дело, работаю уже в этой сфере 10 лет и такого элементарного не заметил
передает jquery плагин TebleDnD вот так в обработчик:
container_icon[]=0&container_icon[]=5&container_icon[]=6&container_icon[]=8

Что бы работала нормально сортировка код переделал так:
$data=$_POST['container_icon']; // получение массива id таблицы средством ajax
$json_sort = preg_replace('/\[*"(-?\d+\.?\d*)"\]*/', '$1', json_encode($data)); //убираем лишние символы 

// выбираем столбцы, которые надо отредактировать согласно его pos
$result=db_query("SELECT * FROM grn_icons_shop WHERE id in ($json_sort)"); 
$pos=array();
while ($row = mysql_fetch_array($result)) {
$id_sort=$row['id']; 
$array_name[$id_sort]=$row;
$pos[]=$row['pos'];
}

$a = array();
$f=-1;
foreach($data as $k => $v){
if($k>0){
$f+=1;
$a[] = "SELECT ".intval($pos[$f])." pos, ".intval($v)." id, '".$array_name[$v]['name_img']."' name_img,'".$array_name[$v]['name_shop']."' name_shop,'".$array_name[$v]['message']."' message";
}
}

$a = implode(' UNION ALL ', $a);
$sql = "UPDATE grn_icons_shop AS t1, (".$a.") t2
          SET t1.id = t2.id,
              t1.name_img = t2.name_img,
              t1.name_shop = t2.name_shop,
              t1.message = t2.message
          WHERE t1.pos=t2.pos"; 

db_query($sql);

// выводим результат
$ok_text=iconv('cp1251', 'utf-8', 'СОХРАНЕН');

Этого кода нет во всем интернете и все гадают как можно сделать сортировку, но пусть типерь пользуются :)

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

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