Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySql] Pierwsze kroki z PDO, jak utrzymywać połączenie?
Forum PHP.pl > Forum > Przedszkole
superzenon
Witam,

Korzystałem z tutoriala PDO na wikibooks - http://pl.wikibooks.org/wiki/PHP/Biblioteka_PDO

Pierwsza rzecz jaka mnie zastanawia to jak poprawnie trzymać połączenie z bazą danych w przypadku PDO. Doczytałem się, że w przeciwieństwie do funkcji mysql_ w PDO otwieranie połączenia (mysql_connect) na początku skryptu i zamykanie go na końcu skryptu nie jest stosowane.


Czy powinno się dla każdego zapytania sql tworzyć nowy obiekt pdo jak tu:
  1. try
  2. {
  3. $pdo = new PDO('mysql:host=localhost;dbname=produkty', 'root', 'root');
  4. }
  5. catch(PDOException $e) { [...] }


Czy może lepiej bawić się closeCursor(); ? I wewnątrz try'a po każdym zapytaniu korzystać z tego closeCursor (wrzucając w strukturę try'a mase różnego kodu całego skryptu)? Nie wiem czy dobrze zrozumiałem według manuala co closeCursor ma robić, dlatego będę wdzięczny jeśli ktoś dałby rady to wyjaśnić. A najbardziej ucieszył bym się z jakiegoś konkretnego przykładu.

Kolejna sprawa do czego służy i jak korzystać z PDO::ATTR_PERSISTENT ?

Chciałbym napisać sobie funkcję, której przekazuje jakąś wartość, która to wartość jest porównywana w mysql. Czy specjalnie dla takiej funkcji tworzyć w jej wnętrzu instancje new PDO i pod koniec wykonywania funkcji przypisać null'a? Czy może lepiej przekazać do funkcji od razu instancję klasy PDO i wewnątrz po prostu porobić executy, query itd. ? Jak najlepiej korzystać w takich sytuacjach z PDO?
Mephistofeles
Nieee, nie twórz za każdym razem nowego obiektu. Musisz gdzieś sobie go trzymać i tak jak mówisz przekazywać do klas, w których jest to wymagane.
superzenon
Okej, a czy w takim razie, po użyciu trzeba to jakość "wyczyścić" np. uzywając closeCursor ? I gdzie tutaj zastosowanie PDO::ATTR_PERSISTENT - przydatne jest ustawienie atrybutu stałego połaczenia? Czy to może przydaje się tylko w przypadku, gdy inny skrypt będzie odwoływał sie do tego, w którym mam ustawione połączenie?
Mephistofeles
Zacznijmy od tego, że closeCursor to metoda PDOStatement. Służy ona mniej więcej do poinformowania silnika bazy, że skończyliśmy pobieranie wyników i może on dalej przetwarzać zapytania.
Jak masz uruchomione PHP? Przez CGI, FastCGI czy moduł serwera? Przy tym pierwszym persistent connection i tak nie zadziała, nie wiem jak z pozostałymi, generalnie nie musisz go stosować, może być z tego więcej szkód niż pożytku.
superzenon
Wiesz, tylko nadal zastanawia mnie, do czego się tych "persisten connection" używa. smile.gif


Kolejna rzecz przyszła mi na myśl, jak jest poprawnie, tak:

  1. try {
  2. $dsn = "...";
  3. $bd = new PDO(...);
  4. } catch(PDOException $e) {
  5. echo $e->getMessage();
  6. }
  7. // reszta kodu jak np.
  8.  
  9. $zapytanie = $bd->prepare('zapytanie');
  10. $zapytanie->setFetchMode(PDO::FETCH_NUM);
  11. $wynik = $zapytanie->execute();
  12.  
  13. $zapytanie->closeCursor();


czy tak:

  1. try {
  2. $dsn = "...";
  3. $bd = new PDO(...);
  4.  
  5. // reszta kodu jak np.
  6.  
  7. $zapytanie = $bd->prepare('zapytanie');
  8. $zapytanie->setFetchMode(PDO::FETCH_NUM);
  9. $wynik = $zapytanie->execute();
  10.  
  11. $zapytanie->closeCursor();
  12. } catch(PDOException $e) {
  13. echo $e->getMessage();
  14. }


Chodzi mi o to, czy kod dotyczący obiektu PDO muszę wrzucać do try {} - tak jak jest w każdym z tutoriali jakie czytałem, czy można bez obaw sobie reszte kodu poza ten try {} napisać? Są jakieś zagrożenia jak np. coś w zapytaniu będzie nie tak i sql sypnie błedem, który się nie wyświetli? Albo pokaże coś za dużo odnośnie błędu?
Crozin
1. PDO bardzo słabo obsługuje wyjątki.
2. PDO trzeba najpierw ustawić w tryb wyrzucania wyjątków zamiast zwykłych błędów (PDO::setAttribute()).
3. Metody PDOStatement::execute() i inne również mogą wyrzucić wyjątek więc powinny być w bloku try ... catch.
4. Jeżeli wyjątek masz zamiar obsłużyć tak samo (tutaj: jego wyświetlenie) to możesz całość objąć jednym blokiem try ... catch.
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.