Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL][PHP]Początki w PHP OOP - problem z połączeniem PDO
Forum PHP.pl > Forum > Przedszkole
Panicz74
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ć?
rad11
Spróbuj najpierw zrobić

  1. self::$pdo = new PDO();
Damonsson
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
viking
Tylko akurat metoda clear nie ma żadnego uzasadnienia. Jak sam wspomniałeś mamy 2015, PHP 7 z wyrzuconym rozszerzeniem mysql.
Panicz74
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?
viking
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.
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.