Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SQL][PHP]Początki w PHP OOP - problem z połączeniem PDO
Panicz74
post 8.12.2015, 22:13:30
Post #1





Grupa: Zarejestrowani
Postów: 39
Pomógł: 1
Dołączył: 28.08.2015

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


Witam,

Zaczynam się dopiero uczyć PHP OOP. Utworzyłem skrypt połączenia z bazą i logowania. Kiedy próbuję się zalogować otrzymuję komunikat: Fatal error: Call to a member function prepare() on null in C:\xampp\htdocs\try\CLASS\phpLoader.class.php on line 18

Bardzo proszę was o pomoc i wyrozumiałość bo naprawdę mnie ta obiektówka rozłożyła. Oto kod:

config.class.php:
  1. <?php
  2.  
  3. class config
  4. {
  5. static public $pdo;
  6.  
  7. static public function connect()
  8. {
  9.  
  10. try
  11. {
  12. $pdo = new PDO('mysql:host=localhost; dbname=baza', 'root', '');
  13. return true;
  14. echo "Połączono";
  15. }
  16. catch(PDOException $e)
  17. {
  18. echo 'Wystąpił problem z połączeniem z bazą danych '.$e->getMessage();
  19. }
  20. }
  21.  
  22. static public function disconnect()
  23. {
  24. }
  25.  
  26.  
  27. static public function clear($text)
  28. {
  29. // jeśli serwer automatycznie dodaje slashe to je usuwamy
  30. {
  31. $text = stripslashes($text);
  32. }
  33. $text = trim($text);
  34. $text = mysql_real_escape_string($text);
  35. $text = htmlspecialchars($text);
  36. return $text;
  37.  
  38. }
  39.  
  40. static public function codepass($password)
  41. {
  42. return sha1(md5($password).'#!%Rgd64');
  43. }
  44.  
  45. }
  46.  
  47. ?>


phpLoader.php:
  1. <?php
  2.  
  3. class phpLoader extends config
  4. {
  5. // funkcja: logowanie
  6. static public function login()
  7. {
  8. require_once 'config.class.php';
  9. config::connect();
  10. if(empty($_SESSION['logged']))
  11. {
  12. if(isset($_POST['name']))
  13. {
  14. $_POST['name'] = config::clear($_POST['name']);
  15. $_POST['password'] = config::clear($_POST['password']);
  16. $_POST['password'] = config::codepass($_POST['password']);
  17.  
  18. $query = config::$pdo->prepare("SELECT `user_id` FROM `users` WHERE `user_name` = '{$_POST['name']}' AND `user_password` = '{$_POST['password']}' LIMIT 1");
  19. try
  20. {
  21. $query->execute();
  22. if($query->rowCount() > 0)
  23. {
  24. $dane = $query->fetch(PDO::FETCH_ASSOC);
  25. if($dane['user_pasword'] === $_POST['password'])
  26. {
  27. $_SESSION['logged'] = true;
  28. $_SESSION['user_id'] = $row['user_id'];
  29. }
  30. else
  31. {
  32. echo "Złe hasło";
  33. }
  34.  
  35. }
  36. else
  37. {
  38. echo "Zły użytkownik";
  39. }
  40. }
  41. catch(PDOException $e)
  42. {
  43. $e->getMessage();
  44. }
  45. }
  46. }
  47. config::disconnect();
  48. }
  49.  
  50. }
  51.  
  52. ?>


login.php:
  1. <?php
  2.  
  3. require_once 'CLASS/config.class.php';
  4. require_ONCE 'CLASS/ModuleLoader.class.php';
  5. require_once 'CLASS/phpLoader.class.php';
  6.  
  7. ModuleLoader::setDoctype();
  8. phpLoader::login();
  9. ModuleLoader::setLogo();
  10. ModuleLoader::setTopbar();
  11. ModuleLoader::setSidebar();
  12. ModuleLoader::setContent();
  13. ModuleLoader::setFooter();
  14.  
  15. ?>


Na kodowanie hasła, itd. nie patrzcie na razie. Na razie chciałbym się po prostu zalogować. Co robię źle? Dlaczego to nie działa? Co powinienem zmienić/dopisać?
Go to the top of the page
+Quote Post
rad11
post 8.12.2015, 22:38:16
Post #2





Grupa: Zarejestrowani
Postów: 1 270
Pomógł: 184
Dołączył: 7.10.2012
Skąd: Warszawa

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


Spróbuj najpierw zrobić

  1. self::$pdo = new PDO();
Go to the top of the page
+Quote Post
Damonsson
post 8.12.2015, 23:21:29
Post #3





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


Nie nie nie, wszystko źle.

Nie wolno używać static! Wolno w różnych przypadkach, ale na tym etapie nauki przyjmij, że nie wolno i koniec, będziesz zmuszony myśleć obiektowo.
Poczytaj o Dependency Injection, poszukaj czegoś w google w stylu: php login db dependency injection i oprzyj na tym swój przykład.
Staraj się używać autoloadera vide Composer.
Staraj się używać przestrzeni nazw, które weszły do PHP w 2009 roku, mamy 2015.

Nie zastanawiaj się nawet nad tym błędem, bo szkoda Twojego czasu, tylko napisz to porządnie od nowa.


Edit: akurat użycie static do metody public function clear jest zasadne smile.gif

Ten post edytował Damonsson 8.12.2015, 23:24:13
Go to the top of the page
+Quote Post
viking
post 9.12.2015, 03:57:26
Post #4





Grupa: Zarejestrowani
Postów: 6 378
Pomógł: 1116
Dołączył: 30.08.2006

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


Tylko akurat metoda clear nie ma żadnego uzasadnienia. Jak sam wspomniałeś mamy 2015, PHP 7 z wyrzuconym rozszerzeniem mysql.


--------------------
Go to the top of the page
+Quote Post
Panicz74
post 9.12.2015, 08:57:48
Post #5





Grupa: Zarejestrowani
Postów: 39
Pomógł: 1
Dołączył: 28.08.2015

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


Rozumiem, chciałbym po prostu zrobić połączenie PDO w jednej klasie, a następnie wywołać to połączenie w innej klasie. Przepraszam was za moją nieporadność, słabo rozumiem ta obiektowość. Znacie może jakiś prosty przykład, który jest w stanie pokazać, choc po części o co chodzi?

Dla was też OOP było takie cosmic-science na początku?
Go to the top of the page
+Quote Post
viking
post 9.12.2015, 09:33:40
Post #6





Grupa: Zarejestrowani
Postów: 6 378
Pomógł: 1116
Dołączył: 30.08.2006

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


Wiadomo że wszystko co nowe jest na początku trudne. Zobacz jak robią to inni np. https://github.com/zendframework/zend-db
Możesz też od razu spróbować trochę się biblioteką pobawić albo użyć Propel, Doctrine, itp.
Sądzę też że pomogłoby Ci lepiej zrozumieć ideę pobawienie się np nowo wydanym Slim 3 albo Zend Expressive (ten nie wstrzykuje kontenera do zależności więc byłby trudniejszy ale zarazem lepszy do nauki). Mocno wymuszają korzystanie z Service Managera.

Ten post edytował viking 9.12.2015, 09:37:10


--------------------
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: 21.06.2025 - 12:25