Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]zooptymalizowanie skryptu
bialko0019
post
Post #1





Grupa: Zarejestrowani
Postów: 294
Pomógł: 4
Dołączył: 19.12.2008

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


Witam. Dosyć niedawno zacząłem odkrywać programowanie obiektowe, więc mam pytanie. Stworzyłem skrypt, który wyciąga z bazy danych jednym zapytaniem dzisiaj, wczoraj zalogowanych userów, oraz dzisiaj i wczoraj zarejestrowanych. Wszystko ładnie działa, jednak gdybym tworzył strukturalnie, wydaje mi się było by mniej kodu - tyle, że więcej zapytań do bazy danych - a chciałbym wszystko zminimalizować winksmiley.jpg To w kwestii nauki.

Napisałem tak ( pewnie chaotycznie winksmiley.jpg ); :

  1. <?php
  2.  
  3. // ile osób w bazie
  4. // ile dzisiaj zalogowanych
  5. // ile wczoraj zalogowanych
  6. // ile dzisiaj rejestrowanych
  7. // ile wczoraj zarejestrowanych
  8.  
  9. class statystyki{
  10.  
  11. function osoby(){
  12.  
  13. $zapytanie = mysql_query("SELECT * FROM uzytkownicy WHERE login NOT LIKE''");
  14. $zawartosc = mysql_num_rows($zapytanie);
  15. $this->ogolem=$zawartosc;
  16. $i = 0;
  17. while($dana=mysql_fetch_array($zapytanie)){
  18.  
  19. $osoby[$i] = new statystyki;
  20. $osoby[$i] -> zalogowany = $dana['ostatnie_logowanie'];
  21. $osoby[$i] -> rejestracja = $dana['rejestracja'];
  22.  
  23. $i++;
  24. }
  25. $dzisiajz = 0;
  26. $dzisiajr = 0;
  27. $wczorajz = 0;
  28. $wczorajr = 0;
  29. foreach($osoby as $id => $statystyki){
  30.  
  31. if($statystyki -> zalogowany >= date('Y-m-d 00:00:00'))
  32. {
  33. $dzisiajz++;
  34. }
  35.  
  36. if($statystyki -> rejestracja >= date('Y-m-d 00:00:00'))
  37. {
  38. $dzisiajr++;
  39. }
  40.  
  41. if($statystyki -> zalogowany >= date('Y-m-d 00:00:00', strtotime("-1 day")) && $statystyki -> zalogowany < date('Y-m-d 00:00:00'))
  42. {
  43. $wczorajz++;
  44. }
  45.  
  46. if($statystyki -> rejestracja >= date('Y-m-d 00:00:00', strtotime("-1 day")) && $statystyki -> rejestracja < date('Y-m-d 00:00:00'))
  47. {
  48. $wczorajr++;
  49. }
  50.  
  51.  
  52. }
  53. $this->dzisiaj=$dzisiajz;
  54. $this->dzisiajr=$dzisiajr;
  55. $this->wczorajz=$wczorajz;
  56. $this->wczorajr=$wczorajr;
  57.  
  58.  
  59. }
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68. }
  69.  
  70. $obiekt = new statystyki;
  71. $obiekt->osoby();
  72. echo $obiekt->dzisiajz; // dzisiaj zalogowani
  73. echo $obiekt->dzisiajr; // dzisiaj zarejestrowani
  74. echo $obiekt->wczorajl; // wczoraj zalogowani
  75. echo $obiekt->wczorajr; // wczoraj zarejestrowani
  76.  
  77. ?>
  78.  
  79.  
  80.  


Tyle w tym dobrego, że całą klasę mam w innym pliku i go includuje, a w dowolnym miejscu wpisuję tylko dwa wyrazy : $obiekt->zalezy_co_chce_otrzymac . Natomiast strukturalnie napisałbym cztery proste funkcje, które wyciągają odpowiednio z bazy danych odpowiednie wartości, albo jedną, w której wpisuję warunek...

Jakie inne zastosowania mógłbym użyć, by to "programowanie obiektowe" w tym przypadku co podałem, było czytelniejsze, o znacząco mniej objętości ? W tym przypadku obciążam bardziej tylko serwer, a w przypadku wielu zapytań obciążył bym bardzo znowu bazę danych... ? Nie chodzi mi tutaj o gotowe rozwiązanie, tylko o wskazówki, czego jeszcze nie zastosowałem, co ułatwiło by pracę na takich właśnie skryptach o oparciu o obiektowość?

Pozdrawiam!

Ten post edytował bialko0019 13.11.2010, 12:10:14


--------------------
---
"kto pyta ten nie błądzi"...
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




1) WHERE login NOT LIKE''
Co to ma byc?
2) Pobierasz wszystkich userów tylko po to by wyliczyc ilu ich jest? Tylko po to by wyliczyc ilu zarejestrowalo sie dzisiaj? Przecież ty baze i skrypt zarżniesz czyms takim przy większej liczbie userów.
3) Każdą z rzeczy co chcesz zrobic zrób najpierw jako oddzielne zapytanie. ALe tak, by to zrobic w zapytaniu a nie w php.
DO liczby uzywa sie COUNT a nie w php sie zlicza wszystkie rekordy.
Gdy już będziesz miał te wszystkie zapytania to połącz je przez zwykle UNION. Bedzie to o niebo optymalniejsze od tego co masz teraz.
4) Mozna to oczywiscie zrobic nawet bez union, w jendym zapytaniu, ale juz nie będę ci glowy zawracal bo jest to ciut bardziej skomplikowane

edit:
  1. while($dana=mysql_fetch_array($zapytanie)){
  2.  
  3. $osoby[$i] = new statystyki;
  4. $osoby[$i] -> zalogowany = $dana['ostatnie_logowanie'];
  5. $osoby[$i] -> rejestracja = $dana['rejestracja'];
  6.  
  7. $i++;
  8. }

A to niby po co? Usłuszałeś pojęcie OBIEKT i walisz tym wszędzie gdzie popadnie bez opamiętania - no nie na tym to polega smile.gif
I jeszcze na dodatek tworzysz obiekt STATYSTYKI dla każdego usera już w obiekcie STATYSTYKI :/


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
bialko0019
post
Post #3





Grupa: Zarejestrowani
Postów: 294
Pomógł: 4
Dołączył: 19.12.2008

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


1) No tak, bo mam trochę w bazie rekordów, które mają puste kolumny `login` i inne, ale ich potrzebuję w innym celu niż statystyki dlatego ich w taki sposób wykluczam teraz.

Czyli w przypadku takiego skryptu założeniem najodpowiedniejszym założeniem by było:

1. Policzenie wszystkich użytkowników, zapytaniem:
  1. SELECT COUNT(*) AS id FROM uzytkownicy

2. Znalezienie, ile jest użytkowników z dzisiejszym logowaniem:
  1. SELECT COUNT( * ) FROM uzytkownicy WHERE rejestracja >= '2010-11-14 00:00:00'

3. Analogicznie z ostatnim logowaniem.. Rzeczywiście, chcę zobaczyć ile takich rekordów jest, a nie potrzebne są mi dane kto co i jak i kiedy, gdy wywołałem zapytaniem SELECT * FROM uzytkownicy...

Teraz praktycznie:

Tworzę klasę.

Piszę funkcje, które zwracają odpowiednie liczby - zależy co chcę uzyskać. Uzyskaną liczbę przypisuję do obiektu, np. : $this=dzisiaj_zalogowani=$dzisiejszy zalogowani . Zamykam klasę.

Teraz w miejscu, gdy chcę wyświetlić te dane statystyczne, po prostu piszę:

  1. <?php
  2.  
  3.  
  4. $obiekt = new cos;
  5. $obiekt->funkcja_dzisiaj();
  6. [...]
  7.  
  8.  
  9. ?>


O to Ci chodziło mniej więcej ?


o coś takiego:

  1.  
  2.  
  3. // ile dzisiaj zalogowanych
  4. // ile wczoraj zalogowanych
  5. // ile dzisiaj rejestrowanych
  6. // ile wczoraj zarejestrowanych
  7.  
  8. class statystyki{
  9.  
  10.  
  11.  
  12. function zalogowani($data){
  13.  
  14. $ilosc = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) FROM uzytkownicy $data"));
  15. $this->osoby=$ilosc['COUNT(*)'];
  16.  
  17. }
  18.  
  19. }
  20.  
  21.  
  22. $obiekt = new statystyki;
  23. $obiekt->zalogowani("WHERE ostatnie_logowanie >= '2010-11-14 00:00:00'");
  24.  
  25. echo $obiekt->osoby;
  26.  


i ten poprzedni wykonuje się średnio 0.5s, a ten powyżej średnio 0.05, może dłużej - czyli ok 10 razy szybciej. Ale mniej więcej, to jest dobrze napisany skrypt z klasą?

Ten post edytował bialko0019 14.11.2010, 11:14:52


--------------------
---
"kto pyta ten nie błądzi"...
Go to the top of the page
+Quote Post
Mephistofeles
post
Post #4





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

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


Można wiedzieć po co masz w bazie puste loginy? Pokaż tabelę, bo mam przeczucie, że jest przekombinowana.

Ten post edytował Mephistofeles 14.11.2010, 12:40:56
Go to the top of the page
+Quote Post
bialko0019
post
Post #5





Grupa: Zarejestrowani
Postów: 294
Pomógł: 4
Dołączył: 19.12.2008

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


Mephistofeles, pytałem w temacie o klasę, a nic nie wspominałem o bazie danych, a dokładniej tabelę winksmiley.jpg Dosyć nie dawno piszę obiektowo wykorzystując klasy w PHP dlatego pytam się - czy to jest poprawnie napisany kod winksmiley.jpg Nigdzie tego skryptu nie chcę wykorzystywać, to tylko dla przykładu i nauki podałem akurat wykorzystując bazę danych winksmiley.jpg Chodzi mi o nakierowanie wyłącznie o skrypt PHP winksmiley.jpg


--------------------
---
"kto pyta ten nie błądzi"...
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Chodziło mi o to, ze do sprawdzania czy cos jest puste czy nie, nie uzywa się LIKE..... przecież to jest cholernie nie optymalne smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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 Aktualny czas: 20.08.2025 - 13:51