Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Sortowanie wyników
Forum PHP.pl > Forum > Przedszkole
arek33
Witam,

Mam taką tabelkę z wynikami, sortowaną wg nazwiska. Ale chciałbym jeszcze zrobić sortowanie wg imienia, nazwiska i zarobków po kliknięciu przez użytkownika w nagłówek. Przykład na Allegro: http://www.allegro.pl/26014_antyki.html - nazwa, cena, z dostawą etc. Po jednym kliknięciu sortuje od A do Z w nazwie, natomiast tam, gdzie pojawiają się liczby sortuje od najniższej ceny do najwyższej. No i działa to też w drugą stronę - gdy jest już posortowane np. wg nazwy od A do Z to po kliknięciu mamy od Z do A.

  1. <?php
  2.  
  3. $wynik = mysql_query("SELECT * FROM zarobki ORDER by nazwisko")
  4. or die('Błąd zapytania.');
  5.  
  6. if(mysql_num_rows($wynik) > 0) {
  7.        echo "<table id=\"grid\">";
  8.        echo "<tr class=\"nt\">";
  9.        echo "<td>".Lp."."."</td>";
  10.    echo "<td>".Imię."</td>";
  11.        echo "<td>".Nazwisko."</td>";
  12.        echo "<td>".Zarobki."</td>";
  13.        echo "<td>".E."</td>";
  14.    echo "<td>".U."</td>";
  15.    echo "</tr>";
  16. while($r = mysql_fetch_array($wynik)) {
  17.        echo "<tr class=\"nt\">";
  18.        echo "<td>".$i++."."."</td>";
  19.        echo "<td>".$r['imie']."</td>";
  20.        echo "<td>".$r['nazwisko']."</td>";
  21.        echo "<td>".$r['zarobki']."</td>";
  22.        echo "<td style=\"text-align:center\" width=\"35px\">
  23.                    <a href=\"edit.php?a=edit&id={$r['id']}\"><img src=\"i/edit.gif\"></a></td>";
  24.        echo "<td width=\"35px\" style=\"text-align:center\">
  25.                    <a href=\"del.php?a=del&id={$r['id']}\"><img src=\"i/del.png\"></a></td>";
  26.        echo "</tr>";
  27.              
  28.   }
  29.        echo "</table>";
  30.        echo "<p class=\"pasek\">* - Rekord był przynajmniej raz edytowany.</p>";
  31.      
  32. }
  33.  
  34. else { echo "<h4>Brak danych w bazie. <a href=\"add.php\">Wprowadź</a> dane.</h4>"; }
  35.  
  36. require('footer.php');
  37.  
  38. ?>


Myślałem o sortowanie ze zmienną ("SELECT * FROM zarobki ORDER by $sort"), ale nie bardzo mam pomysł, aby się za to zabrać. Mógłby mi ktoś w tej kwestii pomóc?

Pozdrawiam,
Arek
TomASS
Tak - zrób tak jak to nazwałeś: "sortowanie ze zmienną" plus
  1. ORDER BY pole DESC
albo
  1. ORDER BY pole ASC
aby mieć kolejność rosnącą lub malejącą.
DREEMus
  1. SELECT * FROM `zarobki` ORDER BY `nazwisko` ASC
od A do Z
  1. SELECT * FROM `zarobki` ORDER BY `nazwisko` DSC
od Z do A
kajzur
Może prześlij zmienną get? No wiesz, dajesz jakąś standardową, np nazwisko, i przy kliknieciu zmieniasz tę zmienną i pobierasz wg niej ;>
piotrooo89
jeśli chcesz zrobić to dynamicznie musisz użyć JS. ja polecam mintAjax. http://mintajax.pl/Przewodnik/Kontrolki/ na samym dole masz Dynamiczna tabela i myślę że sobie dostosujesz do własnych potrzeb.

//EDIT

lekki byczek się wkradł.
TomASS
A do czego zaraz AJAX? Aby "dynamicznie" (tzn. bez udziału bazy danych, korzystając jedynie z przeglądarki) posortować tabelę wystarczy zwykły JS zobacz.
piotrooo89
Cytat(TomASS @ 7.04.2009, 12:39:47 ) *
A do czego zaraz AJAX?


tak tak. znów użyłem skrótu myślowego chodzi mi o JS oczywiście.
arek33
Zrobiłem w ten sposób:

  1. <?php
  2.  
  3. $wynik = mysql_query("SELECT * FROM zarobki ORDER by nazwisko")
  4. or die('Błąd zapytania.');
  5.  
  6. if(mysql_num_rows($wynik) > 0) {
  7.        echo "<table id=\"grid\">";
  8.        echo "<tr class=\"nt\">";
  9.        echo "<td>".Lp."."."</td>";
  10.    echo "<td>".Imię."</td>";
  11.        echo "<td>".Nazwisko."</td>";
  12.        echo "<td>".Zarobki."</td>";
  13.        echo "<td>".E."</td>";
  14.    echo "<td>".U."</td>";
  15.    echo "</tr>";
  16. while($r = mysql_fetch_array($wynik)) {
  17.        echo "<tr class=\"nt\">";
  18.        echo "<td>".$i++."."."</td>";
  19.        echo "<td>".$r['imie']."</td>";
  20.        echo "<td>".$r['nazwisko']."</td>";
  21.        echo "<td>".$r['zarobki']."</td>";
  22.        echo "<td style=\"text-align:center\" width=\"35px\">
  23.                    <a href=\"edit.php?a=edit&id={$r['id']}\"><img src=\"i/edit.gif\"></a></td>";
  24.        echo "<td width=\"35px\" style=\"text-align:center\">
  25.                    <a href=\"del.php?a=del&id={$r['id']}\"><img src=\"i/del.png\"></a></td>";
  26.        echo "</tr>";
  27.              
  28.   }
  29.        echo "</table>";
  30.        echo "<p class=\"pasek\">* - Rekord był przynajmniej raz edytowany.</p>";
  31.      
  32. }
  33.  
  34. else { echo "<h4>Brak danych w bazie. <a href=\"add.php\">Wprowadź</a> dane.</h4>"; }
  35.  
  36. require('footer.php');
  37.  
  38. ?>


ale coś mi nie działa. Nie wyrzuca żadnego błędu, ale sortowanie nie działa w ogóle.
piotrooo89
http://olaszewski.com/2009/04/07/dynamiczna-tabelka-a-mysql/ przeczytaj uważnie.

podpowiedź: <thead> <tbody>
arek33
Nie rozumiem, wrzuciłem zupełnie inny kod i normalnie mi wyświetliło na forum to co skopiowałem z pliku index.php, a dzisiaj widzę, że powyższy kod różni się zaledwie dwoma linijkami od poprzedniego.

Także jeszcze raz wklejam to, co chciałem zrobić wczoraj:

  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  4. <title>zarobki</title>
  5. <link rel="stylesheet" href="style.css" type="text/css"/>
  6.  
  7. <script type="text/javascript">
  8. function OnLoad()
  9. {
  10.    var grid = mint.gui.CreateGridWidget("grid");
  11.  
  12.    grid.AddSortCells();
  13. }        
  14. </script>
  15.  
  16. </head>
  17.  
  18. <body>
  19.  
  20. <?php
  21.  
  22. $wynik = mysql_query("SELECT * FROM zarobki ORDER by nazwisko")
  23. or die('Błąd zapytania.');
  24.  
  25. if(mysql_num_rows($wynik) > 0) {
  26.       echo "<table id=\"grid\">";
  27.             echo "<thead>";
  28.       echo "<tr class=\"nt\">";
  29.       echo "<td>".Lp."."."</td>";
  30.             echo "<td>".Imię."</td>";
  31.       echo "<td>".Nazwisko."</td>";
  32.       echo "<td>".Zarobki."</td>";
  33.       echo "<td>".E."</td>";
  34.             echo "<td>".U."</td>";
  35.             echo "</tr>";
  36.             echo "</thead>";
  37.             echo "<tbody>";
  38. while($r = mysql_fetch_array($wynik)) {
  39.       echo "<tr class=\"nt\">";
  40.       echo "<td>".$i++."."."</td>";
  41.       echo "<td>".$r['imie']."</td>";
  42.       echo "<td>".$r['nazwisko']."</td>";
  43.       echo "<td>".$r['zarobki']."</td>";
  44.       echo "<td style=\"text-align:center\" width=\"35px\">
  45.                         <a href=\"edit.php?a=edit&id={$r['id']}\"><img src=\"i/edit.gif\"></a></td>";
  46.       echo "<td width=\"35px\" style=\"text-align:center\">
  47.                         <a href=\"del.php?a=del&id={$r['id']}\"><img src=\"i/del.png\"></a></td>";
  48.       echo "</tr>";
  49.             echo "</tbody>";
  50.              
  51.  }
  52.       echo "</table>";
  53.      
  54. }
  55.  
  56. else { echo "<h4>Brak danych w bazie. <a href=\"add.php\">Wprowadź</a> dane.</h4>"; }
  57.  
  58. require('footer.php');
  59.  
  60. ?>
piotrooo89
nie przeczytałeś uważnie... gdzie dołączasz skrypt mintAjaxa?
arek33
W head mam dodać:

  1. <script type="text/javascript" src="/js/mintAjax.js"></script>


?
piotrooo89
tak tylko w scr masz podać ścieżkę do Twojego umiejscowienia skryptu. na strona mintajax.pl masz napisane jak zainicjować.
arek33
O poprawnym źródle do js wiem, ale nie bardzo wiem jak mam zainicjować to. Może jakiś przykład?

PS. Sorry, ale jestem zupełnie początkującym smile.gif
piotrooo89
Twój head powinien wyglądać tak:

  1. <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  2. <title>zarobki</title>
  3. <link rel="stylesheet" href="style.css" type="text/css"/>
  4.  
  5. <script type="text/javascript" src="/js/mintAjax.js"></script>
  6.  
  7. <script type="text/javascript">
  8. function OnLoad()
  9. {
  10. var grid = mint.gui.CreateGridWidget("grid");
  11.  
  12. grid.AddSortCells();
  13. }
  14.  
  15. </head>


a to co to jest?

  1. <?php
  2. echo "<td>".Lp."."."</td>";
  3. echo "<td>".Imię."</td>";
  4. echo "<td>".Nazwisko."</td>";
  5. echo "<td>".Zarobki."</td>";
  6. echo "<td>".E."</td>";
  7. echo "<td>".U."</td>";
  8. ?>


nie masz tu żadnych zmiennych powinno być:

  1. <?php
  2. echo "<td>Lp.</td>";
  3. echo "<td>Imię</td>";
  4. echo "<td>Nazwisko</td>";
  5. echo "<td>Zarobki</td>";
  6. echo "<td>E</td>";
  7. echo "<td>U</td>";
  8. ?>
arek33
Head dokładnie tak wygląda jak opisałeś. Zmieniłem w znacznikach <td> wartości i nadal to samo. Po najechaniu na nagłówek pojawia się łapka, ale skrypt nie działa.
piotrooo89
omg... tu jest byk:

  1. <body onLoad="onLoad();">


no i teraz już musi być.
arek33
Niestety, dalej to samo. Wkleję jeszcze raz kod...

  1. <head>
  2. <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  3. <title>zarobki</title>
  4. <link rel="stylesheet" href="style.css" type="text/css"/>
  5.  
  6. <script type="text/javascript" src="http://serwer.pl/js/mintAjax.js"></script>
  7.  
  8. <script type="text/javascript">
  9. function OnLoad()
  10. {
  11.   var grid = mint.gui.CreateGridWidget("grid");
  12.  
  13.   grid.AddSortCells();
  14. }        
  15.  
  16. </head>
  17.  
  18. <body onLoad="onLoad();">
  19.  
  20. <?php ... ?>
  21.  
  22. </body>
  23. </html>
piotrooo89
kurka no mam tak samo i mi hula. na pewno masz dobrą ścieżkę do pliku? a spróbuj kilka razy kliknąć na ten nagłówek po którym ma być sortowane.
arek33
Próbowałem też tak robić, ale elektu nie ma, próbowałem też w zapytaniu usunąć sortowanie, ale też nic nie daje :<
piotrooo89
ale rozumiem że łączysz się z bazą? wyświetlają Ci się rekordy.
arek33
Oczywiście, że tak. Tabelka jest, dodaje nowy rekord, pojawia się również w tabeli, wszystko chodzi, tylko to sortowanie nie działa sad.gif
piotrooo89
  1. <?php
  2. echo "</tbody>";
  3. ?>


wywal to za pętle.

#EDIT
no i przed pętla daj sobie $i=1;
nospor
moze zadam glupie pytanie ale do jasnej ciasnej czemu wogole zaprzatacie sobie glowe dynamicznym sortowaniem js?
A jak grid bedzie wielostronicowy (podany przyklad z allegro) to wowczas posortujecie tylko daną strone a nie caly zbior danych. Posortowaną jedną strone to se można.... winksmiley.jpg

edit:
@arek przypomnialem sobie ze przygotowalem nakladke EPager na moją klase Pager
http://nospor.pl/pager-2.5.1-oraz-epager-n28.html
zawiera ona między innymi automatyczne zarzadzanie sortowaniem. moze ci sie przyda smile.gif
arek33
Cytat(piotrooo89 @ 9.04.2009, 12:42:39 ) *
  1. <?php
  2. echo "</tbody>";
  3. ?>


wywal to za pętle.

#EDIT
no i przed pętla daj sobie $i=1;

Bez zmian.

Cytat(nospor @ 9.04.2009, 12:53:50 ) *
moze zadam glupie pytanie ale do jasnej ciasnej czemu wogole zaprzatacie sobie glowe dynamicznym sortowaniem js?
A jak grid bedzie wielostronicowy (podany przyklad z allegro) to wowczas posortujecie tylko daną strone a nie caly zbior danych. Posortowaną jedną strone to se można.... winksmiley.jpg

edit:
@arek przypomnialem sobie ze przygotowalem nakladke EPager na moją klase Pager
http://nospor.pl/pager-2.5.1-oraz-epager-n28.html
zawiera ona między innymi automatyczne zarzadzanie sortowaniem. moze ci sie przyda smile.gif

Dzięki nospor, przy tym projekcie nie będzie stronicowania i dynamiczna zmiana sortowania jest najlepszy rozwiązaniem. Ale nie ukrywam, że już zaciekawiło mnie Twoje rozwiązanie i być może w niedalekiej przyszłości je wykorzystam. Raz jeszcze - dzięki smile.gif
piotrooo89
a powiedz czy ten przykład zatrybił, bo mnie ciekawość zżera czy jest ok?
arek33
Zrobiłem jeszcze tak (ręcznie wprowadziłem dane, bez pobierania):

  1. <head>
  2. <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  3. <title>zarobki</title>
  4. <link rel="stylesheet" href="style.css" type="text/css"/>
  5.  
  6. <script type="text/javascript" src="mintAjax.js"></script>
  7.  
  8. <script type="text/javascript">
  9. function OnLoad()
  10. {
  11. var grid = mint.gui.CreateGridWidget("grid");
  12.  
  13. grid.AddSortCells();
  14. }
  15.  
  16. </head>
  17.  
  18.  
  19. <body onLoad="onLoad();">
  20.  
  21. <table id="grid">
  22. <tr>
  23. <td>Liczba</td>
  24. <td>Tekst</td>
  25. <td>Data</td>
  26. </tr>
  27. </thead>
  28. <tr>
  29. <td>15</td>
  30. <td>Lorem</td>
  31. <td>05-02-2006</td>
  32. </tr>
  33. <tr>
  34. <td>5.8</td>
  35. <td>Ipsum</td>
  36. <td>02-05-2007</td>
  37. </tr>
  38. <tr>
  39. <td>26</td>
  40. <td>Dolor</td>
  41. <td>12-08-2005</td>
  42. </tr>
  43. <tr>
  44. <td>5.2</td>
  45. <td>Sit Amet</td>
  46. <td>25-10-2007</td>
  47. </tr>
  48. </tbody>
  49.  
  50.  
  51.  
  52.  
  53. </body>
  54. </html>


Ale też niestety nie działa. Już nawet wziąłem pod uwagę to, że może być coś z serwerem i sprawdziłem na dwóch innych - to samo sad.gif
gsk
  1. <?php
  2. <body onload="OnLoad()">
  3. ?>


wielkosc liter odgrywa jednak w tym przypadku duza role winksmiley.jpg
arek33
I teraz OK - działa. Ale tylko dla liczb - sortuje je od najmniejszej do największej, natomiast po drugim kliknięciu odwrotnie. Na wyrazy nie działa.

Mam w kolumnie Imię następujące osoby: Jana, Stefana, adsdfd i Olgę. Jak kliknę raz to mam następującą kolejność: Jan, Olga, Stefan, afsdfd. Za drugim kliknięciem w "Imię" mam kolejność: afsdfd, Stefan, Olga, Jan.
gsk
ABCD... abcd.... - co w tym dziwnego? Jan, Olga, Stefan noi od nowa tylko od małych literek ;D

Poczytaj dokumentacje:
caseSensitive - określa, czy przy sortowaniu rozróżniana jest wielkość liter (wartość domyślna: true)
arek33
No i już wszystko ładnie działa. Na koniec pasowałoby jeszcze napisać co należy zrobić, aby działało na małe i duże litery. To dla osób mających ten problem i poszukujących.

W sekcji <head> należy dodać jedną linijkę:

  1. grid.caseSensitive = false;


Czyli całość powyższej sekcji powinna wyglądać mniej więcej tak:

  1. <head>
  2. <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  3. <title>zarobki</title>
  4. <link rel="stylesheet" href="style.css" type="text/css"/>
  5. <script type="text/javascript" src="mintAjax.js"></script>
  6.  
  7. <script type="text/javascript">
  8. function OnLoad()
  9. {
  10. var grid = mint.gui.CreateGridWidget("grid");
  11.  
  12. grid.AddSortCells();
  13. grid.caseSensitive = false;
  14. }
  15.  
  16. </head>
  17.  
  18. <body onload="OnLoad()">


Wszyscy, którzy uczestniczyli w tej dyskusji i włożyli w problem swój wkład zostali nagrodzeni punktami. Dzięki za pomoc smile.gif

Pozdrawiam

O, jest jeszcze jedna rzecz, co prawda bardziej kosmetyczna, ale .... W ostatnich dwóch kolumnach mam opcję "Edytuj" i "Usuń". Chciałbym te dwie kolumny wykluczyć z opcji sortowania. Da się to zrobić ? smile.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.