Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]zooptymalizowanie skryptu
Forum PHP.pl > Forum > Przedszkole
bialko0019
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!
nospor
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 :/
bialko0019
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ą?
Mephistofeles
Można wiedzieć po co masz w bazie puste loginy? Pokaż tabelę, bo mam przeczucie, że jest przekombinowana.
bialko0019
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
nospor
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.