Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][sql]sortowanie, czemu nie działa?
Forum PHP.pl > Forum > Przedszkole
Oscar_83
Witam miałem sortowanie działało, a teraz nie wiem czemu nie działa, dzisiaj zauważyłem że nie działa (nie wiem ile czasu tak już jest), nie mogę dojść czemu to nie działa, a oto kod:
  1. <?php
  2. $polaczenie = mysql_connect("localhost", "xxx", "xxx") or die("Sprawdź połączenie z serwerem");
  3. mysql_select_db("mzukowski",$polaczenie);
  4. mysql_query('SET NAMES latin2');
  5.  
  6. empty($_GET['sort'])?$sort='nazwisko':$sort=$_GET['sort'];
  7. $query = 'SELECT * FROM zawodnicy ORDER BY "'.$sort.'"' ;
  8. $results = mysql_query($query, $polaczenie) or die (mysql_error());
  9. $num_zawodnicy = mysql_num_rows($results);
  10.  
  11. $zawodnicy = '
  12. <h2><center><br><font face="lucida console">ZAWODNICY W DRUŻYNIE</font><br><br></center></h2>
  13. <table width="90%" border="1" cellpadding="2" cellspacing="2" align="center" bgcolor="FFFFFF">
  14.  <tr>
  15.  <th><font color="416F76">L.p</font>
  16.  <th><a href="zawodnicy2.php?sort=imie" style="text-decoration: none">Imię</a></th>
  17.  <th><a href="zawodnicy2.php?sort=nazwisko" style="text-decoration: none">Nazwisko</a></th>
  18.  <th><a href="zawodnicy2.php?sort=pozycja" style="text-decoration: none">Pozycja</a></th>
  19.  <th><a href="zawodnicy2.php?sort=wiek" style="text-decoration: none">Wiek</a></th>
  20.  <th><a href="zawodnicy2.php?sort=narodowosc" style="text-decoration: none">Narodowosc</a></th>
  21.  <th><a href="zawodnicy2.php?sort=bramki" style="text-decoration: none" title="Goli w tym sezonie">Gole</a></th>
  22.  <th><a href="zawodnicy2.php?sort=bramki_w_kar" style="text-decoration: none" title="Goli w karierze">G_k</a></th>
  23.  <th><a href="zawodnicy2.php?sort=hattrickow" style="text-decoration: none" title="Hattricków w karierze">H</a></th>
  24.  <th><font color="416F76">Uwagi</th></font>
  25.  </tr>
  26. ';
  27. $lp = 0;
  28. $wiek_sr = 0;
  29.  
  30. while($row=mysql_fetch_assoc($results)){
  31. $lp++;
  32. $wiek_sr += $row['wiek'];
  33. $zawodnicy .= '
  34. <tr>
  35. <td>'.$lp.'</td>
  36. <td>'.$row['imie'].'</td>
  37. <td>'.$row['nazwisko'].'</td>
  38. <td>'.$row['pozycja'].'</td>
  39. <td style="text-align: center;">'.$row['wiek'].'</td>
  40. <td>'.$row['narodowosc'].'</td>
  41. <td style="text-align: center;">'.$row['bramki'].'</td>
  42. <td style="text-align: center;">'.$row['bramki_w_kar'].'</td>
  43. <td style="text-align: center;">'.$row['hattrickow'].'</td>
  44. <td>'.$row['uwagi'].'&nbsp;</td>
  45. </tr>
  46. ';
  47. }
  48. ?>


Bardzo bym prosił o sprawdzenie kodu, może ktoś wyłapie co tu jest nie tak, ja już nie mam siły.. :/
drPayton
Hmmm, jest parę niestandardowych zapisów, ale poprawnych. Dane w tabeli wyświetla, tylko nie sortuje ich, tak?
Jeśli tak to dziwne, ja tu błędu nie widzę.
Kicok
Nazw kolumn/tabel nie umieszczamy w apostrofach/cudzysłowie, bo będą traktowane jako tekst.
drPayton
@Kicok:
O co Ci chodzi? Coś Ci się chyba "potegociło" winksmiley.jpg

@Oscar_83:
Sprawdziłem u siebie - ten kod jest w 100% poprawny. Problem musi leżeć gdzieś indziej. Napisz dokładnie co to znaczy "nie działa" - jakiś błąd? Nic się nie dzieje?
U mnie jak już pisałem wszystko jest OK z tym kodem.
Oscar_83
Już dostałem odpowiedź na forum PHP (szczerze mówiąc to zapomniałem że w przedszkolu pytałem), wystarczyło zmienić tylko jedną linjke na taką:

  1. <?php
  2. $query = "SELECT * FROM zawodnicy ORDER BY `".$sort."`" ;
  3. ?>


Wydaje mi się że działo się to przez to że wgrali mi na serwer nowego phpmyadmina i pewnie on przyjmuje tylko tak jak jest podane wyżej, teraz działa wszystko ładnie pięknie.
Wieviór
PhpMyAdmin raczej nie ma tutaj nic do gadania, jedynie SQL. Najpoprawniejsza wersja:

  1. <?php
  2. $query = "SELECT * FROM zawodnicy ORDER BY `"'.$sort.'"`" ;
  3. ?>
drPayton
@Wieviór: Najpoprawniejsza to taka, która nie ma prawa działać (parse error)? winksmiley.jpg

Pytanie do kogokolwiek zorientowanego:
Jakim cudem taka zmiana (dodanie ``) do nazwy pola, tabeli może mieć jakikolwiek wpływ na działanie skryptu? Na pewno wtedy, gdy pole nazwane jest jakimś słowem zastrzeżonym (np order, select etc), wtedy muszą być "ciapki" (by @qqrq), ale tu takiej sytuacji nie ma, więc?
Wieviór
Bardzo słusznie blinksmiley.gif laugh.gif sciana.gif

  1. <?php
  2. $query = "SELECT * FROM zawodnicy ORDER BY '".$sort."'" ;
  3. ?>


Tak lepiej winksmiley.jpg smile.gif

EDIT: @drPayton: Nie jestem pewien, ale chyba ` ` ma to samo działanie co ' '. Jeśli tak, to dodawanie pojedynczego cudzysłowu ma jak najwięcej sensu - w końcu tutaj zmienna $sort jest tekstowa, więc powinna być ujęta w cudzysłów. Na niektórych serwerach to działa bez cudzysłowu, inne tego wymagają, zależy chyba od wersji PHP bądź SQL'a.
drPayton
Cytat
chyba ` ` ma to samo działanie co ' '.

Nie, apostrofy do wstawiania wartości nieliczbowych, "ciapki" obejmują nazwy tabel/kolumn etc, ale już postgres na nich polegnie...

Jeżeli ma to jakiekolwiek znaczenie (za wyjątkiem przypadku o którym pisałem), to musi zależeć od wersji php/mysql. Ale jakoś nigdy się z czym takimś nie spotkałem, a zaliczyłem już sporo (sub)wersji obu w/w.
Ciut ciężko mi uwierzyć w to, żeby faktycznie to to dostawienie "ciapek" rozwiązało problem, raczej przypadek tudzież gdzie indziej był jakiś "drobny" błąd, o którym @Oscar_83 nie napisał.

Fajnie by było jednak dowiedzieć się tego od kogoś ciut mądrzejszego ode mnie winksmiley.jpg
Więc...? Ktokolwiek...?
Kicok
Jaki problem zrobić testy?


Najpierw tworzymy prostą tabelę:
  1. CREATE TABLE `tabela` (
  2. `kolumna` int(10) UNSIGNED NULL
  3. );
  4.  
  5. INSERT INTO tabela ( kolumna ) VALUES ( 111 );
  6. INSERT INTO tabela ( kolumna ) VALUES ( 333 );
  7. INSERT INTO tabela ( kolumna ) VALUES ( 222 );

Ważne jest to, żeby wstawić do tabeli jakieś NIEPOSORTOWANE dane


A teraz można już przetestować sobie ciapki:
  1. SELECT kolumna FROM tabela

  1. SELECT kolumna FROM tabela ORDER BY kolumna

  1. SELECT kolumna FROM tabela ORDER BY `kolumna`

  1. SELECT kolumna FROM tabela ORDER BY 'kolumna'

  1. SELECT kolumna FROM tabela ORDER BY "kolumna"

  1. SELECT kolumna FROM tabela ORDER BY "Jakiś tekst, który nie jest nazwą kolumny"

  1. SELECT kolumna FROM tabela ORDER BY 'Jakiś tekst, który nie jest nazwą kolumny'

  1. SELECT kolumna FROM tabela ORDER BY `Jakiś tekst, który nie jest nazwą kolumny`


Które zapytania zwrócą posortowane dane, które nieposortowane, a które wyrzucą błąd? ;]
viraptor
A może by tak jeszcze jakiś escape tego $_GET['sort']? Inaczej ktoś Ci tam doda UNION 'inna tabela' a potem INTO OUTFILE i zbierze całą bazę danych... Trochę bezpieczeństwa winksmiley.jpg
Wieviór
Cytat(viraptor @ 11.09.2007, 23:56:41 ) *
A może by tak jeszcze jakiś escape tego $_GET['sort']? Inaczej ktoś Ci tam doda UNION 'inna tabela' a potem INTO OUTFILE i zbierze całą bazę danych... Trochę bezpieczeństwa winksmiley.jpg


Napisz coś więcej na ten temat albo zarzuć jakimś linkiem, chętnie się dowiem...
viraptor
Cytat(Wieviór @ 12.09.2007, 06:27:58 ) *
Napisz coś więcej na ten temat albo zarzuć jakimś linkiem, chętnie się dowiem...

Jako $sort (a właściwie $_GET['sort']) wrzucasz w skrypt:
kolumna`,(BARDZO FAJNY SELECT...),`kolumna

Chodzi po prostu o bardziej zakręcone injection. Z UNION troche przesadziłem, bo tu nie przejdzie, ale można inne rzeczy zrobić. No to w przykładach pewnie najlepiej:

  1. SELECT ... ORDER BY `kol`,(SELECT 1 INTO OUTFILE 'plik_do_zebrania_z_serwera'),`kol`;

Zrzuci wynik całego oryginalnego zapytania do tego pliku.

  1. SELECT kolumna_z_dwoma_wartościami_42 AS kol, inna_kolumna ORDER BY `kol`,(SELECT IF(coś_na_wybranie_pierwszej_wartości_42 AND (SELECT password FROM users LIMIT 1)>"abcd", 1, 2)),`kol`;

Posortuje powtórzenia w sposób... odpowiedni winksmiley.jpg po kilku testach można znaleźć odpowiednie hasło / hasha / ... na podstawie ułożenia rekordów.

Można cały dzień sypać przykładami co da się zrobić z injectem do ORDER BY... - po prostu do bazy NIGDY nie powinna pójść nieescapowana wartość.
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.