Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP OOP odwolanie do zmiennej
Forum PHP.pl > Forum > PHP
major697
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. define("DB_HOST", 'localhost');
  4. define("DB_USER", 'michal');
  5. define("DB_PASSWORD", '');
  6. 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. die('Błąd połączenia (' . mysqli_connect_errno() . ') '
  18. . mysqli_connect_error());
  19. } else {
  20. 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 (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. header("Location: panel.php");
  13. } else {
  14. header("Location: index.php?error=4");
  15. die();
  16. }
  17.  
  18. }
  19.  
  20. }
  21. ?>


Zwraca kilka błędów:


Link do obrazka: KLIK
sazian
  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.  
com
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(...);
piotras
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
com
piotras

Singletona? Singleton to antywzorzec, czyli generalnie zły kod, lepiej stosować IoC i DI wink.gif
viking
Przez wielu ioc jest również uważany za antywzorzec.
com
Owszem np kiedy stosuję się service locator wink.gif
piotras
@com
no spoko, ale co dokładnie sprawia, że użycie singletona w tej konkretnej sytuacji jest złym rozwiązaniem?
com
Singleton sprawia, że ta klasa staję się globalna, co generalnie nigdy nie jest dobre wink.gif
mrc
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.
mrc
Tak, konkretnie polskie wydanie. Skarbnica wiedzy.

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

Wpisałem w google i wyskoczyło na pierwszym miejscu. Czytać i tak będę w wersji ksiązkowej
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.