-1

我刚开始学习面向对象的 PHP 并遇到了一个小问题。一位同事告诉我,最好使用依赖注入,而不是继承数据库类。我想使用依赖注入,但我不知道如何。我尝试在构造函数中使用,但弹出错误:

致命错误::Uncaught TypeError传递给的参数 1signIn::__construct()必须是数据库实例,给定数组,C:\xampp\htdocs\messbox\index.php在第 54 行调用并在 C:\xampp\htdocs\messbox\klasy\sign_in.php:12
堆栈跟踪中定义:
#0 C:\xampp\htdocs\messbox\index.php(54)signIn->__construct(Array)
#1在第 12 行{main}抛出C:\xampp\htdocs\messbox\klasy\sign_in.php

我希望有人向我解释如何正确使用它。

<?php

class database {
  private $servername = "localhost";
  private $username = "root";
  private $password = "";
  private $dbname = "messbox";

  public function connect() {
    $this->servername = "localhost";
    $this->username = "root";
    $this->password = "";
    $this->dbname = "messbox";
    try {
      $dsn = "mysql:host=" . $this->servername . ";dbname=" . $this->dbname;
      $pdo = new PDO($dsn, $this->username, $this->password);
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      return $pdo;
    } catch (PDOException $e) {
      echo "Connection failed: " . $e->getMessage();
    }  
  }
}
?>
require_once('connect.php');
class signIn {
  private $data;
  private $errors = '';
  private $count;
  private $database;
  
  public function __construct(database $database) {
    $this->database = $database;
  }
  
  public function validate_login() {
    $val = trim($this->data['log']);
    if (empty($val)) {
        return $this->errors = "Field can not empty!";
    }
  }
  
  public function validate_password() {
    $val = trim($this->data['pass']);
    if (empty($val)) {
      return $this->errors = "Field can not empty!";
    }
  }
  
  public function ifexist() {
    $field1 = $this->data['log'];
    $field2 = $this->data['pass'];
    $sql = $this->connect()->prepare("SELECT * FROM users where login = :login");
    $sql->bindParam(':login', $field1, PDO::PARAM_STR);
    $sql->execute();        
    if ($sql->rowCount()) {
      header("location:./home.php");
      return $this->count = 10;
    } else {
      return $this->count = 2;
    }
  }
  
  public function setSession() {
    if ($this->licznik == 10) {
      $field1 = $this->data['log'];
      $sql = $this->connect()->prepare("SELECT * FROM users where login = :login");
      $sql->bindParam(':login', $field1, PDO::PARAM_STR);
      $sql->execute();      
      while ($row = $sql->fetch()) {
        $_SESSION['id'] = $row['id'];
        echo $_SESSION['login'] = $row['login'];
        $_SESSION['avatar'] = $row['avatar'];
        echo "<img src='".$row['avatar']."'/>";
        $_SESSION['email'] = $row['email'];
        $_SESSION['first_name'] = $row['first_name'];
        $_SESSION['last_name'] = $row['last_name'];
        $_SESSION['number_phone'] = $row['number_phone'];
        $_SESSION['gender'] = $row['gender'];
        $_SESSION['birth_date']  = $row['birth_date'];
        $_SESSION['age'] = $row['age'];     
      }
    } else
      return "Not working";
    }
  }
}
?>
4

1 回答 1

1

您已将数据库类注入到您的登录类中。

require_once('connect.php');
public function __construct(database $database) {
  $this->database = $database;
}

但是错误是由于以下代码引起的。

$sql = $this->connect()->prepare("SELECT * FROM users where login = :login");   

您应该指的是连接功能$this->database

$sql = $this->database->connect()->prepare("SELECT * FROM users where login = :login");   
于 2021-02-06T20:24:06.597 回答