Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Zmiana kolejności elementów na liście
Forum PHP.pl > Forum > Przedszkole
-Wiktoria-
Witam. Mam formularz w którym dodaję zdjęcia do bazy, o kolejności decyduje wpisany numer pozycji. Mam problem z przypadkiem kiedy już istnieje podany numer na liście, bo powstają dwa elementy o takiej samej pozycji. Co chcę osiągnąć:
- może istnieć tylko jeden numer o danej pozycji
- jeżeli już istnieje pozycja to nowy wpis ma numer tej pozycji, a pozostałe ulegają zmianie.
Mam problem jak to wykonać.. Czy mógłby mnie ktoś nakierować?
punoljoe
id_zdjecia auto_increment not null primary key int(12)
id_kolejnosci default null int(10)
i reszta do zdjęcia... adres czy co tam chcesz....

każde zdjęcie ma unikalny identyfikator (id_zdjęcia)
a potem zmieniasz tylko id_kolejności ... można zrobić zakładkę do edycji tej kolejności . pogmatwana sprawa, ale tak to się robi.

czyli krótko, musisz dodać prawdopodobnie jedną kolumnę do tabeli , która będzie odpowiadała za kolejność ustawianą ręcznie. Zdjęcia które dodajesz powinny mieć auto_incrementację przy identyfikatorze
-Wiktoria-
Tylko co w przypadku jak będą dwie takie same kolejności, np dwie pozycje będą mieć piąty numer? Chodzi mi o to jak w takim przypadku automatycznie zmienić pozostałe numery aby do takiej sytuacji nie doszło gdy wpisze się piątą pozycję? Czy też przykładowa sytuacja: mamy pozycje 1 2 3 4 5 - co powinno się dziać kiedy z piątki chcę zmienić pozycję na trzy?
b4rt3kk
Najpierw sprawdzasz SELECT czy wprowadzona liczba jest już w bazie. Jeśli tak:

  1. $query = "UPDATE tabela SET kolejnosc=kolejnosc+1 WHERE kolejnosc >= '$wprowadzona_wartosc_z_formularza'";
  2. // wykonanie zapytania
  3. // dodanie nowej pozycji
  4. $query = "INSERT INTO tabela (kolejnosc) VALUES ('$wprowadzona_wartosc_z_formularza')";
punoljoe
od początku... masz przykładowo tabelę z osobą nazwaną PERSON (id_person, name, surname) i tabelę FOTO (id_foto, id_kolejnosc, id_person, lokalizacja_zdjecia).

Do rekordu z tabeli PERSON o id_person =1 i nazwie np. Jan Kowalski przypisujesz zdjęcia z wartościami w tabelce FOTO (1, 1, 1,'img/foto1.png'),(2, 2,1, 'img/foto1.png'),(3, 2,1, 'img/foto1.png'),(6, 3,1, 'img/foto1.png').
id_kolejnosc możesz edytować, możesz napisać funkcje która zamieni numery w dowolny sposób.... itd.
Aby się nie powielały podczas dodawania, to możesz oczywiście sprawdzić jaki jest maksymalny numer dla zdjęć dla danego użytkownika , w tym przypadku id_person->1 (oczywiście sprawdzić w tabeli FOTO) i dodać liczbę o 1 większą....
itd. itd.
Gość
Cytat(b4rt3kk @ 30.10.2012, 21:10:12 ) *
Najpierw sprawdzasz SELECT czy wprowadzona liczba jest już w bazie. Jeśli tak:

  1. $query = "UPDATE tabela SET kolejnosc=kolejnosc+1 WHERE kolejnosc >= '$wprowadzona_wartosc_z_formularza'";
  2. // wykonanie zapytania
  3. // dodanie nowej pozycji
  4. $query = "INSERT INTO tabela (kolejnosc) VALUES ('$wprowadzona_wartosc_z_formularza')";


Dziękuję Wam za dotychczasową pomoc smile.gif Rozwiązanie jest dobre dopóki mamy zachowaną kolejność bez omijania pozycji. Robię takie dodawanie, że można sobie wpisać dowolną pozycję zdjęcia, nie muszą być po kolei. Problem pojawia się kiedy mamy np pozycje: 1,2,3,4,6,8,9,10,20,25. Gdy kolejne zdjęcie ustawimy jako 5 - pozycja nr 6 i kolejne niepotrzebnie zwiększą się o jeden. I z tym mam od początku problem, bo nie chcę przy każdym dodawaniu/edycji zwiększać niepotrzebnie liczników wszystkich większych pozycji.
b4rt3kk
Cytat(Gość @ 30.10.2012, 23:01:00 ) *
Dziękuję Wam za dotychczasową pomoc smile.gif Rozwiązanie jest dobre dopóki mamy zachowaną kolejność bez omijania pozycji. Robię takie dodawanie, że można sobie wpisać dowolną pozycję zdjęcia, nie muszą być po kolei. Problem pojawia się kiedy mamy np pozycje: 1,2,3,4,6,8,9,10,20,25. Gdy kolejne zdjęcie ustawimy jako 5 - pozycja nr 6 i kolejne niepotrzebnie zwiększą się o jeden. I z tym mam od początku problem, bo nie chcę przy każdym dodawaniu/edycji zwiększać niepotrzebnie liczników wszystkich większych pozycji.


To tak jak wspominałem, sprawdzasz, czy pozycja o danym nr kolejności już istnieje w bazie i dopiero jeśli istnieje przesuwasz kolejność pozostałych.
-Wiktoria-
Cytat(b4rt3kk @ 30.10.2012, 23:06:46 ) *
To tak jak wspominałem, sprawdzasz, czy pozycja o danym nr kolejności już istnieje w bazie i dopiero jeśli istnieje przesuwasz kolejność pozostałych.


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...

b4rt3kk
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ł.

  1. $kolejnosc = 10; // dane otrzymane z formularza
  2.  
  3. function sprawdzKolejnosc($nr) {
  4. $query = "SELECT COUNT(id) AS ile FROM tabela WHERE kolejnosc='$nr'";
  5. // wykonanie zapytania i przetworzenie wyników
  6. if ($row['ile']>0) { // oznacza to, że wpis o tym nr kolejności już istnieje
  7. $query = "SELECT kolejnosc FROM tabela WHERE kolejnosc > '$nr'";
  8. // wykonanie i przetworzenie wyników zapytania
  9. $counter = $nr+1;
  10. while ($row) {
  11. if ($row['kolejnosc'] != $counter) { $firstEmpty = $row['kolejnosc']; break; }
  12. }
  13. // powyższa pętla szuka pierwszej luki
  14. $query = "UPDATE tabela SET kolejnosc=kolejnosc+1 WHERE kolejnosc>='$nr' AND kolejnosc<'$firstEmpty'";
  15. // zapytanie zwiększy o 1 kolejność do pierwszej luki
  16. // teraz można dodać do bazy podana funkcji kolejnosc do sprawdzenia
  17. } else { // dodaje od razu do bazy bo w bazie nie istnieje wpis o takiej kolejności }
  18. }
  19.  
  20. sprawdzKolejnosc($kolejnosc);
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.