2016-12-06 16 views
1

下面的代碼工作正常,但我想知道是否有其他方式來處理這個。基本上,刪除條目後,我需要更新排序順序。如何 - 刪除後更新排序次序

$sql = 'DELETE FROM `ee_blog_category` WHERE id = '.$category_id; 
mysqli_query($con,$sql); 
if(mysqli_error($con)){ 
    echo mysqli_error($con); 
} 
// update cat sort 
$i = 1; 
$sql = 'SELECT * FROM `ee_blog_category` ORDER BY `sort`'; 
$result = mysqli_query($con,$sql); 
while ($row = mysqli_fetch_array($result)){ 
    $sql1 = 'UPDATE `ee_blog_category` SET `sort` = '.$i.' WHERE `id` = '.$row['id']; 
    mysqli_query($con,$sql1); 
    $i++; 
} 
+0

你可以像'set sort = sort-1'一樣更新計算。這樣你就不需要循環。 – Jeff

+0

在更新它們之前,您是如何確定「排序」列的值的?你的更新簡單地將它們設置爲與它們的「id」值相同。你可以'按ID排序'並稱之爲一天。除非你告訴他們,否則沒有人會知道你的'id'值不是連續的 - 有的已經'刪除'了。 –

+0

我更喜歡有一個單獨的排序列,插入總行數被計算並添加+1並使最新的條目成爲排序中的最後一個。 – drooh

回答

1

是的,有不同的(我認爲更好)的方式:

  1. 獲得刪除的項目(當然,你刪除它之前)的排序值。
  2. 更新所有與sort=sort-1

更大的排序值在你的情況下,這會是這樣的項目:

$sql = "Select sort from ee_blog_category where id=$category_id"; 
// execute, fetch, catch errors... 
$sort_original = $row['sort']; 

// now update all the others 
$sql = "UPDATE ee_blog_category SET sort=sort-1 where sort > $sort_original"; // maybe add a filter here (by group f.e.) 
// execute, check for errors. 

注:
你可以開到SQL的注射。
更好地使用準備好的語句!

+0

好的,謝謝,是的$ category_id是從一個預先準備好的語句中獲得的 – drooh

+0

這個解決方案是否解釋了一個類別剛剛被刪除的事實,它現在正在更新剩餘行的種類? – drooh

+0

它正在對已刪除的「之上」進行排序。 Hangon,我做了一個小姐...我編輯.. – Jeff

0

使用變量,並把此一點聲明:

SET @s := 0; 
UPDATE `ee_blog_category` 
    SET `sort` = (@s := @s + 1) 
    ORDER BY sort; 

在實際應用中,你只需要爲IDS比一個大刪做到這一點。如果您只刪除一行:

UPDATE ee_bloc_cateory 
    SET sort = sort - 1 
    WHERE sort >= (SELECT MIN(sort) FROM ee_bloc_cateory WHERE id = $deleted_id); 

您可以查詢$deleted_id甚至$deleted_sort做刪除前。

+0

這看起來令人困惑..有點像保持簡單和可讀性..但這可能是一個很好的解決方案 – drooh