如何在PHP中访问类外的变量?

时间:2017-07-10 06:25:27

标签: php

我正在为测试创建一个简单的登录表单,我创建了两个类' Connection'和'验证'分别用于连接和登录验证。但问题是我无法在Validate类中使用$ conn ie变量进行PDO连接。我听说使用全局变量是不好的做法所以请帮助我如何在课外访问变量。

conn.init.php(连接文件)

<?php

    class Connection{

    public function connect(){

        try{
        session_start();    
        $conns = new PDO('mysql:host=localhost;dbname=database;charset=utf8', 'root', '');
        }catch(PDOException $e){
            echo $e->getMessage();
        }

        return $conns;
    }
}

验证.php(登录验证):

<?php

include('conn.init.php')

class Validate extends Connection{

    private $conn;
    public $emails = null;
    public $passwords = null;

   //Here's problem
    public function __construct(Connection $conns){
        $this->conn = $conns;
    }

    public function login($email, $password){
        $query = "SELECT email, password FROM login WHERE email = :email AND password = :password";
        $query_run = $this->conn->prepare($query);
        $query_run->bindParam('email', $email);
        $query_run->bindParam('password', $password);
        $query_run->execute();
        $rows = $query_run->fetchAll(PDO::FETCH_ASSOC);

        foreach($rows as $row){
            $this->emails = $row['email'];
            $this->passwords = $row['password'];
        }

        if($email === $this->emails && $password === $this->passwords){
            $_SESSION['email'] = $email;
            return true;
        }else{
            return false;
        }
    }
}

$user = new Validate;  //What's should i do here?
$user->connect();      //What's should i do here?

就像这样! HOW TO USE APPLE VARIABLE IN OTHER CLASS?

1 个答案:

答案 0 :(得分:1)

  1. Connection是一个完全没用的课程,如果你继续使用它,你可能会意外地尝试创建多个PDO个实例。

  2. 如果在连接到您的数据库时发生异常,继续执行您的程序,就像它有效一样。

  3. PDO个实例传递到Validate课程。看来这就是你想要做的事情

    class Validate {
        private $conn;
    
        public function __construct(PDO $pdo) {
            $this->conn = $pdo;
        }
    
        // etc
    }
    
    session_start();    
    $conns = new PDO('mysql:host=localhost;dbname=database;charset=utf8', 'root', '', [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);
    $user = new Validate($conns);
    
  4. 您的数据库查询正在做一些非常奇怪的事情。如果您只是想检查是否存在匹配$email$password的记录,则更简单

    public function login($email, $password){
        $query = "SELECT 1 FROM `login` WHERE `email` = :email AND `password` = :password";
        $query_run = $this->conn->prepare($query);
        $query_run->execute([
            ':email' => $email,
            ':password' => $password
        ]);
        if ($query_run->fetchColumn()) {
            $_SESSION['email'] = $email;
            return true;
        }
        return false;
    }
    

    如果您还没有,请确保email有唯一约束,请在您的数据库中存储纯文本密码。