OOP - Mysqi Connection: Uncaught Error: вызов неопределенного метода DBConnection :: prepare () - PullRequest
0 голосов
/ 25 марта 2019

Я новичок в PHP OOP, и у меня есть проблема с моим кодом, и я продолжаю получать ошибку:

Неустранимая ошибка: Uncaught Ошибка: вызов неопределенного метода DBConnection :: prepare () в E: \ xampp \ htdocs \ includes \ user_functions.php: 35 Трассировка стека: # 0 E: \ xampp \ htdocs \ includes \ process_login.php (12): Пользователь :: логин ('admin', 'aa17a9b71574929 ... ', Object (DBConnection)) # 1 {main}, брошенный в E: \ xampp \ htdocs \ includes \ user_functions.php в строке 35

Ошибка в операторе подготовки, и я могу'Кажется, я не понимаю, что я делаю неправильно.Кажется, я не могу разобраться.Я предполагаю, что это как-то связано с объектом конструкции

. Я уже создал класс для своего соединения, который я вызываю в своем сценарии входа в систему.Как только я попал в сценарий, я вызываю функцию входа в систему.Кажется, что он принимает соединение, но проблема возникает, когда я вызываю функцию prepare ().

Вот мой сценарий входа:

<?php
  include_once ('db_connect.php'); //Here i define my connection
  include_once ('user_functions.php'); //In this file my functions

  $mysqli = new DBConnection(); //i create a new object of the connection

  User::sec_session_start(); // This is the script in my user_functions.php
  if (isset($_POST['email'], $_POST['p'])) {
      $email = $_POST['email'];
      $password = $_POST['p']; 

      if (User::login($email, $password, $mysqli) == true) {
          header('Location: ../index.php');
      } else {
          header('Location: ../error.php?error=1');
      }
  } else {
      echo 'Invalid Request';
  }

?>

Вот мой db_connect.php

<?php
  include_once ('psl-config.php');   // Da functions.php nicht included ist

  class DBConnection {

    protected $mysqli;
    protected  $db_host = HOST;
    protected  $db_username = USER;
    protected  $db_password = PASSWORD;
    protected  $db_name = DATABASE;

    public function __construct() {
        $this->mysqli= new mysqli($this->db_host, $this->db_username, $this->db_password, $this->db_name)
        or die($this->mysqli->error);

         return $this->mysqli;
    }

    //$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE); //This method worked previously, when not done with OOP
    public function real_escape_string($str) {
      return $this->mysqli->real_escape_string();
    }

     function __destruct() {
       $this->mysqli->close();
     }
  }
?>

Вот мой user_functions.php

<?php
require_once ('db_connect.php');
  class User {

    public function __construct($mysqli) {
      return $this->mysqli=$mysqli;
    }

    function login($email, $password, $mysqli) {
      if ($stmt = $mysqli->prepare("SELECT user_id, username, password, salt //This is where the error occurs
          FROM users
          WHERE email = ? OR username = ?
          LIMIT 1")) {
          $stmt->bind_param('ss', $email, $email);
          $stmt->execute();
          $stmt->store_result();
          $stmt->bind_result($user_id, $username, $db_password);
          $stmt->fetch();

          if ($db_password == $password) {
            $user_browser = $_SERVER['HTTP_USER_AGENT'];
            $user_id = preg_replace("/[^0-9]+/", "", $user_id);
            $_SESSION['user_id'] = $user_id;
            $username = preg_replace("/[^a-zA-Z0-9_\-]+/",
                                                        "",
                                                        $username);
            $_SESSION['username'] = $username;
            $_SESSION['login_string'] = hash('sha512',
                      $password . $user_browser);
            return true;
          } else {
            return false;
          }
        }
      }
    }
?>

Ответы [ 3 ]

1 голос
/ 25 марта 2019

Поскольку у вас есть DBConnection экземпляр в вашей переменной $mysqli, а не $this->mysqli из __construct() вызова.Попробуйте создать отдельный метод в вашем классе DBConnection, который возвращает $this->mysqli.Примерно так:

...
  public function __construct() {
      $this->mysqli= new mysqli($this->db_host, $this->db_username, $this->db_password, $this->db_name)
      or die($this->mysqli->error);
  }

  public function getConnection()
  {
    return $this->mysqli;
  }
...

И сделать $mysqli вот так:

$mysqli = (new DBConnection())->getConnection();
1 голос
/ 25 марта 2019

return $this->mysqli; это не работает.Посмотрите на это: https://3v4l.org/OZjEl

Вы можете добавить метод getConnection или попытаться расширить класс MySQLi.

0 голосов
/ 25 марта 2019

Попробуйте это.

  <?php
      class DBConnection{
            private $db;

            public function __construct(){
               try {
                 $this->db = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
                 echo "Connection Successful";

               }catch(PDOException $e){
                    echo $e->getMessage();
               }    
            }

           public function getConnection() {
                 if ($this->db instanceof PDO) {
                    return $this->db;
                 }
           }
      }
?>

А затем создайте экземпляр класса и получите объект conn

$db_instance = new DBConnection();
$conn = $db_instance->getConnection();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...