Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP] Błąd połączenia PDO (Programowanie obiektowe)
Kerth
post 10.03.2015, 00:01:22
Post #1





Grupa: Zarejestrowani
Postów: 250
Pomógł: 1
Dołączył: 6.08.2012

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


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
Go to the top of the page
+Quote Post
com
post 10.03.2015, 00:05:51
Post #2





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


Co to za dziwna nazwa klasy? Nie przekazujesz parametrow do konstruktora ktore sobie zdefiniowales
Go to the top of the page
+Quote Post
Kerth
post 10.03.2015, 00:11:02
Post #3





Grupa: Zarejestrowani
Postów: 250
Pomógł: 1
Dołączył: 6.08.2012

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


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. ?>


Ten post edytował Kerth 10.03.2015, 00:11:25
Go to the top of the page
+Quote Post
com
post 10.03.2015, 00:14:34
Post #4





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


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
Go to the top of the page
+Quote Post
Kerth
post 10.03.2015, 00:19:03
Post #5





Grupa: Zarejestrowani
Postów: 250
Pomógł: 1
Dołączył: 6.08.2012

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


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?

Ten post edytował Kerth 10.03.2015, 00:21:35
Go to the top of the page
+Quote Post
com
post 10.03.2015, 00:25:40
Post #6





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


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
Go to the top of the page
+Quote Post
Kerth
post 10.03.2015, 00:36:31
Post #7





Grupa: Zarejestrowani
Postów: 250
Pomógł: 1
Dołączył: 6.08.2012

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


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.
Go to the top of the page
+Quote Post
com
post 10.03.2015, 01:05:57
Post #8





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


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

Ten post edytował com 10.03.2015, 00:55:40
Go to the top of the page
+Quote Post
Kerth
post 10.03.2015, 01:30:44
Post #9





Grupa: Zarejestrowani
Postów: 250
Pomógł: 1
Dołączył: 6.08.2012

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


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?
Go to the top of the page
+Quote Post
com
post 10.03.2015, 01:44:28
Post #10





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


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

Ten post edytował com 10.03.2015, 02:02:54
Go to the top of the page
+Quote Post
Boshi
post 10.03.2015, 01:44:49
Post #11





Grupa: Zarejestrowani
Postów: 342
Pomógł: 15
Dołączył: 30.08.2011

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


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

Ten post edytował Boshi 10.03.2015, 02:46:00
Go to the top of the page
+Quote Post
Kerth
post 10.03.2015, 16:19:58
Post #12





Grupa: Zarejestrowani
Postów: 250
Pomógł: 1
Dołączył: 6.08.2012

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


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?
Go to the top of the page
+Quote Post
Boshi
post 10.03.2015, 17:27:22
Post #13





Grupa: Zarejestrowani
Postów: 342
Pomógł: 15
Dołączył: 30.08.2011

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


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();
Go to the top of the page
+Quote Post
com
post 11.03.2015, 14:55:46
Post #14





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


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

Ten post edytował com 11.03.2015, 14:57:17
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.07.2025 - 19:22