Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Sortowanie rekordów (góra/dół)
Forum PHP.pl > Forum > Przedszkole
in5ane
Cześć, chciałem zrobić sobie sortowanie rekordów poprzez przyciski góra/dół. Jednakże coś mi to nie prądzi, tak jak powinno. Oto mój przykład:
BAZA
id || title || position (typ: float)

KOD
  1. if (isset($_GET['up'])) {
  2. $id = $_GET['up'];
  3. $query = mysql_query("SELECT position FROM category_menu WHERE id < $id LIMIT 1;");
  4. $row = mysql_fetch_array($query);
  5. $pos_p = $row['position'];
  6. $pos_n = $pos_p+0.0001;
  7. mysql_query("UPDATE category_menu SET position = $pos_n WHERE id = $id;");
  8. }
  9.  
  10. if (isset($_GET['down'])) {
  11. $id = $_GET['down'];
  12. $query = mysql_query("SELECT position FROM category_menu WHERE id > $id LIMIT 1;");
  13. $row = mysql_fetch_array($query);
  14. $pos_p = $row['position'];
  15. $pos_n = $pos_p+0.0001;
  16. mysql_query("UPDATE category_menu SET position = $pos_n WHERE id = $id;");
  17. }
  18. .......................
  19. <a href="index.php?page=2&up='.$row['id'].'">UP</a>
  20. <a href="index.php?page=2&down='.$row['id'].'">DOWN</a>


Pomożecie z tym? Nie wiem, co jest nie tak. Źle w ogóle wpisuje mi te pozycje. Dodaje sobie 0.0001, bo to tak to przy mojej ilości danych się na pewno nie zdubluje.
nospor
1) Pozycja typu całkowitego
2) Algorytm:
masz id do przeniesienia.
pobierasz id rekordu obok (dol lub gora)
zamieniasz wartosci POZYCJA obu rekordów
i po sprawie

zas co do bledow w twoim kodzie:
1)
$pos_n = $pos_p+0.0001; dodajesz niezależnie czy to góra czy dół
2) W zapytaniu musisz dodać ....ORDER BY id asc, gdyż baza niekoniecznie musi ci sortować rekordu wg. twojego założenia.

3)
WHERE id < $id
Skoro pozycje określa pole POZYCJA to nie możesz brać rekordu mniejszego po ID, gdyż on wcale nie musi być mniejszy, ale ma być mniejszy po POZYCJA. Wówczas i do sortowania dajesz POZYCJA a nie ID
in5ane
Zrobiłem sobie coś takiego, ale teraz zauważyłem, że jak chce ostatni rekord (z ostatnim position) podnieść do góry, to on zamienia się pozycją z pierwszym rekordem. Co robię nie tak?
  1. if (isset($_GET['up'])) {
  2. $id = $_GET['up'];
  3. $query = mysql_query("SELECT position FROM category_menu WHERE id = $id;");
  4. $row = mysql_fetch_array($query);
  5. $pos = $row['position'];
  6. $query = mysql_query("SELECT id, position FROM category_menu WHERE position < $pos ORDER BY position ASC LIMIT 1;");
  7. $row = mysql_fetch_array($query);
  8. $id_n = $row['id'];
  9. $pos_n = $row['position'];
  10. mysql_query("UPDATE category_menu SET position = $pos_n WHERE id = $id;");
  11. mysql_query("UPDATE category_menu SET position = $pos WHERE id = $id_n;");
  12. }
  13. if (isset($_GET['down'])) {
  14. $id = $_GET['down'];
  15. $query = mysql_query("SELECT position FROM category_menu WHERE id = $id;");
  16. $row = mysql_fetch_array($query);
  17. $pos = $row['position'];
  18. $query = mysql_query("SELECT id, position FROM category_menu WHERE position > $pos ORDER BY position ASC LIMIT 1;");
  19. $row = mysql_fetch_array($query);
  20. $id_n = $row['id'];
  21. $pos_n = $row['position'];
  22. mysql_query("UPDATE category_menu SET position = $pos_n WHERE id = $id;");
  23. mysql_query("UPDATE category_menu SET position = $pos WHERE id = $id_n;");
  24. }

Niestety nie mogę dać WHERE position < $pos-1 ponieważ może nie istnieć o 1 mniejsze, bo np. rekord był usunięty, więc chciałem zrobić z tym mniejsze większe, ale coś nie działa, jak należy.



@edit: Poradziłem sobie. Dla zainteresowanych, jak problem został rozwiązany już mówię. Otóż w przenoszeniu do góry zrobiłem sortowanie od tyłu (czyli nie ASC, a dałem DESC). Ot cała filozofia. Teraz działa poprawnie.
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.