Cytat(-Wiktoria- @ 30.10.2012, 23:43:28 )

Zgadzam się, że sprawdzając ograniczam liczbę przesunięć, tylko że taki problem występuje i w sytuacji kiedy pozycja już istnieje w bazie.
Sytuacja: mamy istniejące pozycje:
1 2 3 4 10 12 20 22 25
Chcemy: przesunąć 20 jako element 11
Oczekiwany wynik: 1 2 3 4 10 11 12 22 25
W obecnej sytuacji zamiast powyższego otrzymamy: 1 2 3 4 10 11 13 23 26
Myślałam o sprawdzaniu tylko pozycji obok pozycji wpisanej, ale zmieniając ją znowu może się posypać numeracja na prawo od niej ;/ i trzeba wtedy sprawdzać całość do końca...
No to trzeba tak bazę zrobić, żeby nie występowały takie luki. Wrzucając wszystko od początku zaczynać od 1,2,3, itd.
A przy edycji kolejności tj. np. chcemy zmienić pozycję 11, żeby teraz była nr 5, najprościej więc zamienić je miejscami, to nie spowoduje nieporządku i dalej baza będzie spójna.
A jeśli już jest konieczność żeby były te luki, to mam jeszcze taki pomysł.
$kolejnosc = 10; // dane otrzymane z formularza
function sprawdzKolejnosc($nr) {
$query = "SELECT COUNT(id) AS ile FROM tabela WHERE kolejnosc='$nr'";
// wykonanie zapytania i przetworzenie wyników
if ($row['ile']>0) { // oznacza to, że wpis o tym nr kolejności już istnieje
$query = "SELECT kolejnosc FROM tabela WHERE kolejnosc > '$nr'";
// wykonanie i przetworzenie wyników zapytania
$counter = $nr+1;
while ($row) {
if ($row['kolejnosc'] != $counter) { $firstEmpty = $row['kolejnosc']; break; }
}
// powyższa pętla szuka pierwszej luki
$query = "UPDATE tabela SET kolejnosc=kolejnosc+1 WHERE kolejnosc>='$nr' AND kolejnosc<'$firstEmpty'";
// zapytanie zwiększy o 1 kolejność do pierwszej luki
// teraz można dodać do bazy podana funkcji kolejnosc do sprawdzenia
} else { // dodaje od razu do bazy bo w bazie nie istnieje wpis o takiej kolejności }
}
sprawdzKolejnosc($kolejnosc);