Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Order by $zmienna z get'a i co jeśli ktoś ją zmieni i kolumny nie będzie ?
Forum PHP.pl > Forum > Przedszkole
Elber
Witam, mam sobie zapytanie w którym steruję sortowaniem poprzez link, czyli w linku mam po jakim polu ma sortować i ładnie działa, ale co zrobić gdy ktoś sobie zmieni tą zmienną ? Wtedy wywala mi albo błąd Warning: mysql_fetch_array() .... albo jak dam w kodzie po zapytaniu or die(...); to wyświetla. Moja pytanie co zrobić aby sortowało po ID bądź czymś innym co jest w bazie ale żeby nie sortowało po tym jak ktoś sobie sam zmieni w linku na złą kolumnę ?
cycofiasz
Najpierw stwórz tablicę z nazwami kolumn które można sortować, następnie sprawdzaj czy kolumna z geta jest w tej tablicy, jeśli nie to stosujesz domyślne sortowanie po wcześniej ustalonej kolumnie
untorched
Kod
$dozwolone = array('id', 'nazwa', 'inne_pole'); // pola wg. których dozwolone jest sortowanie

$pole = mysql_real_escape_string($_GET['sortowanie']); // Nazwa pola wg. którego ma być sortowanie

if( in_array($pole, $dozwolone) === FALSE )
{
   $pole = 'id'; // jeśli nie można sortować wg. pola podanego w zapytaniu
                 // to ustaw domyślne pole na `id`
}

mysql_query('SELECT * FROM `nazwa_tabelki` ORDER BY `'.$pole.'`'); // zapytanie..


o coś takiego chodzi? nie testowałem, ale powinno być ok mellow.gif
Elber
HMm o dziwo ku memu zdziwieniu wielkiemu zadziałało:

or die(header('Location: link..'));

i przenosi na link w którym jest wszystko wyzerowane i dobrze wyświetlone smile.gif

Ale czy to rozwiązanie jest OK ?
untorched
Cytat(Elber @ 11.01.2012, 00:32:26 ) *
HMm o dziwo ku memu zdziwieniu wielkiemu zadziałało:

or die(header('Location: link..'));

i przenosi na link w którym jest wszystko wyzerowane i dobrze wyświetlone smile.gif

Ale czy to rozwiązanie jest OK ?


Działać to może i działa, ale po co tak robić? Po co wykonywać zapytanie z błędem, a później ponownie już poprawione, skoro można ten błąd skorygować od razu?
Elber
Po to aby nie musieć za każdym razem określać w każdej funkcji na sztywno kolumn do sortowania smile.gif
untorched
Czyli tylko dla tego chcesz zmuszać zwykłego użytkownika do rzucania nim po stronach, zawalania bazy błędami itd? Nie lepiej pobrać nazwy komórek w tabeli i porównać je z tą, wg. której chcemy sortować?

  1. $dozwolone = array(); // pola wg. których dozwolone jest sortowanie
  2.  
  3. $query = 'describe `nazwa_tabeli`;';
  4. $sql = mysql_query($query, $conn);
  5.  
  6. while($ret = mysql_fetch_array($sql))
  7. {
  8. $dozwolone = array_merge((array)$dozwolone, (array)$ret[0]);
  9. }
  10.  
  11. $pole = mysql_real_escape_string($_GET['sortowanie']); // Nazwa pola wg. którego ma być sortowanie
  12.  
  13. if( in_array($pole, $dozwolone) === FALSE )
  14. {
  15. $pole = 'id'; // jeśli nie można sortować wg. pola podanego w zapytaniu
  16. // to ustaw domyślne pole na `id`
  17. }
  18.  
  19. mysql_query('SELECT * FROM `nazwa_tabelki` ORDER BY `'.$pole.'`'); // zapytanie..


Powinno być okej...
kulak
UP: pewnie się czepiam, ale tego while'a można zrobić dużo ładniej smile.gif
  1. $dozwolone = array();
  2. while($ret = mysql_fetch_array($sql))
  3. {
  4. $dozwolone[] = $ret[0];
  5. }
untorched
@kulak, racja, ładniej wygląda rolleyes.gif Ale to przez to, że już późna godzina to nawet takie proste rzeczy sobie komplikuje ;p
nospor
Cytat
or die(header('Location: link..'));

i przenosi na link w którym jest wszystko wyzerowane i dobrze wyświetlone

Taka jeszcze drobna dygresja:
pragnę zwrócić uwagę, że zapytanie może się również nie wykonać, nawet gdy ktoś użyje pola, po którym można sortować. Ot np. chwilowa awaria tabeli, która zdarza się stosunkowo często. I co wówczas się bedzie działo? Wówczas w nieskonczoność będziesz przekierowywał użytkownika.

Dawanie możliwości sortowania po wszystkich kolumnach jak leci też jest średnio dobrym rozwiązaniem. Przecież nie zawsze na wszystkich polach masz założone indeksy i sortowanie po wszystkim może być poprostu nieoptymalne.

Ja tam zawsze określam na sztywno po czym można sortować i jakoś nie widzę w tym żadnego problemu. Mam wówczas pełną kontrolę nad tym co user może a czego nie.
Elber
Oki wink.gif Przekonaliście mnie wink.gif Szczerze to nie wiedziałem jak można wyciągnąć z bazy nazwy kolumn z danej tabeli wink.gif Ale kolega @untorched bardzo ładnie mi to na przykładzie pokazał wink.gif Bardzo Wam dziękuję za pomoc wink.gif

Pozdrawiam
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.