Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem ze stronicowaniem i sortowaniem
Forum PHP.pl > Forum > PHP
brutal1985
Witam.
Mam mały problem ze stronicowaniem. Otóż mam formularz, którego dane są przesyłane formą POST. Wyniki są zapisywane w oddzielnym pliku, gdzie istnieje mozliwość ich posortowania. Jeśli liczba wyników przekroczy ustaloną wartość (w moim przypadku 25) plik z wynikami jest dzielony na cześci poprzez stronicowanie. Odbywa się to za pomocą metody GET.

Problem polega na tym, że sortowanie zawsze przyjmuje te samo kryterium sortowania(te, które jest pierwsze na liście), niezależnie od wyboru.
Oto mój kod:
  1. $_SESSION['form'] = array(
  2. 'imie_asc' => $_POST['imie_asc'],
  3. 'imie_desc' => $_POST['imie_desc'],
  4. 'nazwisko_asc' => $_POST['nazwisko_asc'],
  5. 'nazwisko_desc' => $_POST['nazwisko_desc'],
  6. 'miejsc_asc' => $_POST['miejsc_asc'],
  7. 'miejsc_desc' => $_POST['miejsc_desc'],
  8. 'pkt_asc' => $_POST['pkt_asc'],
  9. 'pkt_desc' => $_POST['pkt_desc'],
  10. 'program_asc' => $_POST['program_asc'],
  11. 'program_desc' => $_POST['program_desc']
  12. );
  13.  
  14. $formData = array(
  15. 'imie_asc' => !isset($_SESSION['form']) ? null : $_SESSION['form']['imie_asc'],
  16. 'imie_desc' => !isset($_SESSION['form']) ? null : $_SESSION['form']['imie_desc'],
  17. 'nazwisko_asc' => !isset($_SESSION['form']) ? null : $_SESSION['form']['nazwisko_asc'],
  18. 'nazwisko_desc' => !isset($_SESSION['form']) ? null : $_SESSION['form']['nazwisko_desc'],
  19. 'miejsc_asc' => !isset($_SESSION['form']) ? null : $_SESSION['form']['miejsc_asc'],
  20. 'miejsc_desc' => !isset($_SESSION['form']) ? null : $_SESSION['form']['miejsc_desc'],
  21. 'pkt_asc' => !isset($_SESSION['form']) ? null : $_SESSION['form']['pkt_asc'],
  22. 'pkt_desc' => !isset($_SESSION['form']) ? null : $_SESSION['form']['pkt_desc'],
  23. 'program_asc' => !isset($_SESSION['form']) ? null : $_SESSION['form']['program_asc'],
  24. 'program_desc' => !isset($_SESSION['form']) ? null : $_SESSION['form']['program_desc']
  25. );
  26.  
  27. $query_ask = 'SELECT COUNT(*) AS `Ilosc_ucz` FROM `Uczestnicy`';
  28. $query_result = mysql_query($query_ask);
  29. $query_row = mysql_fetch_assoc($query_result);
  30. $ilosc_stron = ceil($query_row['Ilosc_ucz']/25);
  31.  
  32. $strona = isset($_GET['strona'])
  33. && is_numeric($_GET['strona']) ? ($_GET['strona'] >= 1 ? $_GET['strona'] : 1) : 1;
  34. $strona = $strona > $ilosc_stron ? $ilosc_stron : $strona;
  35.  
  36. echo '<div class="edit_header">Wybierz Uczestnika do edycji:</div>';
  37.  
  38. <div class="sortuj">
  39.  
  40. <form method="POST" action="index.php?dzial=panel&link=edit_member">Sortuj według: &nbsp;
  41. <select name="action">
  42.  
  43. <option name="imie_asc" value="' . $formdata['imie_asc'] . '">Imienia rosnąco</option>
  44. <option name="imie_desc" value="' . $formdata['imie_desc'] . '">Imienia malejąco</option>
  45. <option name="nazwisko_asc" value="' . $formdata['nazwisko_asc'] . '">Nazwiska rosnąco</option>
  46. <option name="nazwisko_desc" value="' . $formdata['nazwisko_asc'] . '">Nazwiska malejąco</option>
  47. <option name="miejscowosc_asc" value="' . $formdata['miejsc_asc'] . '">Miejscowości rosnąco</option>
  48. <option name="miejscowosc_desc" value="' . $formdata['miejsc_desc'] . '">Miejscowości malejąco</option>
  49. <option name="pkt_asc" value="' . $formdata['pkt_asc'] . '">Punktu rosnąco</option>
  50. <option name="pkt_desc" value="' . $formdata['pkt_desc'] . '">Punktu malejąco</option>
  51. <option name="program_asc" value="' . $formdata['program_asc'] . '">Programu rosnąco</option>
  52. <option name="program_desc" value="' . $formdata['program_desc'] . '">Programu malejąco</option>
  53. </select>';
  54.  
  55. $sql = 'SELECT * FROM `Uczestnicy`, `Ulice`, `Miejscowosc`, `Program`
  56. WHERE `ID_Ulica` = `Ulica_ID`
  57. AND `ID_Miejsc` = `Miejsce_ID`
  58. AND `ID_Program` = `Program_ID` ORDER BY ';
  59.  
  60. switch ($_POST['action'])
  61. { // 4 otwarty
  62. case $formdata['imie_asc']:
  63. $sql .= 'Imie ASC';
  64. break;
  65. case $formdata['imie_desc']:
  66. $sql .= 'Imie DESC';
  67. break;
  68. case $formdata['nazwisko_asc']:
  69. $sql .= 'Nazwisko ASC';
  70. break;
  71. case $formdata['nazwisko_desc']:
  72. $sql .= 'Nazwisko DESC';
  73. break;
  74. case $formdata['miejsc_asc']:
  75. $sql .= 'Nazwa_miejsc ASC';
  76. break;
  77. case $formdata['miejsc_desc']:
  78. $sql .= 'Nazwa_miejsc DESC';
  79. break;
  80. case $formdata['pkt_asc']:
  81. $sql .= 'ID_Pkt ASC';
  82. break;
  83. case $formdata['pkt_desc']:
  84. $sql .= 'ID_Pkt DESC';
  85. break;
  86. case $formdata['program_asc']:
  87. $sql .= 'Nazwa_programu ASC';
  88. break;
  89. case $formdata['program_desc']:
  90. $sql .= 'Nazwa_programu DESC';
  91. break;
  92. default:
  93. $sql .= 'Nazwisko ASC';
  94. break;
  95. } // 4 zamknięty
  96.  
  97. $sql .= ' LIMIT '.(($strona - 1) * 25).', 25'; // stronicowanie
  98.  
  99. echo '<input type="submit" value="Sortuj" class="button_sortuj">
  100. </form>
  101. </div>';
  102. $result = mysql_query($sql);
  103. );

Wg mnie błąd leży w instrukcji switch. Ale nie wiem, w jaki sposób mam ją zmienić.
Chyba, że ktoś zna lepszy sposób, aby zrobić sortowanie (bez użycia switch).

Widzę, że nikt nie kwapi się z odpowiedzią.
bastard13
Pytanie za 100 pkt: masz name w znaczniku select i option, po co?
Zrób coś takiego, twój select:
  1. <select name="order_by">
  2.  
  3. <option value="Imie_ASC">Imienia rosnąco</option>
  4. <option value="Imie_DESC">Imienia malejąco</option>
  5. <option value="Nazwisko_ASC">Nazwiska rosnąco</option>
  6. <option value="Nazwisko_DESC">Nazwiska malejąco</option>
  7. <option value="Miejscowosc_ASC">Miejscowości rosnąco</option>
  8. <option value="Miejscowosc_DESC">Miejscowości malejąco</option>
  9. <option value="Pkt_ASC">Punktu rosnąco</option>
  10. <option value="Pkt_DESC">Punktu malejąco</option>
  11. <option value="Program_ASC">Programu rosnąco</option>
  12. <option value="Program_DESC">Programu malejąco</option>
  13.  


A zapytanie buduj tak:
  1. $sql = 'SELECT * FROM `Uczestnicy`, `Ulice`, `Miejscowosc`, `Program`
  2. WHERE `ID_Ulica` = `Ulica_ID`
  3. AND `ID_Miejsc` = `Miejsce_ID`
  4. AND `ID_Program` = `Program_ID` ORDER BY ';
  5.  
  6. $orderByPart = explode('_', $_POST('order_by');
  7. $sql .= $orderByPart [0].' '.$orderByPart[1];
  8.  
  9. $sql .= ' LIMIT '.(($strona - 1) * 25).', 25';


A to całe przepisywanie do sesji, później z sesji do tablicy i tego switch'a to wywal.
l0ud
Co zawiera $formdata ? Co się kryje pod tymi róznymi indeksami: nazwisko_asc, imie_asc etc? Wydaje mi się, że coś robisz w dziwny i bardzo nieoptymalny sposób. No i w linii 47 na pewno masz błąd tongue.gif

@bastard13, tak jest niby fajnie i szybko, jednak switch musi pozostać. No chyba, że autor chce pewnego dnia stracić bazę przez sql injection wink.gif
brutal1985
Cytat
  1. $orderByPart = explode('_', $_POST('order_by');

Powinno być chyba:
  1. $orderByPart = explode('_', $_POST['order_by']);

Ale to nie rozwiązuje mojego problemu. Bo o ile na pierwszej stronie z wynikami jest OK, to jeśli liczba wyników nie mieści się na 1 stronie (w moim przypadku 25 rekordów), to niestety wartość zmiennej $orderByPart nie jest przenoszona dalej do kolejnej podstrony.
Zauważ, że mam tam jeszcze zmienną $strona, która odpowiada za ilośc wyników na stronie.
  1. $sql .= ' LIMIT '.(($strona - 1) * 25).', 25';

A wcześniej mam takowe zapytanie:
  1. $query_ask = 'SELECT COUNT(*) AS `Ilosc_ucz` FROM `Uczestnicy`';
  2. $query_result = mysql_query($query_ask);
  3. $query_row = mysql_fetch_assoc($query_result);
  4. $ilosc_stron = ceil($query_row['Ilosc_ucz']/25);
  5. $strona = isset($_GET['strona']) && is_numeric($_GET['strona']) ? ($_GET['strona'] >= 1 ? $_GET['strona'] : 1) : 1;
  6. $strona = $strona > $ilosc_stron ? $ilosc_stron : $strona;


Problem jest z jednoczesnym sortowaniem i stronicowaniem.
mortus
No ale w czym problem:
  1. if(isset($_POST['order_by']) && $_POST['order_by'] != '') {
  2. $orderByPart = explode('_', $_POST['order_by']);
  3. $_SESSION['orderBy'] = $orderByPart [0].' '.$orderByPart[1];
  4. }
  5. $sql = 'SELECT * FROM `Uczestnicy`, `Ulice`, `Miejscowosc`, `Program`
  6. WHERE `ID_Ulica` = `Ulica_ID`
  7. AND `ID_Miejsc` = `Miejsce_ID`
  8. AND `ID_Program` = `Program_ID`
  9. ORDER BY ' . $_SESSION['orderBy'] . ' LIMIT '.(($strona - 1) * 25).', 25';

Dobrze od początku kombinowałeś.

Gwoli uzupełnienia możesz przeczytać artykuł Formularz i stronicowanie - pamiętanie stanu autorstwa nospora.
brutal1985
Czytałem ten artykuł i to właśnie na jego podstawie próbowałem coś wykombinować, ale niestety nie udało mi się. Dzięki za pomoc. Daję "pomógł".

Jeszcze jedno pytanko mam.
Czy w Firefoxie trzeba jakoś ustawić obsługę sesji, bo skrypt ten nie działa mi w Firefoxie, natomiast pod Operą jest OK.

Już działa. Kwestia wyczyszczenia ciasteczek.
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.