Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sortowanie po kliknięciu w link.
Forum PHP.pl > Forum > PHP
progman
Witam, mam problem z dołączeniem do mojego modułu sortowania wyników z bazy danych, chodzi mi że mam pola np, Imie, Nazwisko i dorobione strzałki sortujące rosnąco oraz malejąco przy oby dwóch kolumnach, teraz pytanie jak zrobić aby po kliknięciu w strzałke sie posortowało. Jak wykonać zapytanie którego chce użyć? Kod poniżej.

  1. <?php
  2. '<a href="osoby.php?order=nazwisko&order=desc">';
  3. ?>
Cysiaczek
Oj. Widzę, że możemy się nieporozumieć sad.gif
taki kod jak podales jest błędny, bo masz
order=nazwisko
order=desc

Rozumiem, ze chciales po prostu w ten sposob zapytac sie bazy i dostac posortowane wyniki. Problem w tym, ze php przetwarza URL-e.
  1. <?php
  2. $_GET['order']='nazwisko';
  3. $_GET['order']='desc';
  4. ?>

Czy juz zauważyłeś błąd? 2x przypisujesz wartosc tej samej zmiennej. Tak być nie może.
osoby.php?pole=nazwisko&order=desc

W takim układzie możesz wstawić zmienne do zapytania SQL w taki saposób
  1. <?php
  2. "SELECT * FROM db_name ORDER BY $_GET['pole'] $_GET['order']"
  3. //oto twoje zapytanie: select * from db_name order by nazwisko desc
  4. ?>
TomASS
Po pierwsze primo, muszisz troszkę przerobić linka:
  1. <?php'<a href="osoby.php?order=nazwisko&order_by=desc">';?>


po drugie musisz się troszkę zabezpieczyć:

  1. <?php
  2. $odrder = mysql_escape_string($_GET['order']);
  3. $odrder_by = mysql_escape_string($_GET['order_by']);
  4. ?>



  1. SELECT * FROM tabela WHERE warunki ORDER BY '$order' $order_by;



-------------------------------------------------------edit------------------------------------------------
szkoda, że forum nie pokazuje czasu napisania odpowiedzi z dokładnością co do sekundy tongue.gif
Thaal
ech...

po pierwsze - zdecyduj się co chcesz mieć podpięte pod zmienną order - "nazwisko" czy "desc"

możesz zrobić coś takiego:

  1. <?php
  2. '<a href="osoby.php?order1=nazwisko&order2=desc">';
  3. ?>


a później formułując zapytanie SQL:
  1. <?php
  2.  
  3. $sql = "select * from nazwiska";
  4.  
  5. if((isset($_GET['order2']) && (isset($_GET['order1']))
  6. {
  7.  
  8.  $zm1 = mysql_escape_string($_GET['order1']);
  9.  
  10.  if($_GET['order2'] == 'desc')
  11.  {
  12. $sql .= " order by ".$zm1." DESC ";
  13.  } else {
  14. $sql .= " order by ".$zm1." ASC";
  15.  }
  16. }
  17. ?>



---
znaczy sięjakies zawody? konkurs??
Ja_Szczur
to samo, trochę bezpieczniej:

  1. <?php
  2. $fields = array( 'imie', 'nazwisko', ... ); // lista dostępnych pól
  3.  
  4. $field = in_arrray( $_GET['field'] , $fields ) ? $_GET['field'] : 'id' ; // id - domyślnie
  5. $order = $_GET['order'] == 'desc' ? 'desc' : 'asc' ; // asc - domyślnie
  6.  
  7. $sql = 'SELECT * FROM `tabela` ORDER BY '.$field.' '.$order ;
  8. ?>


---
@TomASS: dokładnie biggrin.gif
i tak się spóźniłem :]
progman
No coś jest nie tak, bo jak wrzucam kod to nie wyświetla mi tabeli ani żadnych danych, dopisuję że działam na bazie POSTGRESQL.
Thaal
sprawdź jakie zapytanie jest generowane i wysyłane do Postgresa przez php
progman
$sql = 'SELECT * FROM osoby_data ORDER BY '.$field.' '.$order' ;
Thaal
po $order nie powinno być tego -> '


linia powinna wyglądać tak:


  1. <?php
  2. $sql = 'SELECT * FROM osoby_data ORDER BY '.$field.' '.$order;
  3. ?>
progman
Cytat(Thaal @ 14.07.2006, 10:34 ) *
po $order nie powinno być tego -> '
linia powinna wyglądać tak:
  1. <?php
  2. $sql = 'SELECT * FROM osoby_data ORDER BY '.$field.' '.$order;
  3. ?>


Mimo wszystko dalej kicha, nic się nie wyświetla.
nospor
zadam glupio-mądre pytanie:
Czy ty oprocz tej jednej linijki co ci napisali masz jeszcze cos w kodzie?
Jesli tak: pokaz nam
jesli nie: no to nic dziwnego ze ci sie nic nie wyswietla smile.gif
progman
Proszę bardzo winksmiley.jpg

  1. <?php
  2. include ("config.php");
  3. include ("baza.php");
  4. include ("modol_osoby2.php");
  5.  
  6.  
  7. print '';
  8.  
  9. $tab_data[0][1]='id';
  10. $tab_data[0][2]='Szczegóły';
  11.  
  12. $tab_data[1][1]='nazwisko';
  13. $tab_data[1][2]='Nazwisko <a href="osoby.php?order1=nazwisko&order2=desc"><IMG SRC="images/str1.jpeg">';
  14.  
  15. $tab_data[2][1]='imie';
  16. $tab_data[2][2]='Imię <a href="osoby.php?pole=nazwisko&order=desc"><IMG SRC="images/str1.jpeg">';
  17.  
  18. $tab_data[3][1]='nr_ewid';
  19. $tab_data[3][2]='Nr Ewid. <IMG SRC="images/str1.jpeg">';
  20.  
  21. $tab_data[4][1]='id_stanowiska';
  22. $tab_data[4][2]='ID Stanowiska <IMG SRC="images/str1.jpeg">';
  23.  
  24.  
  25.  
  26. $tab_sql='SELECT * FROM osoby_data WHERE time_del is Null';
  27.  
  28.  
  29. $tab_cols=5;
  30.  
  31.  
  32. tabelka();
  33. ?>


I drugi modół: "modol_osoby2.php"
  1. <?php
  2.  
  3. function tabelka()
  4. {
  5.  global $tab_data, $tab_sql, $tab_cols, $HTTP_GET_VARS, $conn;
  6.  
  7.  //ilosc rekordow na stronie
  8.  $na_stronie=10;
  9.  
  10.  //ilosc rekordow
  11.  $res1=pg_query($conn, 'SELECT count(id) as ilosc FROM ('.$tab_sql.') ddd');
  12.  $ilosc_rek=pg_result($res1, 0, 'ilosc');
  13.  
  14.  //biezaca strona
  15.  if (isset($HTTP_GET_VARS['pg']))
  16.  {
  17. $pg=$HTTP_GET_VARS['pg'];
  18.  }
  19.  else
  20.  {
  21. $pg=0;
  22.  }
  23.  
  24.  //rekordy dla biezacej strony
  25.  $res2=pg_query($conn, $tab_sql.' LIMIT '.$na_stronie.' OFFSET '.($pg * $na_stronie));
  26.  
  27.  if ($pg*$na_stronie>=$ilosc_rek)
  28.  {
  29. echo "Strona poza zakresem<br>";
  30.  }
  31.  else
  32.  {
  33.  
  34.  
  35. //naglowki tabeli
  36. echo "<table class='grid'><tr>";
  37. echo'<TR><TH colspan="6" scope="colgroup">Lista Osób</TH></TR>';
  38.  
  39. for ($x=0; $x<$tab_cols; $x++)
  40. {
  41.  echo "<th class='gridheader'>".$tab_data[$x][2]."</th>";
  42. }
  43.  
  44. echo "</tr>";
  45. //kolejne rekordy
  46. for ($y=0; ($y<$na_stronie) and ($pg*$na_stronie+$y<$ilosc_rek); $y++)
  47. {
  48.  echo "<tr>";
  49.  //kolejne kolumny
  50.  
  51. echo'<TD class="grids"><A href="osoba.php?id='.pg_result($res2, $y, $tab_data[0][1]).'">Szczegóły</a></td>';
  52.  
  53.  for ($x=1; $x<$tab_cols; $x++)
  54.  {
  55. echo "<td class='gridcell'>".pg_result($res2, $y, $tab_data[$x][1])."</td>";
  56.  }
  57.  
  58.  echo "</tr>";
  59.  
  60. }
  61.  
  62. echo "</table>";
  63.  }
  64. }
  65. ?>
nospor
Wiesz, bardziej mi chodzilo o ten kawalek, w ktorym wykorzystujesz to co ci powiedzieli w tym topicu. A ty zawaliles nas kupą kodu, w ktorym na dodatek nie ma nigdzie tego co ci tu mowiono.
Oszczędź więc nam czasu i podaj tylko niezbedny kawalek smile.gif
Thaal
1)
w tym fragmencie stosuj albo "order1" i "order2" albo "pole" i "order" - nazwy zmiennych muszą być takie same

  1. <?php
  2. $tab_data[1][1]='nazwisko';
  3. $tab_data[1][2]='Nazwisko <a href="osoby.php?order1=nazwisko&order2=desc"><IMG SRC="images/str1.jpeg">';
  4.  
  5. $tab_data[2][1]='imie';
  6. $tab_data[2][2]='Imię <a href="osoby.php?pole=nazwisko&order=desc"><IMG SRC="images/str1.jpeg">'
  7. ?>


2)
zapytanie (to chyba chodzi o to: $tab_sql='SELECT * FROM osoby_data WHERE time_del is Null' ) powinno na postgresie przejść - przed chwilą sprawdzałem (na v 8.1.3)
progman
Thaal mam w ten sposób i nie wyświetla tabelki z wynikami tylko znika i 0 rezultatów

  1. <?php
  2. print '';
  3.  
  4. $tab_data[0][1]='id';
  5. $tab_data[0][2]='Szczegóły';
  6.  
  7. $tab_data[1][1]='nazwisko';
  8. $tab_data[1][2]='Nazwisko <a href="osoby.php?order1=nazwisko&order2=desc"><IMG SRC="images/str1.jpeg">';
  9.  
  10. $tab_data[2][1]='imie';
  11. $tab_data[2][2]='Imię';
  12.  
  13. $tab_data[3][1]='nr_ewid';
  14. $tab_data[3][2]='Nr ewid.';
  15.  
  16. $tab_data[4][1]='id_stanowiska';
  17. $tab_data[4][2]='ID Stanowiska';
  18.  
  19. $tab_sql='SELECT * FROM osoby_data WHERE time_del is Null';
  20.  
  21. if((isset($_GET['order2']) && (isset($_GET['order1']))
  22. {
  23.  
  24.  $zm1 = ($_GET['order1']);
  25.  
  26.  if($_GET['order2'] == 'desc')
  27.  {
  28. $tab_sql .= " order by ".$zm1." DESC ";
  29.  } else {
  30. $tab_sql .= " order by ".$zm1." ASC";
  31.  }
  32.  
  33. $tab_cols=5;
  34.  
  35. tabelka();
  36. ?>


Przy czym dodam że gdy nie mam kodu:
  1. <?php
  2. if((isset($_GET['order2']) && (isset($_GET['order1']))
  3. {
  4.  
  5.  $zm1 = ($_GET['order1']);
  6.  
  7.  if($_GET['order2'] == 'desc')
  8.  {
  9. $tab_sql .= " order by ".$zm1." DESC ";
  10.  } else {
  11. $tab_sql .= " order by ".$zm1." ASC";
  12.  }
  13. ?>

To w tedy jest OK, normalnie dostaje wyniki tworzy się tabela itp ale dalej nie ma funkcji sortowania. Jakieś sugestie macie? winksmiley.jpg
bendi
To taka mała uwaga, odsyłanie danych do serwera tylko po to żeby je posortować to nie jest najbardziej optymalne rozwiązanie - można spróbować tak:
http://bedkowski.pl/p/js/sorttable/

Mój się coś kaszani, ale jest fajna stronka: http://www.dhtmlgoodies.com/index.html?page=tableWidgets
nospor
jak na moj gust to ktos nie umie podomykac nawiasow { (
Kod
<?php
if((isset($_GET['order2']) && isset($_GET['order1']))
{

   $zm1 = ($_GET['order1']);

   if($_GET['order2'] == 'desc')
   {
      $tab_sql .= " order by ".$zm1." DESC ";
   } else {
      $tab_sql .= " order by ".$zm1." ASC";
   }
}
?>


@bendi a posortuj tak tablice ktora jest stronicowana smile.gif
Thaal
jej... tato...

tu jest namieszane z nawiasami

powinno być:

  1. <?php
  2. if((isset($_GET['order2'])) && (isset($_GET['order1'])))
  3. {
  4.  $zm1 = ($_GET['order1']);
  5.  if($_GET['order2'] == 'desc')
  6.  {
  7. $tab_sql .= " order by ".$zm1." DESC ";
  8.  } else {
  9. $tab_sql .= " order by ".$zm1." ASC";
  10.  }
  11. }
  12. ?>
progman
Niestety nic nie dało, wciąż 0 rezultatów, jaka może być tego przyczyna?
Thaal
hmm.. strzelam - stara wersja php

bo widziałem ze deklarujesz $HTTP_GET_VARS jako zmienną globalną, a to było stosowane bardzo dawno temu. zamień $_GET na $HTTP_GET_VARS.
progman
Cytat(Thaal @ 14.07.2006, 12:03 ) *
hmm.. strzelam - stara wersja php

bo widziałem ze deklarujesz $HTTP_GET_VARS jako zmienną globalną, a to było stosowane bardzo dawno temu. zamień $_GET na $HTTP_GET_VARS.


Prawidłowo laugh.gif Thaal wisze Ci skrzynke browarów winksmiley.jpg Dzięki Ci Wielkie!!
Thaal
ok.. piwo podeślij na mejla biggrin.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.