Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: sortowanie wybierane ze stronki - kod
Forum PHP.pl > Forum > PHP
Oscar_83
Witam, mam mały problem otóż chciałbym wprowadzić możliwość sortowania po kliknięciu odpowiednio na danym nagłówku tabeli. Tabele mam wczytywane z bazy, podaje kod dla rozjaśnienia sprawy:

  1. <?php
  2. $polaczenie = mysql_connect("localhost", "root", "krasnal") or die("Sprawdź połączenie z serwerem");
  3. mysql_select_db("tabele",$polaczenie);
  4. $query = "SELECT Lp,Imie_i_Nazwisko,Pozycja,Numer_na_koszulce,Wiek,Narodowosc,Uwagi F
    ROM zawodnicy"
    ;
  5. $results = mysql_query($query, $polaczenie)
  6. or die (mysql_error());
  7. $num_zawodnicy1 = mysql_num_rows($results);
  8. $zawodnicy1_zawod=<<<ZAW
  9. <h2><center>Zawodnicy w drużynie</center></h2>
  10. <table width="70%" border="1" cellpadding="2" cellspacing="2" align="center">
  11.  <tr>
  12.  <th>L.p</th>
  13.  <th>Imię i Nazwisko</th>
  14.  <th>Pozycja</th>
  15.  <th>Numer na koszulce</th>
  16.  <th>Wiek</th>
  17.  <th>Narodowosc</th>
  18.  <th>Uwagi</th>
  19.  </tr>
  20. ZAW;
  21. $zawodnicy1_szczegoly = '';
  22. while($linia=mysql_fetch_array($results)){
  23. $Lp = $linia['Lp'];
  24. $Nazwisko = $linia['Imie_i_Nazwisko'];
  25. $Pozycja = $linia['Pozycja'];
  26. $Numer_na_koszulce = $linia['Numer_na_koszulce'];
  27. $Wiek = $linia['Wiek'];
  28. $Narodowosc = $linia['Narodowosc'];
  29. $Uwagi = $linia['Uwagi'];
  30.  
  31. $zawodnicy1_szczegoly .=<<<ZAW
  32.   <tr>
  33. <td>$Lp</td>
  34. <td>$Nazwisko</td>
  35. <td>$Pozycja</td>
  36. <td>$Numer_na_koszulce</td>
  37. <td>$Wiek</td>
  38. <td>$Narodowosc</td>
  39. <td>$Uwagi</td>
  40.   </tr>
  41. ZAW;
  42. }
  43. $zawodnicy1_calosc ="</table>";
  44.  
  45. $zawodnicy1 =<<<ZAWODNICY
  46.  $zawodnicy1_zawod
  47.  $zawodnicy1_szczegoly
  48.  $zawodnicy1_calosc
  49. ZAWODNICY;
  50. echo "W drużynie znajduje się obecnie $num_zawodnicy1 zawodników.";
  51. echo $zawodnicy1;
  52. mysql_close($polaczenie);
  53. ?>

Chciałbym aby była możliwość sortowania z pozycji stronki poprzez kliknięcie na:
L.p
Imię i Nazwisko
Pozycja
Numer na koszulce
Wiek
Narodowosc
Uwagi

Jestem mocno początkujący, choć już naprawde sporo przy tym siedziałem i nie mogę dojść :/
Prosze o pomoc - lub chociaż naprowadzenie mnie.
Z góry bardzo dziękuję
kossa
aby sortować użyj w zapytaniu order by

np:

  1. SELECT Lp,Imie_i_Nazwisko,Pozycja,Numer_na_koszulce,Wiek,Narodowosc,Uwagi FROM zawodnicy ORDER BY Numer_na_koszulce


sortuje na zasadach od a do z
albo

  1. SELECT Lp,Imie_i_Nazwisko,Pozycja,Numer_na_koszulce,Wiek,Narodowosc,Uwagi FROM zawodnicy ORDER BY Numer_na_koszulce DESC


sortuje na zasadach od z do a

w tabeli z nagówków kolumn zrób link, odwołanie do tej samej strony z parametrem, np. index.php?sort=imie albo ?sort=numer

a w kodzie

  1. <?php
  2. if ($_GET["sort"]=="numer") $query = "SELECT Lp,Imie_i_Nazwisko,Pozycja,Numer_na_koszulce,Wiek,Narodowosc,Uwagi F
    ROM zawodnicy order by Numer_na_koszulce"
    ;
  3. else if  ($_GET["sort"]=="numer") $query = "SELECT Lp,Imie_i_Nazwisko,Pozycja,Numer_na_koszulce,Wiek,Narodowosc,Uwagi F
    ROM zawodnicy order by Imie_i_Nazwisko"
    ;
  4. else
  5. $query = "SELECT Lp,Imie_i_Nazwisko,Pozycja,Numer_na_koszulce,Wiek,Narodowosc,Uwagi F
    ROM zawodnicy"
    ;
  6. $results = mysql_query($query, $polaczenie) or die (mysql_error());
  7. //itd.
  8. ?>


Łukasz
Oscar_83
bo ja właśnie zrobiłem to sortowanie tyle że innym sposobem - napewno gorszym:
  1. <?php
  2. $polaczenie = mysql_connect("localhost", "root", "krasnal") or die("Sprawdź połączenie z serwerem");
  3. mysql_select_db("tabele",$polaczenie);
  4. $query = "SELECT Lp,Imie_i_Nazwisko,Pozycja,Numer_na_koszulce,Wiek,Narodowosc,Uwagi F
    ROM zawodnicy ORDER BY Lp ASC "
    ;
  5. $results = mysql_query($query, $polaczenie)
  6. or die (mysql_error());
  7. $num_zawodnicy1 = mysql_num_rows($results);
  8. $zawodnicy1_zawod=<<<ZAW
  9. <h2><center>Zawodnicy w drużynie</center></h2>
  10. <table width="70%" border="1" cellpadding="2" cellspacing="2" align="center">
  11.  <tr>
  12.  <th>L.p</th>
  13.  <th><a href="zaw_sort_nazwa.php">Imię i Nazwisko</a></th>
  14.  <th><a href="zaw_sort_poz.php">Pozycja</a></th>
  15.  <th><a href="zaw_sort_nr.php">Numer na koszulce</a></th>
  16.  <th><a href="zaw_sort_wiek.php">Wiek</a></th>
  17.  <th><a href="zaw_sort_narod.php">Narodowosc</a></th>
  18.  <th>Uwagi</th>
  19.  </tr>
  20. ZAW;
  21. $zawodnicy1_szczegoly = '';
  22. while($linia=mysql_fetch_array($results)){
  23. $Lp = $linia['Lp'];
  24. $Nazwisko = $linia['Imie_i_Nazwisko'];
  25. $Pozycja = $linia['Pozycja'];
  26. $Numer_na_koszulce = $linia['Numer_na_koszulce'];
  27. $Wiek = $linia['Wiek'];
  28. $Narodowosc = $linia['Narodowosc'];
  29. $Uwagi = $linia['Uwagi'];
  30.  
  31. $zawodnicy1_szczegoly .=<<<ZAW
  32.   <tr>
  33. <td>$Lp</td>
  34. <td>$Nazwisko</td>
  35. <td>$Pozycja</td>
  36. <td>$Numer_na_koszulce</td>
  37. <td>$Wiek</td>
  38. <td>$Narodowosc</td>
  39. <td>$Uwagi</td>
  40.   </tr>
  41. ZAW;
  42. }
  43. $zawodnicy1_calosc ="</table>";
  44.  
  45. $zawodnicy1 =<<<ZAWODNICY
  46.  $zawodnicy1_zawod
  47.  $zawodnicy1_szczegoly
  48.  $zawodnicy1_calosc
  49. ZAWODNICY;
  50. echo "W drużynie znajduje się obecnie $num_zawodnicy1 zawodników.";
  51. echo $zawodnicy1;
  52. mysql_close($polaczenie);
  53. ?>

czyli w każdej rubryce zrobiłem odnośnik do innej stronki a stronki różnią się od siebie tylko tym sortowaniem po kolei: ORDER BY L.P, Nazwisko, Pozycja itd itp.
Twój sposób jest dużo szybszy, z tym że ten kod który mi podałeś mam wpisać w ten kod do siebie na górę tak?
PS: zaraz popróbuje

Oki Super!! smile.gif) działa jak należy smile.gif)) a jeśli bym chciał żeby za drugim kliknięciem na tym samym nagłówku sortowało od końca?? wiem że DESC jest odpowiedzialne za sortowanie w drugą stronę tzn od końca ale jak mam je dopisać? po , i po ; nie chce działać winksmiley.jpg

I jeszcze mam jedno pytanie do tego sortowania. Jak zrobić żeby sortowało kolumne Imie_i_Nazwisko względem nazwiska któro w bazie wpisane jest jako drugie (tzn po imieniu), jeśli będzie trzeba to mogę oczywiście w bazie zamienic kolejność imienia i nazwiska ale chciałbym żeby wyświetlało pierwsze imię a potem nazwisko.
Kicok
DESC dodaje się po spacji:
  1. SELECT * FROM tabela ORDER BY jakas_kolumna DESC


A co do kolumny Imie_i_Nazwisko to rozbij ją na dwie: Imie i Nazwisko. Wtedy nie będziesz miał żadnych problemów z sortowaniem.
Oscar_83
no tak ale troche źle chyba to napisałem bo chodziło mi o to DESC ale żeby działało za drugim kliknięciem, a dokładniej: klikam na nagłówek kolumny sortuje mi potem klikam drugi raz i sortuje mi odwrotnie.

a co do tych kolumn to też właśnie mi tak już ktoś sugerował, dzięki wielkie za pomoc.

A co do tego sortowania to uzyskałem ten sam efekt bez if else if else smile.gif wprowadzając zmienną po ORDER BY
np: ORDER BY '$sort'

a potem odnośniki takie jak mi doradzano - i wszystko działa dobrze smile.gif
Pozdrawiam i dziękuję za wszystkie odpowiedzi.
Kicok
No to w zależności od danych z tablicy $_GET tworzysz linki. Jeśli aktualnie sortujesz daną kolumnę rosnąco, to tworzysz link do sortowania tek kolumny malejąco, etc.

  1. <?php
  2.  
  3. // Jeśli przesłane zostały jakieś dane metodą GET to je walidujemy, jeśli nie to u
    stawiamy domyślne
  4. $col = array('lp', 'nazwisko', 'pozycja', 'numer_na_koszulce', 'wiek', 'narodowosc', 'uwagi');
  5. $sort = ( isset( $_GET['sort'] ) && in_array( strtolower( $_GET['sort'] ), $col ) ) ? strtolower( $_GET['sort'] ) : 'lp';
  6. $order = ( isset( $_GET['order'] ) && in_array (strtolower( $_GET['order'] ), array('asc', 'desc') ) ) ? strtolower( $_GET['order'] ) : 'asc';
  7.  
  8.  
  9. // Wykonujemy zapytanie i wyświetlamy wyniki
  10. // ...
  11.  
  12.  
  13. // Tworzymy linki
  14. echo('<a href="plik.php?sort=lp&amp;order=' . ( ( $sort == 'lp' ) && ( $order == 'asc' ) ) ? 'desc' : 'asc' . '">Lp</a>');
  15. echo('<a href="plik.php?sort=nazwisko&amp;order=' . ( ( $sort == 'nazwisko' ) && ( $order == 'asc' ) ) ? 'desc' : 'asc' . '">Nazwisko</a>');
  16. echo('<a href="plik.php?sort=pozycja&amp;order=' . ( ( $sort == 'pozycja' ) && ( $order == 'asc' ) ) ? 'desc' : 'asc' . '">Pozycja</a>');
  17. ?>
Oscar_83
Dzięki za pomoc.
domis86
do takiego sortowania ładnie byłoby zrobić sobie uniwersalną klasę na przyszłość

powinna zawierac takie metody jak:

__construct($columnsTable)
- do constructora przekazujesz liste kolumn tabeli - np:
  1. <?php
  2. array('lp', 'nazwisko', 'pozycja', 'numer_na_koszulce', 'wiek', 'narodowosc', 'uwagi')
  3. ?>

- pobiera on z $_GET od razu 'sort' i 'order' (moga to byc tez liczby oznaczajace którą z kolei kolumne sortowac a nie nazwy kolumn)


getSortColumn() - zwraca nazwe kolumny po ktorej ma sie sortowac zapytanie SQL

getOrder() - zwraca DESC albo ASC potrzebne do SQL

getHeaderLink($nr) - zwraca czesc linku odpowiadajaca za sortowanie dla kolumny i numerze $nr, np:
'sort=4&order=1'
-jezeli $nr to ta kolumna co zwraca w getSortColumn to order bedzie rowny:
a ) 1 - gdy getOrder() zwraca ASC
b ) 0 - gdy getOrder() zwraca DESC
-gdy $nr to kolumna inna niz w getSortColumn to order bedzie rowny 0
-przykladowe uzycie tej metody:
  1. <a href="plik.php?<? echo $sortingClass->getHeaderLink(0); ?>">pierwsza kolumna</a>
  2. <a href="plik.php?<? echo $sortingClass->getHeaderLink(1); ?>">druga kolumna</a>
  3. <a href="plik.php?<? echo $sortingClass->getHeaderLink(2); ?>">trzecia kolumna</a>



PS: można by też troche ulepszyc tą klase tak, żeby obsługiwała paginacje, czyli stronicowanie
wtedy trzeba by przekazywać jej do konstruktora też ilość wszystkich wierszy w tabeli
i dodać funkcje zwracające linki do poszczegolnych stron
i zmodyfikowac getHeaderLink zeby dawało do linka nr aktualnej strony też
guitar.gif
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.