10/10/2018, 00:02

Giúp mình cách làm này các bạn ơi

Khi mình lấy tất cả các record trong CSDL lên (ODER By oder ASC). Trong table mình có 1 cột order. Ngụ ý của mình là dùng cột order này để sắp xếp các record. Trong mỗi record mình có 2 link (Đi lên và đi xuống). Mình muốn rằng khi click vào link "Đi lên", record đó sẽ dời lên trên và chuyển record nằm liền trên xuống dưới.

Phương pháp đầu tiên của mình là set order giống với id, để khi mình click link "Đi lên", sẽ set order của record đó giảm 1 và đổi order của record trên nó thành order của nó (tức là đổi 2 order cho nhau). Nhưng mình thấy không ổn, vì chẳng hạn mình có 10 record, mình xóa record thứ 3 đến thứ 6, khi đó order còn lại là 1, 2, 7, 8, 9, 10. Vậy nếu mình muốn đem record có id thứ 7 lên thì .....pó tay. Vì nếu giảm record id thứ 7(có order là 7), tức là mình giảm 1 chỉ còn 6, còn record thứ 2 tăng lên 1 cũng chỉ là 3, khi đó 2 record vẫn chưa đổi trật tự. Các bạn có ai giúp mình cách nào để thay đổi trật tự 2 record 1 cách hoàn hảo k ?




Code của mình

if($up)
{
$sel_up = mysql_query("SELECT * FROM $tb_category ORDER BY id ASC");
$row_up = mysql_fetch_array($sel_up);
$order = $row_up[order] - 1 ;

mysql_query("UPDATE $tb_category SET order='$order' WHERE id = '$up'");

mysql_query("UPDATE $tb_category SET order = '$cate[order]' WHERE id = '".$up-1."'");
}
3do viết 02:15 ngày 10/10/2018
cách 1: khi xóa thì cập nhật lại cột order
cách 2: khi up or down thì:
a. tìm order của record phía trên hoặc phía dưới của record hiện tại
b. hóan đổi giá trị order của 2 record trên
rkitvn viết 02:05 ngày 10/10/2018
3do ơi, mình thấy 2 cách của bạn đều đúng. Cách 1, khi xóa thì cập nhật lại tất cả record. Như vậy mình phải dùng vòng while lấy tất cả các order, sau đó tiếp tục dùng for để tăng order lên 1, như vậy các order của mình sẽ cách nhau 1 đơn vị. 3do demo dùm mình dc k ?

Cách 2: tìm record liền trên và liền dưới, như vậy phải cho nó vào aray phải k ?. Mình chỉ hình dung dc như vậy, chứ chưa biết viết thế nào ? Nếu 3do biết thì demo dùm mình 2 cách luon dc k ?
3do viết 02:16 ngày 10/10/2018
cách 1 chỉ dễ làm khi xóa mỗi lần 1 record, nếu xóa nhiều thì bó tay.

ví dụ xóa 1 record có order là 5.

Lệnh để cập nhật là:

update tableabc set `order` = `order` -1 where `order` > 5

cách 2:

giả sử cần down, order của record hiện tại là 5.

Tìm order kế tiếp bên dưới:

select id, order from tableabc where `order` > 5 order by `order` asc limit 1

hoán đổi
update tableabc set order = $nextorder where id = $currentId
update tableabc set order = $currentorder where id = $nextId

trong đó $nextorder là order kế bên dưới, $nextId là id tương ứng. $currentId là id của record hiện tại, $currentOrder = 5 al2 order của record hiện tại
rkitvn viết 02:10 ngày 10/10/2018
Mình đã làm dc rồi. Thank 3do nhiều lắm nha. Cho mình hỏi 3do đang ở đâu ? Tên gì ? Đi làm ở đâu vậy ? Bao nhieu tuổi

Mình tên Danh, 24t, đang học ở Aptech Hoàng Văn Thụ Tp HCM
3do viết 02:13 ngày 10/10/2018
Được gửi bởi rkitvn
Mình đã làm dc rồi. Thank 3do nhiều lắm nha. Cho mình hỏi 3do đang ở đâu ? Tên gì ? Đi làm ở đâu vậy ? Bao nhieu tuổi

Mình tên Danh, 24t, đang học ở Aptech Hoàng Văn Thụ Tp HCM
Tớ tên An. Những câu còn lại ko tiện trả lời
Bài liên quan
0