Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Błąd połączenia PDO (Programowanie obiektowe)
Forum PHP.pl > Forum > Przedszkole
Kerth
Cześć,
próbuję zrozumieć co jest źle w poniższym kodzie, że pojawiaja się ostrzeżenia. Co robię źle?
  1. class __construct{
  2. private $host = "localhost";
  3. private $username = "root";
  4. private $password = "pass";
  5. private $database = "database";
  6.  
  7. public function SQLConnection($host, $username, $password, $database){
  8. try{
  9. $db = new PDO('mysql:host='.$host.';dbname='.$database.'', ''.$username.'', ''.$password.'',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  10. echo 'Połączenie nawiązane!';
  11. }catch(PDOException $e){
  12. echo 'Połączenie nie mogło zostać utworzone.';
  13. }
  14.  
  15. }


Kod
Warning: Missing argument 1 for __construct::SQLConnection(), called in C:\WebServ\httpd\oop_mvc\index.php on line 12 and defined in C:\WebServ\httpd\oop_mvc\controller\ConfigDatabase.class.php on line 18

Warning: Missing argument 2 for __construct::SQLConnection(), called in C:\WebServ\httpd\oop_mvc\index.php on line 12 and defined in C:\WebServ\httpd\oop_mvc\controller\ConfigDatabase.class.php on line 18

Warning: Missing argument 3 for __construct::SQLConnection(), called in C:\WebServ\httpd\oop_mvc\index.php on line 12 and defined in C:\WebServ\httpd\oop_mvc\controller\ConfigDatabase.class.php on line 18

Warning: Missing argument 4 for __construct::SQLConnection(), called in C:\WebServ\httpd\oop_mvc\index.php on line 12 and defined in C:\WebServ\httpd\oop_mvc\controller\ConfigDatabase.class.php on line 18
Połączenie nawiązane!
Fatal error: Call to a member function query() on a non-object in C:\WebServ\httpd\oop_mvc\controller\ConfigDatabase.class.php on line 28
com
Co to za dziwna nazwa klasy? Nie przekazujesz parametrow do konstruktora ktore sobie zdefiniowales
Kerth
No może rzeczywiście dziwna nazwa. Poprawiłem. Ale nie bardzo rozumiem jak mam przekazać parametry do konstruktora.
  1. class Database{
  2. private $host = "localhost";
  3. private $username = "root";
  4. private $password = "";
  5. private $database = "portal";
  6.  
  7. public function SQLConnection($host, $username, $password, $database){
  8. try{
  9. $db = new PDO('mysql:host='.$host.';dbname='.$database.'', ''.$username.'', ''.$password.'',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  10. echo 'Połączenie nawiązane!';
  11. }catch(PDOException $e){
  12. echo 'Połączenie nie mogło zostać utworzone.';
  13. }
  14. }
  15.  
  16. public function getSomeData(){
  17. $db = $this->pdo->query('INSERT INTO `users` (`nick`) VALUES (`dawidasd`)');
  18. }
  19. }


W ten sposób wyświetlam w pliku index.php:
  1. <?php
  2.  
  3. /**
  4.  * TITLE: Home page in OOP and MVC in PHP.
  5.  */
  6.  
  7. require_once("controller/ConfigDatabase.class.php");
  8. $connectDatabase = new Database;
  9. $connectDatabase->SQLConnection();
  10. ?>
com
Siedze na mobile to napisze Ci slownie. Tam gdzie wywulujesz w 9 lini w nawiasie () piszesz te wszystkie wartosci co masz w deklaracje. Oczywiscie to co tam ma byc smile.gif Poczytaj o obiektowosci bo troche sie w tym gubisz jeszcze smile.gif
Kerth
Ok. Dzięki Ci za pomoc. Masz rację, jeszcze się gubię w OOP. Jednakże odnośnie kodu to nie wiem dlaczego się tak dzieje: gdy wpiszę błędne dane połączenia to mimo wszystko pojawia się komunikat o poprawnym połączeniu z bazą danych:

  1. <?php
  2.  
  3. /**
  4.  * TITLE: Home page in OOP and MVC in PHP.
  5.  */
  6.  
  7. require_once("controller/ConfigDatabase.class.php");
  8. $connectDatabase = new Database;
  9. $connectDatabase->SQLConnection($host, $username, $password, $database);
  10. ?>


Wiesz może dlaczego tak się dzieje?
com
Widze wpisales tam zmienne a je wgl gdzies masz zadeklarowane? A co do pytania to dlatego ze kod sie wykonuje pokolei jak podasz bledne dane to pdo sie nie wysypie tylko zwroci null i php pojdzie dalej. Blok try jest ok ale zabraklo warunku ktory sprawdza czy sie polaczyles i dopiero w nim ten komunikat smile.gif
Kerth
W pliku: ConfigDatabase.class.php

  1. class Database{
  2. public $host = "localhost";
  3. public $username = "root";
  4. public $password = "";
  5. public $database = "portal";
  6.  
  7. public function SQLConnection($host, $username, $password, $database){
  8. try{
  9. $db = new PDO('mysql:host='.$host.';dbname='.$database.'', ''.$username.'', ''.$password.'',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  10. echo 'Połączenie nawiązane!';
  11. }catch(PDOException $e){
  12. echo 'Połączenie nie mogło zostać utworzone.';
  13. }
  14. }
  15. }


deklaruję zmienne publiczne zaraz pod klasą. Ten plik później załączam do index.php:

  1. require_once("controller/ConfigDatabase.class.php");
  2. $connectDatabase = new Database;
  3. $connectDatabase->SQLConnection($host, $username, $password, $database);


Ostrzeżeń się pozbyłem. Mówisz o utworzeniu warunku sprawdzającego połączenie co dla mnie jest zaskoczeniem gdyż tego samego kodu połączenia używałem podczas programowania strukturalnego i nie było z nim problemów. O jakim warunku mówisz? Jakiej funkcji w nim użyć? Wiem, że się dopytuję zbyt dużo pewnie ale to dla mnie nowa sprawa.
com
To nie tak smile.gif warunek to if(!empty($db))
To co tam deklarujesz narazie ma sie nijak do tego kodu smile.gif zeby odwolac sie do zmiennej z wnetrza klasy musisz zrobic w twoim wypadku $this->host itd ale to wtedy w zasadzie nie potrzeba Ci w konstruktorze tych prametrow skoro robisz na sztywno. Musisz poczytac bo narazie nie widzisz tego zupelnie jak to wszystko dziala. A ja na telefonie tez Ci nie pomoge za bardzo. W index php zamiast zmienych wpisz normalnie dane. Bo tych zmiennych co zadeklarowales w tej postaci itak narazie nie uzywasz :-)

Jak nie zapomne to naskrobie Ci przyklad popoludniu jak bd na kompie. Ale mimo wszystko bd musial zajrzec do kursu oop bo bez tego ani rusz tymbardziej ze widze to sa jakies zalazki modelu mvc smile.gif
Kerth
Spróbowałem wykorzystać to $this i utworzyłem taki kod:
  1. <?php
  2.  
  3. /**
  4.  * TITLE: Connecting class with MySQL Databas
  5.  */
  6.  
  7.  
  8.  
  9. class Database{
  10. public $host = "localhost";
  11. public $username = "root";
  12. public $password = "";
  13. public $database = "portal";
  14.  
  15. public function SQLConnection($host, $username, $password, $database){
  16.  
  17. try{
  18. $db = new PDO(
  19. 'mysql:host='.$this->host.';
  20. dbname='.$this->database.'',
  21. ''.$this->username.'',
  22. ''.$this->password.'',
  23. array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  24.  
  25. }catch(PDOException $e){
  26. echo 'Connection failed: ' . $e->getMessage();
  27. }
  28. }
  29.  
  30. }
  31.  
  32.  
  33. ?>

Teraz wszystko jest OK. Po wpisaniu złych danych otrzymuję komunikat o błędzie. Obyło się bez warunku sprawdzającego. Czy możesz mi powiedzieć czy dobrze to zrobiłem czy coś jest nie tak pod względem optymalności?
com
Jest ok ale sa dwa ale pierwsze teraz parametry w deklkaracji i wywolaniu metody sa nie potrzebne. Drugie taka klasa nic Ci nie daje bo itak musisz do niej zajrzec zeby cos zmienic w polaczeniu. Najlepsze to obecnie jest stosowanie DI czyli przekazujesz sam obiekt do konstruktora smile.gif

No to kolega Boshi dal Ci przyklad jak to w zasadzie powinno wygladac dla twojego przypadku kiedy chcesz robic to w taki sposob smile.gif

@down maly blad sie wkradl $this->pole zamiast $this->field :-D
Boshi
Jeżeli już to konstruktor powinien łączyć się z bazą przy tworzeniu instancji klasy. Nie robi się etykiet publicznych-łamiesz jedną z podstawowych zasad OOP- hermetyzacje. Nie wiem po co też tworzysz funkcje przyjmująca parametry a przy tym deklarujesz pola publiczne z danymi.
Tak jak kolega com. napisał, do zmiennych wewnątrz klasy odwołujemy się po przez $this->zmienna. A po to jest to zrobione by wiedzieć która zmienna jest lokalną a która polem klasy. ufff

  1. class first
  2. {
  3. private $field;
  4. public function __construct($field)
  5. {
  6. $this->field=$field;
  7. }
  8. public function Get()
  9. {
  10. echo $this->field;
  11. }
  12. }//end class


  1. class Database{
  2.  
  3.  
  4. public function __construct($host, $database, $username,$pass )
  5. {
  6.  
  7. try
  8. {
  9. $db = new PDO('mysql:host='.$host.';dbname='.$database, $username,$pass,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  10. echo 'Połączenie nawiązane!';
  11. }
  12. catch(PDOException $e)
  13. {
  14. echo 'Połączenie nie mogło zostać utworzone.'.$e->getMessage();
  15. }
  16. }
  17.  
  18. }
  19.  
  20.  
  21. $host = "localhost";
  22. $username = "root";
  23. $password = "";
  24. $database = "portal";
  25. $ob=new Database($host,$database,$username,$password);


Edit: @up poprawione smile.gif
Kerth
Dzięki Wam za pomoc. Podepnę się jeszcze pod ten temat, bo mam jeszcze problem, który niejako z niego wynika. Jak utworzyć jakieś proste(najprostsze) zapytanie do bazy danych? W OOP jest to jakoś ciężko mi zrozumieć. Mógłby mi ktoś pokazać jakiś przykładowy kod względem wcześniejszego łączenia z bazą danych?
Boshi
Dane są z mojej bazy
  1. class Database{
  2.  
  3. private $db;
  4.  
  5. public function __construct($host, $database, $username,$pass )
  6. {
  7.  
  8. try
  9. {
  10. $this->db = new PDO('mysql:host='.$host.';dbname='.$database, $username,$pass,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  11. echo 'Połączenie nawiązane!';
  12. }
  13. catch(PDOException $e)
  14. {
  15. echo 'Połączenie nie mogło zostać utworzone.'.$e->getMessage();
  16. }
  17.  
  18. }
  19.  
  20. public function getData()
  21. {
  22. $getData=$this->db->query('Select * From uzytkownicy');
  23.  
  24. foreach ($getData as $value)
  25. {
  26. echo $value['login']."<br>";
  27. }
  28.  
  29.  
  30. }
  31.  
  32. }
  33.  
  34. $ob=new Database('localhost','user','root', '');
  35. $ob->getData();
com
Boshi niestety w tym wypadku nie tak, tylko:
  1. class Database
  2. {
  3. private $db;
  4.  
  5. public function __construct($host, $database, $username, $pass)
  6. {
  7. try
  8. {
  9. $this->db = new PDO('mysql:host='.$host.';dbname='.$database, $username,$pass,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  10. echo 'Połączenie nawiązane!';
  11. }
  12. catch(PDOException $e)
  13. {
  14. echo 'Połączenie nie mogło zostać utworzone.'.$e->getMessage();
  15. }
  16. }
  17.  
  18. public function getData()
  19. {
  20. return !empty($this->db) ? $this->db->query('SELECT * FROM users') : array();
  21. }
  22. }
  23.  
  24. $ob=new Database('localhost','user','root','');
  25.  
  26. foreach ($ob->getData() as $value)
  27. {
  28. echo $value['login'].'<br>';
  29. }


Przykład Boshi zamyka te klase i w zasadzie staję się wtedy bezużyteczna, bo co jeśli zamiast chcieć wyświetlić coś w nowych liniach bd chciał zrobić to w tablece czy czymkolwiek. Takie podejście jak powyżej pokazuje tylko, że ktoś na sile chce upchnąć kod który tworzył strukturalnie do klasy i to jest złe, bardzo złe 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.