PHP登录注册 - 无法在类中的其他文件中访问$ conn变量

时间:2017-02-04 01:02:55

标签: php html class oop constructor

我想使用$ conn变量(在其类构造函数中的dbconfig.php中声明)来使mysqli_query方法工作(在Login类的login.php中使用)。

出于某种原因,我不断收到错误,例如"未定义的变量:conn"。

任何帮助表示欢迎,欢呼。

//login_crud.php
<?php

include_once('../classes/login.php');
$crud = new Login();

if(isset($_POST['login'])){
    $username = $_POST['username'];
    $password = $_POST['password'];

    $crud->login($username);
}

?>


//login.php
<?php
include_once('../crud/login_crud.php');
include_once('../classes/dbconfig.php');

class Login
{
    public function __construct()
    {
        $db = new dbCon();
    }

    function login($username)
    {
        $query = mysqli_query($conn, "SELECT * FROM users WHERE username='$username'");
        $check = mysqli_num_rows($query);
        if($check == 1){
            header("Location: ../home.php");
        }
        else{
            echo "Incorrect username or password";
        }
    }

}

?>


//dbconfig.php
<?php   
    define('DB_SERVER','localhost');
    define('DB_USER','root');
    define('DB_PASSWORD','');
    define('DB_NAME','tpw_db');

    class dbCon
    {
        function __construct()
        {
            $conn = mysqli_connect(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die("Connection to database failed");
        }

    }

?>

1 个答案:

答案 0 :(得分:0)

首先,我建议你阅读一些非常基本的OOP原则。您对dbCon类有一个具体的依赖性,这将使测试变得非常困难,并且几乎违反了所有SOLID原则。

在参考你的实际问题时,你不能只引用一些其他类构造函数中定义的变量(那时我们也会违反封装)。您需要将该本地方法连接变量分配给类实例变量(最好是私有),然后提供某种getter方法。

以下应该这样做:

class dbCon {

   private $conn;

   public function __construct() {
      $this->conn = mysqli_connect(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die("Connection to database failed");
   }

   public function getConn() {
      return $this->conn;
   }

}

然后你可以在Login类中调用你的连接,如下所示:

class Login {

   private $db;

   public function __construct() {
      $this->db = new dbCon();
   }

   public function login($username) {
      $query = mysqli_query($this->db->getCon(), "SELECT * FROM users WHERE username='$username'");
      $check = mysqli_num_rows($query);
      if($check == 1){
         header("Location: ../home.php");
      } else {
         echo "Incorrect username or password";
      }
   }

}

再次,我留下了一个警告,我希望这仅仅是为了学习目的,并且不会在生产中使用。