Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [MYSQL] Problem z unikalnymi danymi
pozik
post 24.04.2013, 18:40:07
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 24.04.2013

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


Mam tabelę pracownicy(jest to jedyna tabela w bazie), w której mam następujące kolumny: imie, nazwisko, wyplata

Potrzebuje zrobić zapytanie, które wypisze unikalne (imię i nazwisko) i dla tych unikalnych danych tylko najwyższą wypłata.

Ma ktoś pomysł jak to zrobić?

Próbowałem w ten sposób: SELECT DISTINCT imie, naziwsko FROM pracownicy
Nie wiem jak dołączyć do tego najwyższą wypłatę.
Go to the top of the page
+Quote Post
ssstrz
post 24.04.2013, 18:56:25
Post #2





Grupa: Zarejestrowani
Postów: 103
Pomógł: 17
Dołączył: 15.12.2012

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


  1. SELECT DISTINCT imie, nazwisko FROM pracownicy ORDER BY wyplata


Ten post edytował ssstrz 24.04.2013, 18:57:03
Go to the top of the page
+Quote Post
mortus
post 24.04.2013, 19:21:15
Post #3





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Przy takiej budowie tabeli, jaką opisałeś (swoją drogą całkowicie niepoprawną) powinno zadziałać to
  1. SELECT `p`.`imie`, `p`.`nazwisko`, MAX(`p`.`wyplata`) `najwieksza_wyplata` FROM `pracownicy` `p` GROUP BY `p`.`imie`, `p`.`nazwisko`
Go to the top of the page
+Quote Post
Michasko
post 24.04.2013, 19:29:25
Post #4





Grupa: Zarejestrowani
Postów: 283
Pomógł: 31
Dołączył: 10.01.2006
Skąd: Działoszyn

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


  1. WHERE wyplata = max(wyplata)


--------------------
Po prawie 3-letniej przerwie w programowaniu, znowu raczkuję :)
Go to the top of the page
+Quote Post
pozik
post 24.04.2013, 19:53:57
Post #5





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 24.04.2013

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


Cytat(mortus @ 24.04.2013, 20:21:15 ) *
Przy takiej budowie tabeli, jaką opisałeś (swoją drogą całkowicie niepoprawną) powinno zadziałać to
  1. SELECT `p`.`imie`, `p`.`nazwisko`, MAX(`p`.`wyplata`) `najwieksza_wyplata` FROM `pracownicy` `p` GROUP BY `p`.`imie`, `p`.`nazwisko`

Zadziałało, dzięki! Dlaczego niepoprawną?

Mam jeszcze jedno pytanie. Teraz chciałbym zliczyć najwyższe wypłaty większe od $getwyplata. Zrobiłem zapytanie:
$query = "SELECT imie, nazwisko, MAX(wyplata) AS 'maxwyplata' FROM pracownicy GROUP BY imie, nazwisko WHERE maxwyplata > $getwyplata";
$result = mysql_query($query);
... i dalej nie wiem...

Jest możliwość wrzucenia jakiegoś globalnego COUNT() tutaj?

Ten post edytował pozik 24.04.2013, 20:06:30
Go to the top of the page
+Quote Post
matiit
post 24.04.2013, 20:17:04
Post #6





Grupa: Zarejestrowani
Postów: 365
Pomógł: 70
Dołączył: 5.04.2009

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


Zamiast WHERE daj HAVING
Go to the top of the page
+Quote Post
pozik
post 24.04.2013, 20:27:36
Post #7





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 24.04.2013

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


Pomogłeś! Dziękuję!

Zrobiłem coś takiego:
  1. (...)
  2. $query = "SELECT imie, nazwisko, MAX(wyplata) AS 'maxwyplata' FROM pracownicy GROUP BY imie, nazwisko HAVING maxwyplata > $getwyplata";
  3. $result = mysql_query($query);
  4. $num = mysql_numrows($result);
  5.  
  6. echo ("$num");
  7. (...)


Ten post edytował pozik 24.04.2013, 20:32:48
Go to the top of the page
+Quote Post
matiit
post 24.04.2013, 20:48:57
Post #8





Grupa: Zarejestrowani
Postów: 365
Pomógł: 70
Dołączył: 5.04.2009

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


Jest spoko, tylko pamiętaj o SQL injection smile.gif
Go to the top of the page
+Quote Post
pozik
post 24.04.2013, 21:13:28
Post #9





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 24.04.2013

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


Zabezpieczyłem w taki sposób:

$getwyplata = str_replace("<", "", $getwyplata);
$getwyplata = str_replace(">", "", $getwyplata);
$getwyplata = str_replace("!", "", $getwyplata);
$getwyplata = str_replace("/", "", $getwyplata);
$getwyplata = str_replace("\", "", $getwyplata);

Wystarczy?
Go to the top of the page
+Quote Post
matiit
post 24.04.2013, 21:23:37
Post #10





Grupa: Zarejestrowani
Postów: 365
Pomógł: 70
Dołączył: 5.04.2009

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


Nie, bo co jak $getwyplata będzie np. "10; DROP TABLE pracownicy;" ?
Ale fajnie, że kombinujesz i próbujesz.
Polecam Ci po prostu poczytać o SQL injection, jest tego masa na necie.
Ale idziesz w dobrym kierunku, gratulujęsmile.gif
Go to the top of the page
+Quote Post
mmmmmmm
post 24.04.2013, 21:33:15
Post #11





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Wystarczy proste intval()... I o SQL-injection możesz zapomnieć.
Go to the top of the page
+Quote Post
pozik
post 24.04.2013, 21:37:20
Post #12





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 24.04.2013

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


Poszukam i poczytam dzięki matiit smile.gif Dzieki mmmmmmm za pokazanie jak zabezpieczyć przekazywanie wartości smile.gif Teraz jeszcze poszukam jak skutecznie zabezpieczyć stringa smile.gif
Go to the top of the page
+Quote Post
matiit
post 24.04.2013, 21:40:20
Post #13





Grupa: Zarejestrowani
Postów: 365
Pomógł: 70
Dołączył: 5.04.2009

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


Kolega wyżej ma rację. Wtrące jeszcze tylko swoje 0.03PLN - lepiej użyć (int) $zmienna niż intval($zmienna) z powodów optymalizacyjnych.
Tutaj "benchmark"
http://hakre.wordpress.com/2010/05/13/php-casting-vs-intval/
Go to the top of the page
+Quote Post
pozik
post 24.04.2013, 22:54:49
Post #14





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 24.04.2013

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


Nigdy nie zdawałem sobie sprawy z tego, że włamanie się do bazy może być tak łatwe. Udało mi się przeprowadzić atak na mojej bazie. Teraz już zabezpieczyłem trochę. Pomogliście mi. Co do zabezpieczania stringów, to znalazłem: $imie = mysql_escape_string($imie);
Go to the top of the page
+Quote Post
pmir13
post 24.04.2013, 23:14:33
Post #15





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


Skoro już znalazłeś taką funkcję to mam nadzieję, że przeczytałeś do niej manual, gdzie w wielkim czerwonym oknie na samej górze napisane jest, że już w tej chwili wszystkie funkcje z mysql_ są przestarzałe, a w przyszłych wersjach będą w ogóle usunięte.
W zasadzie nie rozumiem dlaczego dyskutujecie na temat jak zabezpieczyć kod typu mysql_ zamiast dyskutować o tym że w ogóle nie należy go stosować. Serio, PDO nie jest takie straszne jak się wydaje, a parametryzowane wywołania zupełnie eliminują problem SQL injection. Wciąż trzeba uważać na XSS jeśli wypluwamy na stronę jakikolwiek html z bazy, ale to i tak duży postęp w stosunku do tego na co trzeba uważać z mysql_.
Go to the top of the page
+Quote Post
pozik
post 24.04.2013, 23:23:39
Post #16





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 24.04.2013

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


Nie zwróciłem uwagi na taką informację. Wychodzi na to, że nadal muszę szukać rozwiązania...
Go to the top of the page
+Quote Post
pmir13
post 24.04.2013, 23:36:47
Post #17





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


  1. $dbh = new PDO( ... );
  2. ...
  3. $query = "SELECT imie, nazwisko, MAX(wyplata) AS 'maxwyplata' FROM pracownicy GROUP BY imie, nazwisko HAVING maxwyplata > :getwyplata";
  4. $stmt = $dbh->prepare( $query );
  5. $stmt->bindParam( ':getwyplata', $getwyplata, PDO::PARAM_INT );
  6. $stmt->execute();


Go to the top of the page
+Quote Post
Szymciosek
post 24.04.2013, 23:50:24
Post #18





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

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


Cytat(pmir13 @ 25.04.2013, 00:14:33 ) *
Skoro już znalazłeś taką funkcję to mam nadzieję, że przeczytałeś do niej manual, gdzie w wielkim czerwonym oknie na samej górze napisane jest, że już w tej chwili wszystkie funkcje z mysql_ są przestarzałe, a w przyszłych wersjach będą w ogóle usunięte.
W zasadzie nie rozumiem dlaczego dyskutujecie na temat jak zabezpieczyć kod typu mysql_ zamiast dyskutować o tym że w ogóle nie należy go stosować. Serio, PDO nie jest takie straszne jak się wydaje, a parametryzowane wywołania zupełnie eliminują problem SQL injection. Wciąż trzeba uważać na XSS jeśli wypluwamy na stronę jakikolwiek html z bazy, ale to i tak duży postęp w stosunku do tego na co trzeba uważać z mysql_.



Możesz coś więcej powiedzieć o XSS? Jak to ma się do trzymania w bazie kodu html i wyświetlania go np. przy korzystania z klasy View, która pobiera i wyświetla html z bazy?
Go to the top of the page
+Quote Post
pmir13
post 25.04.2013, 00:05:02
Post #19





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


W XSS w bardzo dużym skrócie chodzi o to, że jeśli użytkownik ma możliwość wprowadzenia do bazy gdziekolwiek jakiegokolwiek tekstu, z którego potem będzie składany html, to może próbować wstawić coś, co uruchomi javascript, którego źródło może być gdzieś na zewnętrznym serwerze. Przykłady tego, co można próbować wstawić do bazy można znaleźć tutaj: https://www.owasp.org/index.php/XSS_Filter_...ion_Cheat_Sheet.
Jeśli chodzi o widoki to wszystko zależy od tego jak są napisane, każdy przypadek jest inny, na pewno bezpieczny jest tylko taki html z bazy, na który użytkownik odwiedzający stronę nie ma wpływu.
Go to the top of the page
+Quote Post
mmmmmmm
post 25.04.2013, 07:23:35
Post #20





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Sorry, ale większego szajsu niż PDO to dawno nie spotkałem...
Programuję długo (ponad 20 lat) w wielu językach. W PHP jakieś 5-6 lat. Zawsze używałem mysql_ jako najszybsze. Ostatnio próbowałem PDO. Takich problemów, jak z PDO to dawno nie miałem... Każda następna będzie na pewno z użyciem mysqli_
Aby nie być gołosłownym:
1. UPDATE `tabela` SET `pole='wartość' WHERE `id`=1
Brak błędu - zarówno w PDOException, jak i errorInfo().
2. Nie zgłasza błędów w momencie nie dodania rekordów z powodu np. złego triggera.
3. rowCount() nie daje wyników dla SELECT (to akurat jest opisane w dokumentacji) - porażka.

Ten post edytował mmmmmmm 25.04.2013, 07:24:13
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 28.04.2024 - 10:45