Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Zmiana pozycji w menu
Forum PHP.pl > Forum > Przedszkole
Mefiuu
Witam. Usprawniając sobie moją stronę natknąłem się na problem. Otóż chciałem sobie zrobić tak jak jest np. w PHP-Fusion w panelu admina zmianę kolejności wyświetlania podstron. Wzorując się właśnie na PHP-Fusion skleciłem kod, choć go do końca nie rozumiem. Działa tak, że przenosi w górę/dół, ale nie chce "wymienić" pozycji, czyli jeśli mam pole o id='7' a pod nim pole o id='8' i dam "w dół" to nie zamieni mi ich. Kod jest taki (napiszę od razu jak ja go rozumiem).

  1. if (isset($_GET['moveup'])) {
  2. $id = $_GET['moveup']; // 1
  3. $link = mysql_query("SELECT id FROM menu WHERE id='$id'"); // 2
  4. $up = mysql_query("UPDATE menu SET id=id+1 WHERE id='".$link['id']."'"); // 3
  5. $up = mysql_query("UPDATE menu SET id=id-1 WHERE id='$id'"); // 4
  6. }
  7. elseif ((isset($_GET['movedown']))) {
  8. $id = $_GET['movedown']; //5
  9. $link = mysql_query("SELECT id FROM menu WHERE id='$id'"); //6
  10. $up = mysql_query("UPDATE menu SET id=id-1 WHERE id='".$link['id']."'"); //7
  11. $up = mysql_query("UPDATE menu SET id=id+1 WHERE id='$id'"); //8
  12. }


1. Pobieram sobie id z $_GET['moveup'] (przykładowo weźmy 8),
2. W zmiennej link przechowuję pobrane id z bazy danych gdzie id='$id' (czyli tutaj też jest wartość 8),
3. Zmienna up edytuje pole menu na zasadzie dodania do niego 1 w polu o id równym $link['id'] czyli w naszym przypadku 8 (a więc 8+1=9 czyli w sumie na dobrą sprawę to mi powinno przenosić w dół, bo po dodaniu mam większe id),
4. Znów zmienna up edytuje pole menu na zasadzie odjęcia 1 w polu o id równym $id czyli u mnie 8 (a więc 8-1=7).


Dlatego otrzymujemy z id=8 dwa id, id=7 i id=9. W żadnej możliwości nie będą koło siebie, a pole o id=8 zostanie puste. Dlaczego tak się dzieje i jak to poprawić ? Z pewnością źle robię kod i źle go interpretuję ale niestety nie wiem gdzie leży błąd. Mam nadzieję że wytłumaczyłem dość dobrze. Pozdrawiam i dziękuję za pomoc.


edit: zapomniałem dodać punktów 6, 7 i 8 ale to analogicznie jak moveup.
CuteOne
Sprawdź to:
  1.  
  2. $select = mysql_query("SELECT id FROM menu");
  3.  
  4. while($row = mysql_fetch_array($select)) {
  5.  
  6. if (isset($_GET['moveup'])) { // id = 8
  7.  
  8. if($row['id'] == $_GET['moveup']) { // jezeli znajdzie wiersz o id 8
  9.  
  10. mysql_query("UPDATE menu SET id = id + 1 WHERE id = ".$_GET['moveup']); // zwieksza jego id do id + 1 (czyli 9)
  11. }
  12. elseif($row['id'] == ($_GET['moveup'] + 1)) { // jezeli znajdzie wiersz o id 9 (8+1 tongue.gif)
  13.  
  14. mysql_query("UPDATE menu SET id = id - 1 WHERE id = ".$row['id']); // zmniejsza jego id do id - 1 (czyli 8)
  15. }
  16. }
  17. elseif ((isset($_GET['movedown']))){
  18.  
  19. if($row['id'] == $_GET['movedown']) {
  20.  
  21. mysql_query("UPDATE menu SET id = id - 1 WHERE id = ".$_GET['movedown']);
  22. }
  23. elseif($row['id'] == ($_GET['movedown'] - 1)) {
  24.  
  25. mysql_query("UPDATE menu SET id = id + 1 WHERE id = ".$row['id']);
  26. }
  27. }
  28. }
Mefiuu
Hmmm... Sprawdziłem tak:
  1. if (isset($_GET['moveup'])) {
  2. $select = mysql_query("SELECT id FROM menu");
  3. while($row = mysql_fetch_array($select)) {
  4. if (isset($_GET['moveup'])) { // id = 8
  5.  
  6. if($row['id'] == $_GET['moveup']) { // jezeli znajdzie wiersz o id 8
  7.  
  8. mysql_query("UPDATE menu SET id = id - 1 WHERE id = ".$_GET['moveup']); // zwieksza jego id do id + 1 (czyli 9)
  9. }
  10. elseif($row['id'] == ($_GET['moveup'] + 1)) { // jezeli znajdzie wiersz o id 9 (8+1 )
  11.  
  12. mysql_query("UPDATE menu SET id = id + 1 WHERE id = ".$row['id']); // zmniejsza jego id do id - 1 (czyli 8)
  13. }
  14. }
  15. }
  16. }
  17. elseif ((isset($_GET['movedown']))) {
  18. $select = mysql_query("SELECT id FROM menu");
  19. while($row = mysql_fetch_array($select)) {
  20. if($row['id'] == $_GET['movedown']) {
  21. mysql_query("UPDATE menu SET id = id + 1 WHERE id = ".$_GET['movedown']);
  22. }
  23. elseif($row['id'] == ($_GET['movedown'] - 1)) {
  24. mysql_query("UPDATE menu SET id = id - 1 WHERE id = ".$row['id']);
  25. }
  26. }
  27. }


I działa poprawnie, ale tak jak do tej pory - nie zamienia mi dwóch pozycji.


edit:

wydaje mi się że ten kod:

  1. if (isset($_GET['moveup'])) {
  2. $id = $_GET['moveup']; //1
  3. $link = mysql_query("SELECT id FROM menu WHERE id='$id'"); //2
  4. $up = mysql_query("UPDATE menu SET id=id+1 WHERE id='".$link['id']."'"); //3
  5. $up = mysql_query("UPDATE menu SET id=id-1 WHERE id='$id+1'"); //4
  6. }

jest poprawny, z tym, że nie wiem jak to obsłużyć aby się zmieniały bo kiedy dojdzie do kroku 3 to próbuje mu nadać np. id=9 które jest przypisane do id niżej. I nie zrobi tego.
CuteOne
Dwóch pozycji?? chyba Cie nie rozumiem o.o

ps. w twoim skrypcie jest błąd:

  1. $select = mysql_query("SELECT id FROM menu WHERE id='$id'"); //2
  2. $link = mysql_fetch_array($select);
  3. $up = mysql_query("UPDATE menu SET id=id+1 WHERE id='".$link['id']."'"); //3
Mefiuu
Chodzi mi o to, aby jednocześnie, w jednym momencie zamienić te dwie pozycje. Bo jeśli robię to w zmiennych, jedna po drugiej to w pierwszej zmiennej mi nie zmieni id na np. 9 skoro niżej już jest takie id. O to chodzi.


P.S.
Z tym co podałeś nie działa prawidłowo, z moim działa oprócz zamiany.

edit:

albo dodać możliwość aby pole id mogło mieć taką samą wartość, czyli np przez chwilę dwa pola id o wartości 9. To by pewno załatwiło sprawę.
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.