Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ PHP _ PHP OOP odwolanie do zmiennej

Napisany przez: major697 9.04.2016, 11:30:01

cześć zrobiłem wcześniej skrypt PHP logowania do ssytemu chcę go teraz przerobić na obiektowy i zrobiłem połączenie z bazą danych:

  1. <?php
  2. //DANE DO LOGOWANIA DO BD
  3. http://www.php.net/define("DB_HOST", 'localhost');
  4. http://www.php.net/define("DB_USER", 'michal');
  5. http://www.php.net/define("DB_PASSWORD", '');
  6. http://www.php.net/define("DB_DATABSE", 'kurs_php');
  7. ?>
  8.  
  9. <?php
  10. //PLIK LOGOWANIA DO BD I SPRAWDZANIA POLACZENIA Z BD
  11. class dbConnect {
  12. function __construct() {
  13. require_once 'config.php';
  14. $db_mysqli = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABSE);
  15. //$db_mysqli->query('SET NAMES utf8');
  16. if (!$db_mysqli) {
  17. http://www.php.net/die('Błąd połączenia (' . mysqli_connect_errno() . ') '
  18. . mysqli_connect_error());
  19. } else {
  20. http://www.php.net/echo '<font size="2px" color="red">Info: Połączono z bazą danych.</font><br />';
  21. }
  22. }
  23. public function CloseDb() {
  24. mysqli_close();
  25. }
  26. }
  27. ?>


To połączenie działa poprawnie, problem pojawia się gdy mam się odwołać do zmiennej $db_mysqli, która przechowuje "połączenie z bazą" w skrypcie logowania:

  1. <?php
  2. // KLASA Z FUNKCJAMI LOGOWANIE UŻYTKOWNIKA
  3. class Functions {
  4.  
  5. function __construct() {
  6.  
  7. // connecting to database
  8. $db_mysqli = new dbConnect();
  9.  
  10. }
  11. function __destruct() {
  12.  
  13. }
  14.  
  15. public function Login($login, $hasloSha1) {
  16. $result = $db_mysqli->prepare("SELECT haslo FROM uzytkownicy WHERE login=? AND haslo=?");
  17. $result->bind_param('ss', $login, $hasloSha1);
  18. $result->execute();
  19. $result->store_result();
  20. $row = mysqli_fetch_assoc($result);
  21. $kodAktywowany = $row['kod'];
  22.  
  23. //sprawdzenie czy taki uzytkownik istnieje
  24. if ($result->num_rows == 1) {
  25. $_SESSION['logowanie'] = $login;
  26. return TRUE;
  27. } else {
  28. return FALSE;
  29. }
  30. }
  31.  
  32. }
  33. ?>


Nie wiem jak przerobić skrypt abym mógł się dowołać do zmiennej $db_mysqli w zapytaniu:
  1. <?php $result = $db_mysqli->prepare("SELECT haslo FROM uzytkownicy WHERE login=? AND haslo=?"); ?>


Funkcja wywołująca klasę z instancją:

  1. <?php
  2. $func = new Functions();
  3.  
  4. if (http://www.php.net/isset($_POST['log_in'])) {
  5.  
  6. if ($_POST['log_in']) {
  7. $login = mysqli_real_escape_string($db_mysqli, $_POST['login']);
  8. $haslo = mysqli_real_escape_string($db_mysqli, $_POST['pass']);
  9. $hasloSha1 = sha1($haslo);
  10. $user = $func->Login($login, $hasloSha1);
  11. if ($user == TRUE) {
  12. http://www.php.net/header("Location: panel.php");
  13. } else {
  14. http://www.php.net/header("Location: index.php?error=4");
  15. http://www.php.net/die();
  16. }
  17.  
  18. }
  19.  
  20. }
  21. ?>


Zwraca kilka błędów:


Link do obrazka: http://i.imgur.com/euep4qz.png

Napisany przez: sazian 9.04.2016, 15:38:59

  1.  
  2. class dbConnect {
  3. public $db_mysqli;
  4. function __construct() {
  5. require_once 'config.php';
  6. $this->db_mysqli = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABSE);
  7.  
  8.  
  9. (...)
  10.  
  11. class Functions {
  12. public $db_mysqli;
  13. function __construct() {
  14.  
  15. // connecting to database
  16. $this->db_mysqli = new dbConnect();
  17.  
  18. }
  19. function __destruct() {
  20.  
  21. }
  22.  
  23. public function Login($login, $hasloSha1) {
  24. $result = $this->db_mysqli->db_mysqli->prepare("SELECT haslo FROM uzytkownicy WHERE login=? AND haslo=?");
  25. (....)
  26.  
  27.  

Napisany przez: com 10.04.2016, 13:05:47

sazian ale public? naprawdę wink.gif

  1.  
  2. class Functions {
  3. private $db_mysqli;
  4. function __construct($db) {
  5.  
  6. $this->db_mysqli = $db;
  7.  
  8. }
  9. function __destruct() {
  10.  
  11. }
  12.  
  13. public function Login($login, $hasloSha1) {
  14. $result = $this->db_mysqli->prepare("SELECT haslo FROM uzytkownicy WHERE login=? AND haslo=?");
  15. (....)


I wywołanie
  1. require_once 'config.php';
  2. // ew jakiś try catch
  3. $db = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABSE);
  4.  
  5. $functions = new Functions($db);
  6. $functions->Login(...);

Napisany przez: piotras 11.04.2016, 09:05:51

Zrób z dbConnection singletona dziedziczącego po PDO. Nie będzie lepiej?

Później do Functions::Login przekaż tego singletona razem z danymi do logowania. Po co dawać go w całej Functions (no chyba, że logowanie to jej jedyna jej funkcja) smile.gif

Napisany przez: com 12.04.2016, 21:55:49

piotras

Singletona? Singleton to antywzorzec, czyli generalnie zły kod, lepiej stosować IoC i DI wink.gif

Napisany przez: viking 13.04.2016, 05:05:32

Przez wielu ioc jest również uważany za antywzorzec.

Napisany przez: com 13.04.2016, 18:57:24

Owszem np kiedy stosuję się service locator wink.gif

Napisany przez: piotras 14.04.2016, 09:25:06

@com
no spoko, ale co dokładnie sprawia, że użycie singletona w tej konkretnej sytuacji jest złym rozwiązaniem?

Napisany przez: com 14.04.2016, 16:53:23

Singleton sprawia, że ta klasa staję się globalna, co generalnie nigdy nie jest dobre wink.gif

Napisany przez: mrc 15.04.2016, 07:44:06

Pisząc kod obiektowy chodzi o przekazywanie sobie nawzajem obiektów, od których dana funkcja/klasa jest zależna. Singleton jest zły, ponieważ zamiast przekazywać go, tworzysz go. Tworzysz przez to zależności wewnątrz obiektu, co jest trudne do przetestowania automatycznego.

Na początku singleton jest fajny. Bardzo długo go kochałem. @piotras przeczytaj sobie książkę Uncle Boba - Czysty Kod. Tam jest przedstawiony świetny model programowania obiektowego, który mimo że nie mówi że singleton jest zły, to z góry wyklucza go jako dobre rozwiązanie.

Napisany przez: mrc 15.04.2016, 20:50:02

Tak, konkretnie polskie wydanie. Skarbnica wiedzy.

Oczywiście, polecam zakup. Ściąganie z neta piratów to brak szacunku do kolegów po fachu.

Napisany przez: piotras 15.04.2016, 21:04:22

ok, dzięki

Wpisałem w google i wyskoczyło na pierwszym miejscu. Czytać i tak będę w wersji ksiązkowej

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)