[MYSQL] Problem z unikalnymi danymi |
[MYSQL] Problem z unikalnymi danymi |
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ę. |
|
|
24.04.2013, 18:56:25
Post
#2
|
|
Grupa: Zarejestrowani Postów: 103 Pomógł: 17 Dołączył: 15.12.2012 Ostrzeżenie: (0%) |
|
|
|
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%) |
|
|
|
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%) |
-------------------- Po prawie 3-letniej przerwie w programowaniu, znowu raczkuję :) |
|
|
24.04.2013, 19:53:57
Post
#5
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 24.04.2013 Ostrzeżenie: (0%) |
Przy takiej budowie tabeli, jaką opisałeś (swoją drogą całkowicie niepoprawną) powinno zadziałać to
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 |
|
|
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
|
|
|
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:
Ten post edytował pozik 24.04.2013, 20:32:48 |
|
|
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
|
|
|
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? |
|
|
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ę |
|
|
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ć.
|
|
|
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 Dzieki mmmmmmm za pokazanie jak zabezpieczyć przekazywanie wartości Teraz jeszcze poszukam jak skutecznie zabezpieczyć stringa
|
|
|
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/ |
|
|
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);
|
|
|
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_. |
|
|
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...
|
|
|
24.04.2013, 23:36:47
Post
#17
|
|
Grupa: Zarejestrowani Postów: 282 Pomógł: 89 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
|
|
|
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%) |
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? |
|
|
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. |
|
|
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 |
|
|
Wersja Lo-Fi | Aktualny czas: 28.04.2024 - 10:45 |