Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [klasa php5] obsługa bazy danych MySQL
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
Fipaj
Cześć :]
Postanowiłem napisać klasę do obsługi bazy danych MySQL.
Kod źródłowy

Łączenie z bazą odbywa się poprzez konstruktor, któremu musimy dostarczyć tablicę z elementami ‘host’, ‘database’, ‘user’ i ‘password’. Za rozłączanie odpowiedzialny jest destruktor :]
Aby “ustawić” dowolne zapytanie, trzeba utworzyć nowy obiekt klasy Query. Jedynym argumentem konstruktora klasy Query jest zapytanie SQL, potem można je edytować metodami Query::clear () [resetuje zapytanie] oraz Query::setQuery ($query) [ustawia nowe zapytanie].
Aby wykonać zapytanie inne niż “SELECT…”, użyj metody Amber::executeQuery (Query $query). Aby pobrać z tabeli wiele wierszy, użyj Amber::getAll (Query $query), a jeden wiersz - Amber::getRow (Query $query).

Przykład użycia znajduje się w kodzie źródłowym skryptu.
Levabul
Cache by sie przydał ...
Fipaj
Mówiąc szczerze, zupełnie nie mam pomysłu na dorobienie cache'owania... Coś pokombinuję, nic nie obiecuję...
SongoQ
Mam kilka uwag:
- brak obslugi transakcji
- brak zwrocenia ilosci zmodyfikowoanych, dodanych, usunietych rekordow
- brak zwrocenie id dodanego
FiDO
Ja dodam jeszcze, ze przydaly by sie funkcje getOne(), ktora zwraca pierwsza wartosc z pierwszego wiersza, przydaje sie do SELECT COUNT(*) FROM....

Jesli chodzi o cachowanie to sprawdza sie w tej roli serializacja. Ja wlasnie z niej korzystam do cachowania. Jest szybsza niz zapisywanie var_exportem i potem include, robilem porownanie.
Fipaj
2. i 3. gotowe.

transakcje i cache (?) będą jutro :]

FiDO: można dopisać metodę getOne(), ale to już jest chyba zbędne. a co do cache'owania to cały czas myślę i chyba nic nie wymyślę :] jak na razie zrobiłem prostą klasę do cache'owania plików .txt biggrin.gif teraz ją rozwijam o MySQL, zobaczymy, co z tego wyjdzie :]
FiDO
Cytat(Fipaj @ 2006-01-17 20:08:51)
FiDO: można dopisać metodę getOne(), ale to już jest chyba zbędne.

Wg mnie jest to bardzo przydatne. Po co pisac:

  1. <?php
  2.  
  3. $row = $db->getRow("SELECT COUNT(*) FROM tabela");
  4. $ile = $row[0];
  5.  
  6. // lub co gorsza:
  7. $rows = $db->getAll("SELECT COUNT(*) FROM tabela");
  8. $ile = $rows[0][0];
  9.  
  10. ?>


jak mozna:

  1. <?php
  2.  
  3. $ile = $db->getOne("SELECT COUNT(*) FROM tabela");
  4.  
  5. ?>
Fipaj
Metoda getOne() dodana :]
Obsługa transakcji też:
  1. <?php
  2.  
  3. $db -> startTransaction ();
  4. $db -> executeQuery...
  5. $db -> executeQuery...
  6. $db -> executeQuery...
  7. ...
  8. $db -> failTransaction ();
  9. // $db -> completeTransaction ();
  10.  
  11. ?>

Dostęp do bazy MySQL 5.0 będę miał za 4 miesiące (nieskonfigurowane backporty Ubuntu :/), tak więc nie mogę transakcji przetestować. I w ogóle nigdy z nich nie korzystałem.
Spójrzcie w kod, czy zadziała.

@Levabul: cały czas pracuję nad cache :]
SongoQ
Transakcje nie zaleza od wersji tylko od rodzaju systemu tabeli (InnoDB)
Fipaj
Ale w wersji 5.0 transakcje zostały wprowadzone do MyISAM...?

PS. Jeśli chodzi o cache to ja się poddaję :/
Levabul
http://webcity.pl/webcity/artykuly.php/t/51

Przykład cache'u tongue.gif
SongoQ
Cytat
Ale w wersji 5.0 transakcje zostały wprowadzone do MyISAM...?

Nie sadze bo to by sie wiazalo ze spadkiem wydajnosci. No ale pewnie na stronie jakies info bedzie.
Fipaj
Tak, jest info w dokumentacji :] Sprawdziłem i obsługa transakcji Ambera jest zgodna zarówno z InnoDB na 4.x, jak i z MyISAM na 5.x.
Apo
Fajny pomysł z tym konstruktorem i destruktorem tongue.gif Nigdy tak nie robiłem. Zrób jeszcze cachowanie i bedzie git winksmiley.jpg
Jeszcze by sie przydało zliczanie zapytań smile.gif no i nie wiem czy lepiej by było to wszystko dać w 1 klase.
gam3r
a ja mam pytanko: staram się również zrobić klase obsługującą MySQLa i chciałbym wiedzieć czy lepiej do sprawdzania czy wystąpil jakiś błąd używać takiego sposobu:
  1. <?php
  2.  
  3. if( !mysqli_query( $this -> connection , $query )) 
  4. {
  5. throw new Exception("Błąd zapytania do DB:". $this -> database);
  6. }
  7.  
  8. ?>

czy takiego
  1. <?php
  2. mysqli_query( $this -> connection, $query );
  3. if( mysqli_error( $this -> connection ) ) 
  4. {
  5.  throw new Exception("Błąd zapytania do DB:". $this -> database);
  6. }
  7.  
  8. ?>

które jest lepsze? no jeżeli jest któreś lepsze winksmiley.jpg
aha i jeszcze jedno pytanko jaka różnica w używaniu mysqli_real_escape_string() a mysqli_escape_string(), któraś funkcja lepsza?
Fipaj
Apo: jest już w jednej klasie. Zobacz Jungle w mojej sygnaturze.

Gam3r: doskonałe miejsce na takie pytania...
Cytat
jaka różnica w używaniu

nie ma. ta druga to alias pierwszej winksmiley.jpg

a co do pierwszego pytania... też nie ma 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.