Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> PHP OOP odwolanie do zmiennej
major697
post 9.04.2016, 11:30:01
Post #1





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 7.08.2014

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


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

Ten post edytował major697 9.04.2016, 11:35:47
Go to the top of the page
+Quote Post
sazian
post 9.04.2016, 15:38:59
Post #2





Grupa: Zarejestrowani
Postów: 1 043
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


  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.  
Go to the top of the page
+Quote Post
com
post 10.04.2016, 13:05:47
Post #3





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

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


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(...);


Ten post edytował com 10.04.2016, 13:08:00
Go to the top of the page
+Quote Post
piotras
post 11.04.2016, 09:05:51
Post #4





Grupa: Zarejestrowani
Postów: 41
Pomógł: 0
Dołączył: 8.07.2009

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


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
Go to the top of the page
+Quote Post
com
post 12.04.2016, 21:55:49
Post #5





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

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


piotras

Singletona? Singleton to antywzorzec, czyli generalnie zły kod, lepiej stosować IoC i DI wink.gif
Go to the top of the page
+Quote Post
viking
post 13.04.2016, 05:05:32
Post #6





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


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


--------------------
Go to the top of the page
+Quote Post
com
post 13.04.2016, 18:57:24
Post #7





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

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


Owszem np kiedy stosuję się service locator wink.gif
Go to the top of the page
+Quote Post
piotras
post 14.04.2016, 09:25:06
Post #8





Grupa: Zarejestrowani
Postów: 41
Pomógł: 0
Dołączył: 8.07.2009

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


@com
no spoko, ale co dokładnie sprawia, że użycie singletona w tej konkretnej sytuacji jest złym rozwiązaniem?
Go to the top of the page
+Quote Post
com
post 14.04.2016, 16:53:23
Post #9





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

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


Singleton sprawia, że ta klasa staję się globalna, co generalnie nigdy nie jest dobre wink.gif
Go to the top of the page
+Quote Post
mrc
post 15.04.2016, 07:44:06
Post #10





Grupa: Zarejestrowani
Postów: 160
Pomógł: 27
Dołączył: 22.09.2008
Skąd: Tarnów

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


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.


--------------------
Go to the top of the page
+Quote Post
mrc
post 15.04.2016, 20:50:02
Post #11





Grupa: Zarejestrowani
Postów: 160
Pomógł: 27
Dołączył: 22.09.2008
Skąd: Tarnów

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


Tak, konkretnie polskie wydanie. Skarbnica wiedzy.

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


--------------------
Go to the top of the page
+Quote Post
piotras
post 15.04.2016, 21:04:22
Post #12





Grupa: Zarejestrowani
Postów: 41
Pomógł: 0
Dołączył: 8.07.2009

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


ok, dzięki

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