![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 2 Pomógł: 0 Dołączył: 28.05.2011 Ostrzeżenie: (0%) ![]() ![]() |
Na samym początku wypada się przywitać co też czynię, jako że jestem świeżo po rejestracji na forum. Mam też nadzieję, że nie umknął mi żaden punkt regulaminu i na starcie nie popełniłem jakiegoś "wykroczenia" zamieszczając pierwszy post.
A teraz do rzeczy: Od dzisiaj studiuję rozszerzenie PDO. Napisałem prostą klasę licznika odwiedzin odpornego na odświeżanie strony. Dane licznika przechowywane są w bazie danych. Konstruktor klasy tworzy nową tabelę jeśli takowa nie istnieje. Więcej szczegółów w komentarzach do metod. Proszę doświadczonych programistów o: 1. ocenę kodu; 2. wskazówki na co zwracać uwagę; 3. ocenę pod kątem bezpieczeństwa (czy takie wykorzystanie PDO utrudnia SQL Injection?) 4. co można zoptymalizować; 5. opinie czy takie wykorzystanie funkcji unset jest korzystne/dobre, czy też zbędne/złe? 6. Co sądzicie o PDO? Czy pod względem wygody/wydajności/bezpieczeństwa jest lepsze od innych metod? Co polecacie? Każda konstruktywna krytyka jest mile widziana. Oto kod:
Sposób użycia:
Ten post edytował gregherb 28.05.2011, 21:57:20 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 304 Pomógł: 51 Dołączył: 4.02.2005 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Po co korzystasz z unset? Php ma gc, więc jeśli zmienna wyjdzie poza zakres to pamięć zostanie zwolniona - niepotrzebne zaciemnianie kodu.
Korzystasz z prepared statements, lecz w ogóle nie wykorzystujesz ich zalet. Masz na krzyż 4 zapytania, które różnią się tylko parametrem, przygotuj sobie 4 obiekty prepared statement dla każdego z zapytań i te obiekty wykorzystuj do wykonywania zapytań, a nie twórz ich non stop za każdym razem. Będziesz musiał wykorzystać placeholdery (np. w postaci znaku zapytania), a wartosci przekazywać do metody execute - tak też powinno się robić nawet gdy docelowo obiekt PDOStatement ma wykonać tylko jedno zapytanie. Klasa counter nie powinna nawiązywać połączenia z bazą danych, a dostać już gotowe połączenie. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 2 Pomógł: 0 Dołączył: 28.05.2011 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za spostrzeżenia!
(..) przygotuj sobie 4 obiekty prepared statement dla każdego z zapytań i te obiekty wykorzystuj do wykonywania zapytań Czyli w tym konkretnym przypadku powinienem przygotować po jednym obiekcie dla zapytań select, update, insert, create? Czy tak? Klasa counter nie powinna nawiązywać połączenia z bazą danych, a dostać już gotowe połączenie. W tym miejscu nie byłem pewien, czy Counter powinien sam łączyć się z bazą. Dzięki za wyjaśnienie! Czy powinienem przekazywać do niego gotowe połączenie w postaci obiektu PDO? Jeszcze raz dzięki za odpowiedź i miłej niedzieli. |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 952 Pomógł: 154 Dołączył: 20.01.2007 Skąd: /dev/oracle Ostrzeżenie: (0%) ![]() ![]() |
Chodzi o zapytania UPDATE:
Kod $update = $this->db->prepare("UPDATE licznik SET Hits=$val"); $update->execute(); Po co Ci tutaj prepare(), kiedy dane wklejasz bezpośrednio w zapytanie? |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 125 Pomógł: 7 Dołączył: 27.01.2010 Ostrzeżenie: (0%) ![]() ![]() |
blad na bledzie (IMG:style_emoticons/default/tongue.gif)
1 - dlaczego tworzysz nowe polaczenie w konstruktorze? nie lepiej wystawic set/get connection aby mozna bylo to zlaczyc z innym kodem? 2 - calkowity brak tranzakcji 3 - tworzenie tabeli w locie!? 4 - duplikacje kodu (brak DRY) 5 - nie robisz lockow na tabelach ogolnie, licznik nadaje sie jedynie do prostych stronek o niklej ogladalnosci, przy wiekszym ruchu bedzie waskim gardlem a przy duzej konkurencyjnosci bedzie dawal zle wyniki |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 4 655 Pomógł: 556 Dołączył: 17.03.2009 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
Nie wykorzystujesz tego co oferuje PDO, a mam tutaj na myśli dokładnie to co pisał Zyx.
Destruktor możesz wywalić. resetCounter mógłby najwyżej wywoływać $this->setCounter(0), nie widzę sensu powielania kodu. getCounter nie zwróci odpowiedniej wartości, jeżeli w czasie wykonywania skryptu kilku innych w tym samym czasie wejdzie na stronie i każdy z nich przesunie licznik o +1 ;] |
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 04:38 |