Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php][sql]sortowanie, czemu nie działa?
Oscar_83
post 29.08.2007, 23:03:16
Post #1





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 10.05.2007

Ostrzeżenie: (0%)
-----


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.. :/
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
drPayton
post 30.08.2007, 08:35:31
Post #2





Grupa: Zarejestrowani
Postów: 890
Pomógł: 65
Dołączył: 13.11.2005
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


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ę.
Go to the top of the page
+Quote Post
Kicok
post 31.08.2007, 10:35:56
Post #3





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

Ostrzeżenie: (0%)
-----


Nazw kolumn/tabel nie umieszczamy w apostrofach/cudzysłowie, bo będą traktowane jako tekst.


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
drPayton
post 31.08.2007, 10:58:41
Post #4





Grupa: Zarejestrowani
Postów: 890
Pomógł: 65
Dołączył: 13.11.2005
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


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

Ten post edytował drPayton 31.08.2007, 10:59:20
Go to the top of the page
+Quote Post
Oscar_83
post 10.09.2007, 13:57:27
Post #5





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 10.05.2007

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
-Wieviór-
post 10.09.2007, 13:59:37
Post #6





Goście







PhpMyAdmin raczej nie ma tutaj nic do gadania, jedynie SQL. Najpoprawniejsza wersja:

  1. <?php
  2. $query = "SELECT * FROM zawodnicy ORDER BY `"'.$sort.'"`" ;
  3. ?>
Go to the top of the page
+Quote Post
drPayton
post 10.09.2007, 16:26:43
Post #7





Grupa: Zarejestrowani
Postów: 890
Pomógł: 65
Dołączył: 13.11.2005
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


@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?

Ten post edytował drPayton 10.09.2007, 16:27:46
Go to the top of the page
+Quote Post
-Wieviór-
post 10.09.2007, 17:01:28
Post #8





Goście







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.

Ten post edytował Wieviór 10.09.2007, 17:04:41
Go to the top of the page
+Quote Post
drPayton
post 10.09.2007, 18:09:25
Post #9





Grupa: Zarejestrowani
Postów: 890
Pomógł: 65
Dołączył: 13.11.2005
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


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

Ten post edytował drPayton 10.09.2007, 18:10:58
Go to the top of the page
+Quote Post
Kicok
post 11.09.2007, 14:11:41
Post #10





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

Ostrzeżenie: (0%)
-----


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? ;]


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
viraptor
post 11.09.2007, 22:56:41
Post #11





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 27.03.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
-Wieviór-
post 12.09.2007, 06:27:58
Post #12





Goście







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...
Go to the top of the page
+Quote Post
viraptor
post 12.09.2007, 10:43:15
Post #13





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 27.03.2006

Ostrzeżenie: (0%)
-----


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ść.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 05:22