Połączenie z bazą danych poprzez PDO
15 maj 2008
Kategorie: Nieoznaczone
Otóż pewien czas temu przypomniałem sobie o PDO - rozszerzeniu do języka PHP stworzonego, aby usystematyzować metody służące PHP do łączenia się z bazami danych. Chciałbym poniżej zaprezentować prostą klasę do obsługi połączenia z bazą MySQL. Download skryptu.
< ?php
class sql {
var $ilzap = 0; //ilość zapytań
var $db;
//połączenie z bazą danych
function connect($user = 'root', $pass = '', $base, $host = 'localhost') {
try {
$this->db = new PDO('mysql:host=' . $host . ';dbname=' . $base, $user, $pass);
return $this->db;
} catch(PDOException $e)
die('Połączenie nie mogło zostać utworzone: ' . $e->getMessage());
}
//wywowałanie zapytania do bazy; $zap - zapytanie; $sql - uchwyt do bazy
function exec($zap) {
try {
$req = $this->db->prepare($zap);
$req->execute();
$this->ilzap++;
} catch(PDOException $e)
die('Wystąpił błąd podczas wykonywania zapytania: ' . $e->getMessage());
}
//liczba zapytań do bazy
function ilzap() {
return $this->ilzap;
}
}
?>
Zapewne już zauważyliście, że podczas nieudanego połączenia lub wykonywania zapytania, skrypt jest automatycznie przerywany i ukazuje się komunikat o błędzie. Możemy oczywiście rozwinąć system zgłaszania błędów i informowania o nich - w końcu jest to tylko bardzo prosta klasa ;) Przykład wykorzystania? Proszę bardzo:
< ?php
include 'sql.class.php';
$db = new sql;
$db->connect('maciek', 'tajnehaslo', 'bazaczegostam', 'localhost');
$db->exec("INSERT INTO `nazwatabeli` VALUES ('jednadana', 'innadana');");
echo 'Wykonano ' . $db->ilzap() . ' zapytań do bazy MySQL';
?>
mysql_connect (lub mysql_pconnect), czy PDO i mojej klasy? Dodam jeszcze, że PDO działa znacznie szybciej niż inne “wspomagacze” do połączenia z bazą danych (np. PEAR:DB).
Oceń wpis! Dla Ciebie to jedno kliknięcie, dla mnie duża satysfakcja :)







Korzystając z PDO w ten sposób właśnie niszczysz całe jego zalety.
Po pierwsze, nie używasz bindowania, transakcji i kilku innych ciekawych mechanizmów.
Po drugie - wyjątki są właśnie po to, aby je przechwytywać i coś z nimi robić, a nie die() - bo w takim przypadku możesz ustawić domyślny exception_handler i obejdzie się bez każdorazowego try/catch/die - działanie to samo.
Możesz się zainteresować też nakładką OpenPowerDriver (OPD), która ma dołożone m.in. cache’owanie zapytań.
Oczywiście, jednak celem tego artykułu było pokazanie, że istnieje coś takiego jak PDO. Jeśli programiście spodoba się ten sposób połączenia z bazą danych, poczyta podręczniki i na pewno zbuduje dużo bardziej skomplikowaną klasę ;)
Ale po co budować klasę, skoro to właśnie PDO jest taką uniwersalną klasą?
Cały dowcip polega na tym, aby korzystać z jej możliwości już bez żadnych zbędnych (ewent. funkcjonalnych - cache) nakładek.
Natomiast to, co pokazałeś to właśnie chyba najźlejsze wykorzystanie.
> W metodzie connect twojej klasy - po co zwracasz $this->db?
> var - wygeneruje ci ładnego strict warninga w php5 (a tylko w nim jest pdo) - tylko protected/private/public
> skoro chcesz tylko wykonać zapytanie i nie uzyskiwać wyników, to od tego jest metoda PDO/exec($query)
Kod Twojego skryptu można zapisać tak:
php
===
function exception_handler($exception) {
echo “Uncaught exception: ” , $exception->getMessage(), ”
“;
}
set_exception_handler(’exception_handler’);
$db = new PDO(’mysql:host=’ . $host . ‘;dbname=’ . $base, $user, $pass);
$db->exec(”INSERT INTO `nazwatabeli` VALUES [...]“);
Upierając się oczywiście na die().
Testowałem u siebie na localhost (mam php5) i nie wywalało żadnego błędu ;)
Zwrot wyniku zapytania powinien działać - testowałem na kilku skryptach.
“Oczywiście, jednak celem tego artykułu było pokazanie, że istnieje coś takiego jak PDO. Jeśli programiście spodoba się ten sposób połączenia z bazą danych, poczyta podręczniki i na pewno zbuduje dużo bardziej skomplikowaną klasę ;)”
Poza tym, zrozum - tą klasę pisałem po kilku mocniejszych trunkach, a więc dziwię się, że już za pierwszy razem działała :P
ps. “upierając się na die()” - to powinno być w takim razie
die()a nieechoBo błędu nie wywali, tylko strict warninga a to duża różnica ;)
Ustaw error_reporting na E_ALL albo 65535 to zobaczysz ;)
Co do die() - to coś tu nie działało dokładnie edytowanie i w końcu nie dość, że były dwa komentarze, to jeszcze zrobił się mix ;) - oczywiście w handlerze miało być die()
Chcę tylko uświadomić, że budowa kolejnej nic nie dającej klasy mija się z celem ;)
PS: Mocne trunki w tym wieku ;} są chyba nie za bardzo dozwolone… ;)
W sumie nie, ale kto w Polsce przestrzega prawa? :D
Powtórzę po raz n-ty ten sam tekst: ;)
“Oczywiście, jednak celem tego artykułu było pokazanie, że istnieje coś takiego jak PDO. Jeśli programiście spodoba się ten sposób połączenia z bazą danych, poczyta podręczniki i na pewno zbuduje dużo bardziej skomplikowaną klasę ;)”
Celem ponizszego komentarza jest pokazanie, ze istnieje cos takiego jak Fiat126P/Maluch. Jesli uzytkownikowi sie spodoba ten samochod, poczyta instrukcje i wypracuje wlasny styl jazdy.
Aby przejechac z punktu A do punktu B ustawiamy sie tylem do kierunku jazdy (w strone A), wrzucamy bieg wsteczny i na nim jedziemy, az dojedziemy do punktu B.
To jest dokladnie taka sama prezentacja mozliwosci Malucha, jak twoja mozliwosci PDO - i moim zdaniem @Fiercio ma racje, ze nie zachecisz tym nikogo do PDO, bo nie pokazujesz jego ZALET.
Hm, zaciekawiłeś mnie tą instrukcją obsługi Malucha. Pobiorę oryginalną wersję i przeczytam całość ;)