Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Zmiana kolejności wyświetlania
Forum PHP.pl > Forum > Przedszkole
Adis92
Witam. Mam problem otóż potrzebuję zrobić możliwość ręcznej zamiany dwóch wartości tabeli odpowiedzialnej za kolejność wyświetlania. Dla przykładu.
Cytat
coś_1 : 1;
coś_2 : 2;
coś_3 : 3;
...

A chce osiągnąć że po naciśnięciu przycisku na np. coś_2 zmieni mi jego wartość z np. coś_3 albo coś_1 w zależności od tego który przycisk wciśniemy.
Czyli po wciśnięciu przycisku + na coś_2 otrzymamy:
Cytat
coś_1 : 2;
coś_2 : 1;
coś_3 :3;
...

a po wciśnięciu przycisku - na coś_2 otrzymamy:
Cytat
coś_1 : 1;
coś_2 : 3;
coś_3 :2;
...


Próbowałem zrobić to samemu lecz efekt jest taki, że po naciśnięciu przycisku w bazie zmienia mi wartość na 0.

  1. function pozycja($id,$move){
  2.  
  3. if(isset($_GET['move'])){
  4. if($move == 'up') $znak = '<';
  5. if($move == 'down') $znak = '>';
  6. }
  7.  
  8. $old = mysql_fetch_array(mysql_query("SELECT pozycja FROM kategoria WHERE id_kategoria='$id'"));
  9. $new = mysql_fetch_array(mysql_query("SELECT id_kategoria, pozycja FROM kategoria WHERE pozycja ".$znak. "'".$old['pozycja']."' ORDER BY pozycja DESC"));
  10.  
  11. while($new){
  12. if($new['pozycja'] . $znak . $old['pozycja']){
  13. mysql_query("UPDATE kategoria SET pozycja = '".$new['pozycja']."' WHERE id_kategoria = '$id'");
  14. mysql_query("UPDATE kategoria SET pozycja = '".$old['pozycja']."' WHERE id_kategoria = '".$new['id_kategoria']."'");
  15. break;
  16. }else{
  17. echo 'To jest ostatnia dostępna pozycja!';
  18. break;
  19. }
  20. }
  21.  
  22. header("Location: index.php?dzial=category");
  23. }

  1. <?php
  2. if(isset($_GET['up_down'])){
  3.  
  4. $id = mysql_escape_string(trim($_GET['up_down']));
  5.  
  6. $pozycja_start = mysql_query("SELECT pozycja AS pos FROM kategoria WHERE id_kategoria='$id'")or die('Podczas pobierania aktualnej pozycji kategorii wystąpił błąd:</br>'.mysql_error());
  7. $view = mysql_fetch_array($pozycja_start);
  8. $pozycja_end = mysql_query("SELECT * FROM kategoria WHERE pozycja != '".$view['pos']."' ORDER BY pozycja")or die('Podczas pobierania listy pozycji kategorii wystąpił błąd:</br>'.mysql_error());
  9. if(isset($_GET['move'])){
  10. pozycja($id,$_GET['move']);
  11. }
  12. ?>
  13. <div id="pozycja">
  14. <a href="?dzial=category" class="close"><p>x</p></a>
  15. <h1>Zmiana kolejności wyświetlania.</h1>
  16. <span class="left">
  17. <p>Aktualna pozycja:</p>
  18. <p class="aktualna"><?php echo $view['pos']; ?></p>
  19. </span>
  20. <div class="up_down">
  21. <a href="?dzial=category&up_down=<?php echo $view['pos']; ?>&move=up" class="up"><p>+1</p></a>
  22. <a href="?dzial=category&up_down=<?php echo $view['pos']; ?>&move=down" class="down"><p>-1</p></a>
  23. </div>
  24. </div>
  25. <?php
  26. }
  27. ?>
b4rt3kk
Chodzi Ci żeby po wciśnięciu przycisku dany wiersz wędrował w górę lub w dół tabeli o jedną pozycję?

  1. $id_obecnego_wiersza = 11; // dla uproszczenia przyjmuje, że wartość jest stała
  2. $pozycja = 3; // jak wyżej


teraz zachodzi pytanie, czy ma uwzględniać sąsiedztwo pozycji czy id. Zakładam, że pozycji.

  1. // gdy chcemy przesunąć pozycję w dół
  2. // najpierw należy pobrać id sąsiedniego elementu
  3. $query = "SELECT id, pozycja FROM kategoria WHERE pozycja > '$pozycja' LIMIT 0,1";
  4. // gdy chcemy przesunąć pozycję w górę
  5. // najpierw należy pobrać id sąsiedniego elementu
  6. $query = "SELECT id, pozycja FROM kategoria WHERE pozycja < '$pozycja' LIMIT 0,1";
  7. // wykonanie zapytania i przekazanie wyników wedle uznania, załóżmy że masz już wynik pod zmienną
  8. $pozycja_sasiada = $row[0];
  9. $id_sasiada = $row[1];
  10. // id i pozycję klikniętego elementu też już mamy
  11. $id_obecnego_wiersza = 11;
  12. $pozycja = 3;
  13. // jedyne co pozostało nam zrobić to wyedytować odpowiednie komórki tabeli
  14. // najpierw dla bieżącego wiersza
  15. $query = "UPDATE kategoria SET pozycja = '$pozycja_sasiada' WHERE id='$id_obecnego_wiersza'";
  16. // a teraz dla jego sąsiada
  17. $query = "UPDATE kategoria SET pozycja = '$pozycja' WHERE id='$id_sasiada'";
  18. // i oczywiście wykonanie powyższych zapytań


To takie dosyć schematyczne rozwiązanie, ale myślę, że załapiesz w czym rzecz.
Adis92
b4rt3kk a więc tak działa ale do momentu jeżeli przenosimy niżej tylko jeden rekord po wybraniu innego rekordu w dół wcześniej przenoszony rekord zamienia się miejscem z nowo wybranym rekordem i nowy ze starym, a nie tak jak powinno być że zamienia się z poprzednim bądź następnym w kolejności. A co do przenoszenia do góry problem jest z limitem gdyż zaczyna przeszukiwanie od 0 czyli analogicznie od zawsze przenosi się na 1 pierwsze miejsce bo jest ono mniejsze od np 8 miejsca.
b4rt3kk
Cytat(Adis92 @ 6.11.2012, 23:37:43 ) *
b4rt3kk a więc tak działa ale do momentu jeżeli przenosimy niżej tylko jeden rekord po wybraniu innego rekordu w dół wcześniej przenoszony rekord zamienia się miejscem z nowo wybranym rekordem i nowy ze starym, a nie tak jak powinno być że zamienia się z poprzednim bądź następnym w kolejności. A co do przenoszenia do góry problem jest z limitem gdyż zaczyna przeszukiwanie od 0 czyli analogicznie od zawsze przenosi się na 1 pierwsze miejsce bo jest ono mniejsze od np 8 miejsca.


Co do pierwszego zdania, nie za bardzo rozumiem, możesz jakoś jaśniej? Na przykładzie? A co do drugiego sprawę załatwi ORDER BY pozycja, odpowiednio DESC i ASC w zależności od tego czy przenosimy w górę czy w dól, bo wyszuka najbliższy rekord.
Adis92
Przykład: coś_1 przenoszę o 1 w dół aż dochodzę np do miejsca 6, następnie klikam w coś_3 żeby zamienić z miejscem coś_4 a zamiast tego coś_3 zamienia się z coś_1 które było na miejscu 6. Czyli teraz coś_1 przenosi się na miejsce 3 a coś_3 na miejsce 6.

Już działa winowajcą było zapytanie wystarczyło dodać odpowiednio ORDER BY DESC I ASC.
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.