|
|
|
| У меня такая проблема, есть скрипт который создает разделы меню, запись происходить в таблицу MySql id каждого раздела записывается в разноброс, тоесть 1,3,6,5... и т. д. так же есть скрипт на jquery который производит сортировку разделов http://isocra.com/2008/02/table-drag-and-drop-jquery-plugin/ как мне записать в mysql таблицу измененные местами разделы? | |
|
|
|
|
|
|
|
для: SaIdEr
(09.04.2013 в 20:38)
| | Введите дополнительный столбец pos с порядком следования пунктов меню и используйте его для сортировки и редактирования. | |
|
|
|
|
|
|
|
для: cheops
(09.04.2013 в 21:48)
| | а запрос к Mysql тогда как выглядеть будет? | |
|
|
|
|
|
|
|
для: 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 что бы так отредактировать? | |
|
|
|
|
|
|
|
для: SaIdEr
(10.04.2013 в 20:43)
| | Для этого скрипт, который на JS, который сортирует строки на клиенте должен после сортировки передать на сервер полную картину результата сортировки. Тогда, имея позицию по каждой строке ее можно будет занести в БД.
После этого запрос на выборку будет выглядеть так же как и раньше, но в конце дописано:
| |
|
|
|
|
|
|
|
для: Sfinks
(11.04.2013 в 09:39)
| | Ну это что вы привели код, это я как понял это выводить список после сортировки товара на экран, а как будет выглядеть сам sql запрос на редактирование списка разделов? | |
|
|
|
|
|
|
|
для: saider
(11.04.2013 в 16:20)
| | Может вы сперва покажете код который пришлет от клиента результат сортировки?
В общем виде это будет куча простейших UPDATE-запросов на каждую строку отдельно:
UPDATE table_name SET pos=значение_принятое_от_клиента WHERE id=значение
|
| |
|
|
|
|
|
|
|
для: Sfinks
(12.04.2013 в 08:10)
| | Вот таким запросом я уже решил проблему, но код покажу по позже, может быть какие предложения будут по улучшению кода | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: 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
| и обновит сразу все строки. | |
|
|
|
|
|
|
|
для: 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', 'СОХРАНЕН');
|
| |
|
|
|
|
|
|
|
для: SaIdEr
(12.04.2013 в 20:50)
| | Конечно можно!
А еще вместо того, чтобы вырыть котлован экскаватором можно нагнать 100500 гасторбайтеров, которые будут рыть лопатами в 100 раз дольше, в 50 раз дороже да еще и криво. А так конечно можно.
Вы идете по второму пути.
А то, что вы вместо того чтоб по первичному ключу обновить позицию, обновляете 3 поля в том числе и первичный ключ по позиции - это все равно что вместо того чтоб разметить землю и по разметке вырыть котлован, начать рыть и от центра ямы измерять размеры. | |
|
|
|
|
|
|
|
для: Sfinks
(13.04.2013 в 09:14)
| | Еще один вопрос столбик pos идет как 1,2,3,4,5,6 ... но если удалить допустим 2, 3 то сортировка перестает работать, как это исправить? | |
|
|
|
|
|
|
|
для: SaIdEr
(16.04.2013 в 15:57)
| | > если удалить допустим 2, 3 то сортировка перестает работать
Что значит перестает работать?
Перестает работать сортировка или сохранение сортировки?
Думаю сохранение. Потому что при выводе цифры 6,4,1,5 в любом случае будут отсортированы как 1,4,5,6
А если сохранение, то какой из вариантов: мой или ваш?
Думаю ваш, т.к. если мерить котлован изнутри, ошибки не избежать.
Поэтому я и говорил, что нужно pos менять в соответствии с id, а не наоборот. | |
|
|
|
|
|
|
|
для: Sfinks
(17.04.2013 в 10:03)
| | сортировка столбика id перестает работать, если в столбике pos сбить порядок 1,2,3,4,5 на порядок 1,3,4,5 то в столбике id сортировка перестает работать и все поля из id стераются | |
|
|
|
|
|
|
|
для: SaIdEr
(19.04.2013 в 23:14)
| | Как можно о программировании говорить без кода?
Да, и сортируются не столбики, а строчечки. | |
|
|
|
|
|
|
|
для: 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', 'СОХРАНЕН');
|
Этого кода нет во всем интернете и все гадают как можно сделать сортировку, но пусть типерь пользуются :) | |
|
|
|