Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> PDO pytanie
breaked
post
Post #1





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 20.10.2010

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


Witam,

Zaczynam uczyć się korzystać z PDO zamiast zwykłego mysql_*. Ułożyłem prostą klasę, żeby nie musieć pisać ciągle tego try ... catch. Nie wiem właśnie czy takie coś można stosować:

  1. class Database {
  2.  
  3. function __construct() {
  4. try {
  5. $pdo = new PDO(*****) //tu łączę się z bazą
  6. } catch(PDOException $e) {
  7. echo 'Error: '.$e -> getMessage();
  8. }
  9. }
  10.  
  11. function query($data) {
  12. try {
  13. $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  14. $query = $pdo -> query($q);
  15.  
  16. return $query;
  17.  
  18. } catch(PDOException $e) {
  19. echo 'Error: '.$e -> getMessage();
  20. }
  21. }
  22. }


Czy takie coś ma w ogóle sens istnienia ?
Oraz czy w PDO trzeba kończyć, coś jak mysql_close ? I jeżeli tak to jak ?
No i jeszcze ostatnie: W powyższej klasie użyłem PDO::query. Wyczytałem, że jest jeszcze PDO::exec i PDO::prepare. Czym to się różni i które lepiej stosować ?

Pozdrawiam,
Michał
Go to the top of the page
+Quote Post
pmir13
post
Post #2





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


W PDO nie ma odpowiednika mysql_close, połączenia są zamykane w momencie gdy obiekty pdo przestają istnieć. Czyli albo unset() albo $pdo = null; albo po prostu same się zamkną po zakończeniu wykonywania skryptu.

PDO::exec() nie zwraca rekordów, używa się gdy nie potrzebujesz danych, przykładowo $pdo->exec("SET NAMES utf8");
PDO::query() to bezpośredni odpowiednik mysql_query, nie daje żadnych dodatkowych korzyści. Można używać kiedy dane zapytanie potrzebujesz wykonać raz, a zapytania nie budujesz z czegoś co user może wprowadzić, albo restrykcyjnie sprawdzasz co wprowadził.
PDO::prepare() a potem execute() dla utworzonego obiektu - umożliwia parametryzację - przygotowujesz zapytanie raz a potem wywołujesz z różnymi parametrami, znacznie przyspiesza wykonywanie wielokrotnych zapytań na przykład wyciągnij rekord dla jakiegoś id. Dodatkowo parametry te nie wchodzą bezpośrednio do tekstu zapytania co zabezpiecza przed sql injection. Ten sposób jest najbardziej polecany.

Ten post edytował pmir13 4.04.2012, 20:54:57
Go to the top of the page
+Quote Post
by_ikar
post
Post #3





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Do tego co mój przedmówca napisał, mogę dodać, że możesz sobie utworzyć jakiegoś buildera, i elegancko sobie składać zapytania (IMG:style_emoticons/default/wink.gif) np tak:

  1. $res = $database->select()->from('table')->where(array('column' => 'value'))->get();
  2.  
  3. foreach($res->fetchAll() as $key => $val)
  4. {
  5. // do something
  6. }


Oczywiście takiego buildera mógłbyś i zrobić bez PDO.
Go to the top of the page
+Quote Post
breaked
post
Post #4





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 20.10.2010

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


No tak, a co z tym skryptem co napisałem ? Gdybym zamiast PDO::query() zastosował PDO::prepare() to mogłoby być coś takiego ?
Ogólnie chcę coś zrobić, żebym nie musiał cały czas pisać tego try .. catch, bo to staje się męczące troche (IMG:style_emoticons/default/tongue.gif)
Chyba, że jest na to jakiś inny sposób ?
Go to the top of the page
+Quote Post
Crozin
post
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


1. W PHP nie masz wymogu natychmiastowego przechwytywania wyjątku, więc nie musisz tego robić. Nic nie stoi na przeszkodzie by wyjątek został wyłapany przez jeden blok try..catch (gdzieś "wyżej"), wspólny dla wszystkich wywołań PDO::query().
2. Przechwytywanie wyjątku tylko po to by wyświetlić go na ekranie jest pozbawione sensu.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.12.2025 - 19:07