Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: klasa PDO i łączenie z bazą
Forum PHP.pl > Forum > PHP > Object-oriented programming
rafiksq
Póki co to dopiero moje pierwsze kroki z OOP więc przepraszam jeśli ktoś mnie nie zrozumie.

Mam kilka klas, w których następują pobierania danych z bazy, import czy update. Jak do takiej klasy "przetransportować" połączenie z bazą. Czy można połączyć się z bazą na samym początku i jakoś informować każdą klasę o połączeniu?

Chciałbym uniknąć sytuacji:
  1. class klasa1{
  2. $base = new PDO('mysql:host=localhost;dbname=faktura', 'root', '');
  3. $base -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  4. ....
  5. }
  6.  
  7. class klasa2{
  8. $base = new PDO('mysql:host=localhost;dbname=faktura', 'root', '');
  9. $base -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  10. ....
  11. }
  12.  
  13. class klasa3{
  14. $base = new PDO('mysql:host=localhost;dbname=faktura', 'root', '');
  15. $base -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  16. ....
  17. }
Daiquiri
Zamiast inicjalizować za każdym razem nowy obiekt PDO, możesz wstrzykiwać go do obiektu, np. poprzez konstruktor i wykorzystywać potem w zakresie całej klasy.
  1. $objPDO = new PDO('mysql:host=localhost;dbname=faktura', 'root', '');
  2. // a następnie:
  3. $cos = new klasa($objPDO);
  4.  
  5. class klasa {
  6. private $objPDO;
  7. public function __construct($objPDO)
  8. {
  9. $this->objPDO = $objPDO;
  10. }
  11. }

Wszystko zależy od tego, na jakim etapie jesteś oraz czego potrzebujesz smile.gif.
jaworr
Można też stworzyć klasę dziedziczącą po PDO i korzystać z konstruktora klasy PDO.

  1. class MyPDO extends PDO{
  2. //jakies funkcje
  3. }
  4.  
  5. $myPDO = new MyPDO('mysql:host=localhost;dbname=faktura', 'root', '');
rafiksq
Niestety tak też już próbowałem i nie działa:
  1. class createForm{
  2.  
  3. public $numberOfProducts;
  4. public $header;
  5. private $objPDO;
  6.  
  7. public function __construct($objPDO){
  8. $this->objPDO = $objPDO;
  9. echo "<form method=\"POST\" action=\"?action=sent\"><table>";
  10.  
  11. }
  12.  
  13. function showHeader(){
  14. try {
  15. $sql = "SELECT * FROM products ORDER BY idProduct ASC";
  16. foreach ($objPDO->query($sql) as $row){
  17. $this->header.="<td>".$row['name']."</td>";
  18. }
  19. //$base = null;
  20. }catch(PDOException $e){echo $e->getMessage();}
  21. return "<tr><td></td>".$this->header."</tr>";
  22. }
  23.  
  24.  
  25. }
jaworr
spróbuj moim sposobem, u mnie działa
rafiksq
juz mi działa,
w jednej z metod klasy zamiast $this->objPDO:
  1. foreach ($this->objPDO->query($sql) as $row){
  2. $this->header.="<td>".$row['name']."</td>";
  3. }


miałem tylko $objPDO:
  1. foreach [b]($objPDO[/b]->query($sql) as $row){
  2. $this->header.="<td>".$row['name']."</td>";
  3. }


dzięki za pomoc

Jeszcze jedno pytanko: Mam w klasie taką metodę

  1. function showHeader(){
  2. try {
  3. $sql = "SELECT * FROM products ORDER BY idProduct ASC";
  4. foreach ($this->objPDO->query($sql) as $row){
  5. $this->header.="<td>".$row['name']."</td>";
  6. }
  7.  
  8. //$base = null;
  9. }catch(PDOException $e){echo $e->getMessage();}
  10. return "<tr><td></td>".$this->header."</tr>";
  11. }


Jak wyswietlic ilosc pobranych rekordow kiedys stosowalem funkcje mysql_num_rows a teraz?
DBR
  1. $q = "SELECT * FROM users";
  2. $re = $dbh->query($q);
  3.  
  4. echo $re->rowCount();
rafiksq
Rewelacja, dzięki za pomoc.

p.s.
A jaka jest różnica między rowCount() a fetchColumn()?
Daiquiri
No ludziska, manual: fetchColumn() i RowCount() 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.