Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PDO obsługa zapytań
Forum PHP.pl > Forum > PHP > Object-oriented programming
hunter1988
Witam

Dopiero raczkuję z programowanie php, tak samo z programowanie OOP, na starcie chciałbym zaznaczyć iż przeszukałem forum tak samo prosiłem wujka google o pomoc w tym problemie. Chciałem napisać zwykłe dodawanie rekordu do bazy danych,

  1. class Connect
  2. {
  3. function __construct()
  4. {
  5. try
  6. {
  7. $pdo = new PDO('mysql:host=localhost;dbname=XXX;encoding=utf8', 'XXX', 'XXX');
  8. $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  9. }
  10. catch(PDOException $e)
  11. {
  12. echo 'Połączenie nie mogło zostać utworzone: ';
  13. }
  14. }
  15.  
  16. }
  17.  


Łączenie z bazą danych jak najbardziej działa. Ale mam problem z obsługą PDO podczas dodawania czegokolwiek do bazy.

  1.  
  2. class Rejestracja extends Weryfikacja
  3. {
  4.  
  5. private $login;
  6. private $haslo;
  7. private $email;
  8.  
  9. function __construct($varlogin, $varhaslo, $varemail)
  10. {
  11. $this->login = $varlogin;
  12. $this->haslo = $varhaslo;
  13. $this->email = $varemail;
  14. }
  15.  
  16. public function addUser()
  17. {
  18.  
  19. $a = new Connect;
  20. $time = time();
  21. $kod = uniqid(rand());
  22.  
  23. $stmt = $pdo -> prepare('INSERT INTO `users` (`login`) VALUES(
  24. :login)');
  25.  
  26. $stmt -> bindValue(':login', $time, PDO::PARAM_INT);
  27. $stmt -> execute();
  28.  
  29. }
  30. }
  31.  
  32.  


No i takie coś wywołuje następujący błąd
Fatal error: Call to a member function prepare() on a non-object in /home/admin/domains/kino1.pl/public_html/php/4/nowa.class.php on line 69

69- linia kodu o nic innego jak linijka

  1. $stmt = $pdo -> prepare('INSERT INTO `users` (`login`) VALUES(
  2. :login)');

Dane oczywiście są podane do zapytania. Kopiowanie czegokolwiek z innych stron czy forum (w sensie zapytań INSERT w PDO ) powodują ten sam błąd, czy jest to możliwe, że serwer obsługuje łącznie z bd a nie obsługuje całości PDO ?
Z góry przepraszam za składnię postu, starałem zaznajomić się z zasadami panującymi na forum, ale jestem początkującym użytkownikiem.
Sephirus
Seriously... wystarczy przeczytać ten błąd i zobaczyć, że odwołujesz się do obiektu, którego nie ma... Twoja klasa Connect służy jedynie do połączenia - bez sensu zupełnie.

Ogólnie jako cytat z internetu "You're doing it wrong".

Obiekt PDO w klasie Connect sobie istnieje i nic poza tym - nie wywalasz go na zewnątrz ani nic. Potem w klasie Rejestracje w metodzie dodającej użytkownika tworzysz sobie nową instancje Connect (to nie tu powinno być tworzone a gdzieś wcześniej - by mieć jedno stałe połączenie z DB) ale go nie wykorzystujesz. Odwołujesz się do zmiennej $pdo, która defacto w tej metodzie nie istnieje...

Temat powinien trafić do przedszkola, bo widać, że raczkujesz z PHP (ogólnie - nie tylko obiektowym).

Nie zrozum mnie źle - nie chodzi mi o to by Ci wytykać błędy - po prostu usiądź z książką albo jakimś kursem i dopiero zacznij pisać na forum wink.gif Poszukaj w necie przykładów użycia PDO, jakiejś klasy opartej na PDO itp.

Co do samego postu to jest on dobrze napisany - co się rzadko zdarza - więc za to masz tu trochę podpowiedzi:

1. Utwórz klasę, która będzie miała następujące obowiązki:
- utworzenie połączenia z DB (raz na początku - może to byś SINGLETON lub poprzez odwołania statyczne) - metoda connect,
- zwracanie obiektu PDO - metoda getPDO albo coś w tym duchu

2. W klasie Rejestracja tam gdzie tego potrzebujesz pobierz z tej pierwszej klasy obiekt PDO i na nim działaj.

HTH wink.gif
hunter1988
Nie biorę tego do siebie wink.gif

Wiem, że raczkuję z php, już na starcie to napisałem, początki są najtrudniejsze, dziękuję za pomoc.

Rozumiem, że chodzi Ci o coś takiego?

http://www.youtube.com/watch?v=-uLbG7nJCJw
Sephirus
Tak aczkolwiek do tego aż filmik niepotrzebny smile.gif

Od razu powiem Ci też, że od podstaw nie nauczysz się od razu najlepszych, najbardziej wydajnych praktyk i wzorców (a raczej ich stosowania).

Podejrzyj jak inni to robią i próbuj podobnie - po pewnym czasie i doświadczeniu sam będziesz w stanie stwierdzać czy coś jest wydajne, poprawne itd.

Ja mógłbym Ci narzucić jakiś konkretny model jak stworzyć układ takich klas aby zrealizować to co teraz robisz ale jeśli naprawdę chcesz się nauczyć przy tym tego wszystkiego to musisz działać jak najwięcej sam smile.gif
hunter1988
Wiem, że to przedszkole, ale w php bawie się może od 4 tygodni a kilka dni w OPP ale skoro jest temat to fajnie byłoby gdyby było rozwiązanie, może ktoś kiedyś też będzie w przedszkolu i będzie potrzebował pomocy, a przy okazji zostawiam kod do weryfikacji, niby działa ale wiadomo jak to z tym bywa.

  1. class Database{
  2. private static $datasource='mysql:host=localhost;dbname=XXX';
  3. private static $username='XXX';
  4. private static $password='XXX';
  5. private static $db;
  6.  
  7.  
  8. private function __construct(){}
  9.  
  10. public static function getDB(){
  11. if(!isset(self::$db)){
  12. try{
  13. self::$db=new PDO(self::$datasource,self::$username,self::$password);
  14.  
  15. }
  16. catch(PDOExceptin $e)
  17. {
  18. $error=$e->getMessage();
  19. exit();
  20. }
  21. }
  22. return self::$db;
  23. }
  24.  
  25. }
  26.  
  27.  
  28. ?>


Do połączenia z bazą na początku pliku używamy statycznej metody połączenia z PDO

  1. $polacz = Database::getDB();


Teraz na początku łączę się z bazą danych, jeden raz i połączenie mam otwarte, z technicznego punktu widzenia jak to wykonać w jednym miejscu na całej aplikacji internetowej, powinienem użyć include lub require plik w którym występuje łączenie z bazą np include('config.php') czy w opp są inne metody na łączenie skryptu z bazą? Chodzi mi o taką dobrą praktykę jak to powinno się robić. Przepraszam za durne pytania ale na głupie i banalne pytania najczęściej najtrudniej znaleźć odpowiedź.
Sephirus
To działa typowo statycznie wobec czego wystarczy załadowac (require_once) plik z tą klasą na samym początku skryptów aplikacji i potem z każdego miejsca się do tego odwoływać.

Ta metoda ma już wbudowane tzw. ładowanie leniwe - czyli obiekt połączenia nie jest tworzony aż do pierwszego użycia - to w takich przypadkach bardzo dobra praktyka.

Istnieje sporo innych rozwiązań - można to by było zrobic na singletonie właśnie, bądź jako fabryka (to też wzorzec projektowy) ale na Twoje potrzeby Ci to starczy. Nie wskakuj od razu na głęboką wodę smile.gif wszystko z czasem wink.gif

Możesz też utworzyć klasę rejestru opartą na singletonie, w której to wrzucisz klasę połączenia z bazą danych - będzie ona mogła być wówczas zwykła (dynamiczna) co da Ci możliwość tworzenia połączeń do kliku baz naraz. Poczytaj o php registry itp. wink.gif
hunter1988
Jeszcze raz dziękuję za pomoc, temat problemu łączenia z bazą, uważam dzięki Twojej pomocy za zamknięty, z innymi rozwiązaniami łączenia z bazą na pewno będę się dłubał ale puki co chcę krok po kroku przejść od łączenia po dodawanie, edycję itp
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.