Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Uzywanie database w innej klasie
Forum PHP.pl > Forum > Przedszkole
goartur
Czesc mam problem z uzywaniem mysql w innej klasie, jestem poczatkujacy w oop, lecz chce wysylac zapytania z klasy user_Access lecz niedziala funkcja $this->db_query, dotaje meldunek "Query method not found in class", probowalem tez uzywc: mysqli_query, lecz tez niedziala,
mam taka klase do polaczenia a mysql
  1. class db
  2. {
  3. public function db()
  4. {
  5. $db = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
  6.  
  7.  
  8. if ($db->connect_errno) {
  9.  
  10. echo "Error: Could not connect to database.";
  11.  
  12.  
  13. }
  14. else { return $db; }
  15.  
  16. }
  17.  
  18.  
  19. }



a oto user_Access.php

  1. $db = new db();
  2. $userDB = new user_access($db->db());
  3. $userDB->check_login('artur','ol');
  4. class user_access{
  5.  
  6. public $db;
  7.  
  8. public function __construct($db){
  9. $this->db = $db;
  10.  
  11. }
  12. public function check_login($login,$password){
  13. $password = sha1($password);
  14. $sql = "SELECT * FROM admins WHERE username = '$login' AND password = '$password'";
  15. $result = $result = $this->db->query($sql);
  16.  
  17. if($result->num_rows > 1){
  18. echo 'ok';
  19. }else{
  20. echo "not";
  21. }
  22. }
  23.  
  24. }


Moze mi ktos pokazac gdzie jest blad?
prz3kus
  1. class user_access{
  2.  
  3. public $db;
  4.  
  5. public function __construct($db){
  6. $this->db = $db;
  7.  
  8. }
  9. public function check_login($login,$password){
  10. $password = sha1($password);
  11. $sql = "SELECT * FROM admins WHERE username = '$login' AND password = '$password'";
  12. $result = $result = $this->db->query($sql);
  13.  
  14. if($result->num_rows > 1){
  15. echo 'ok';
  16. }else{
  17. echo "not";
  18. }
  19. }
  20.  
  21. }
  22.  
  23.  
  24. $db = new db();
  25. $userDB = new user_access($db->db());
  26. $userDB->check_login('artur','ol');


Masz

public $dba;

zamiast

public $db;
goartur
Nie to nie to ...
Notice: Trying to get property of non-object in C:\xampp\htdocs\brothers.traning\profiadmin\models\login_Class.php on line 24
not
markuz
  1. <?php
  2.  
  3. class Database {
  4.  
  5. private static $db;
  6.  
  7. public static function connect() {
  8. self::$db = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
  9. }
  10.  
  11. public static function get() {
  12. return self::$db;
  13. }
  14.  
  15. }
  16.  
  17. class Model {
  18.  
  19. private $db;
  20.  
  21. public function __construct() {
  22. if(!Database::$db)
  23. Database::connect();
  24.  
  25. $this->db = Database::get();
  26. }
  27.  
  28. }
  29.  
  30. class UserAccessModel extends Model {
  31.  
  32. public function login($username, $password) {
  33. $password = sha1($password);
  34. $results = $this->db->query(
  35. "SELECT * FROM admins WHERE username = ? AND password = ?",
  36. array($username, $password)
  37. );
  38.  
  39. return $result->num_rows > 0;
  40. }
  41.  
  42. }
  43.  
  44. $userAccess = new UserAccessModel();
  45. if($userAccess->login('artur', 'ol'))
  46. // logowanie
  47. else
  48. // błąd logowania
  49.  
  50. ?>
goartur
Cytat(markuz @ 27.06.2015, 12:12:30 ) *
  1. <?php
  2.  
  3. class Database {
  4.  
  5. private static $db;
  6.  
  7. public static function connect() {
  8. self::$db = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
  9. }
  10.  
  11. public static function get() {
  12. return self::$db;
  13. }
  14.  
  15. }
  16.  
  17. class Model {
  18.  
  19. private $db;
  20.  
  21. public function __construct() {
  22. if(!Database::$db)
  23. Database::connect();
  24.  
  25. $this->db = Database::get();
  26. }
  27.  
  28. }
  29.  
  30. class UserAccessModel extends Model {
  31.  
  32. public function login($username, $password) {
  33. $password = sha1($password);
  34. $results = $this->db->query(
  35. "SELECT * FROM admins WHERE username = ? AND password = ?",
  36. array($username, $password)
  37. );
  38.  
  39. return $result->num_rows > 0;
  40. }
  41.  
  42. }
  43.  
  44. $userAccess = new UserAccessModel();
  45. if($userAccess->login('artur', 'ol'))
  46. // logowanie
  47. else
  48. // błąd logowania
  49.  
  50. ?>


Dzieki za odpowiedz dostaje taki blad:

Fatal error: Cannot access private property Database::$db in C:\xampp\htdocs\brothers.traning\profiadmin\login_Class.php on line 27
markuz
Ok. Błąd dotyczy tego fragmentu kodu:

  1. public function __construct() {
  2. if(!Database::$db)
  3. Database::connect();
  4.  
  5. $this->db = Database::get();
  6. }


Database::$db jest prywatne. W jaki sposób się do niego dostać? Oto zagadka dla Ciebie wink.gif Rozwiązanie znajduje się w tym samym fragmencie kodu.
goartur
Cytat(markuz @ 27.06.2015, 12:35:06 ) *
Ok. Błąd dotyczy tego fragmentu kodu:

  1. public function __construct() {
  2. if(!Database::$db)
  3. Database::connect();
  4.  
  5. $this->db = Database::get();
  6. }


Database::$db jest prywatne. W jaki sposób się do niego dostać? Oto zagadka dla Ciebie wink.gif Rozwiązanie znajduje się w tym samym fragmencie kodu.

Musze zmienc private $db na public smile.gif?, jesli tak to dostaje taki blad:

  1. Warning: mysqli::query() expects parameter 2 to be long, array given in C:\xampp\htdocs\brothers.traning\profiadmin\login_Class.php on line 44
  2.  
  3. Notice: Undefined variable: result in C:\xampp\htdocs\brothers.traning\profiadmin\login_Class.php on line 46
  4.  
  5. Notice: Trying to get property of non-object in C:\xampp\htdocs\brothers.traning\profiadmin\login_Class.php on line 46
markuz
Ogólnie powinieneś przenieść cały ten fragment w construct() do metody get w Database ale nieważne.. Możesz ustawić na public.

Co do drugiego błędu to pomyliłem mysqli z PDO. Zmień wykonywanie zapytania na :
  1. $results = $this->db->query("SELECT * FROM admins WHERE username = '$username' AND password = '$password'");
goartur
Cytat(markuz @ 27.06.2015, 12:45:28 ) *
Ogólnie powinieneś przenieść cały ten fragment w construct() do metody get w Database ale nieważne.. Możesz ustawić na public.

Co do drugiego błędu to pomyliłem mysqli z PDO. Zmień wykonywanie zapytania na :
  1. $results = $this->db->query("SELECT * FROM admins WHERE username = '$username' AND password = '$password'");



Nadal ten sam blad:

  1. Notice: Undefined variable: result in C:\xampp\htdocs\brothers.traning\profiadmin\login_Class.php on line 43
  2.  
  3. Notice: Trying to get property of non-object in C:\xampp\htdocs\brothers.traning\profiadmin\login_Class.php on line 43
markuz
Tym razem wkradła się literówka (results, result). Usiądź nad kodem trochę samemu i spróbuj znaleźć błąd inaczej będzie Ci ciężko cokolwiek napisać..
goartur
Cytat(markuz @ 27.06.2015, 13:10:27 ) *
Tym razem wkradła się literówka (results, result). Usiądź nad kodem trochę samemu i spróbuj znaleźć błąd inaczej będzie Ci ciężko cokolwiek napisać..



Wiem widze zauwazylem to,

  1. Notice: Trying to get property of non-object in C:\xampp\htdocs\brothers.traning\profiadmin\login_Class.php on line 43

Zawsze mam ten sam problem i nikt mi nie moze powiedziec o co w tym chodz ...
viking
Dostałeś odpowiedź a i kod błędu wszystko mówi. Aby ->metoda() zadziałała zmienna musi być klasą. var_dump($zmienna) i zobaczysz gdzie jest błąd. Będzie tam pewnie null. Private ma zasięg tylko w Model, zmień na protected.
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.