Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySql] Pierwsze kroki z PDO, jak utrzymywać połączenie?
superzenon
post 5.12.2010, 22:52:32
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 5.12.2010

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


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?

Ten post edytował superzenon 5.12.2010, 22:56:19
Go to the top of the page
+Quote Post
Mephistofeles
post 5.12.2010, 23:18:44
Post #2





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

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


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.
Go to the top of the page
+Quote Post
superzenon
post 6.12.2010, 10:03:38
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 5.12.2010

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


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?

Ten post edytował superzenon 6.12.2010, 14:37:05
Go to the top of the page
+Quote Post
Mephistofeles
post 6.12.2010, 16:12:38
Post #4





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

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


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.
Go to the top of the page
+Quote Post
superzenon
post 6.12.2010, 18:01:30
Post #5





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 5.12.2010

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


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?

Ten post edytował superzenon 6.12.2010, 18:02:38
Go to the top of the page
+Quote Post
Crozin
post 6.12.2010, 18:50:03
Post #6





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

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


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.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 12.06.2025 - 22:10