在"require"d文件中包含父对象

Ben*_*Ben 1 php mysql pdo

概观

我连接到数据库index.php,然后classes.php使用导入我的文件require_once().但是,连接到数据库时,数据库连接未定义.

码

index.php

$dbh = new PDO("mysql:host=$hostname;dbname=$dbname",$username,$password);
require_once("inc/classes.php");

/* ..... */

if($_POST["form"]=="login"){

    //Retrieve values
    $e = $_POST["email"];
    $p = $_POST["password"];

    //Data validation
    if(!filter_var($e, FILTER_VALIDATE_EMAIL)||strlen($e)<3) $errors->addError("email", "Please enter a valid email address.");
    if(strlen($p)<1) $errors->addError("password", "Please enter a valid password");
    $errors->killErrors();

    //Log user in
    $user = new User($e);
    if(!$user->login($p)) $errors->addError("form", "Incorrect username or password.");
    $errors->killErrors();

    exit("success");
}
Run Code Online (Sandbox Code Playgroud)

inc/classes.php

class User
{
    public $id, $email, $data;

    public function __construct($e = null){

        if(isLoggedIn()){
            $stmt = $dbh->prepare("SELECT * FROM `users` WHERE `id`=? LIMIT 1");
            $stmt->execute(array($_SESSION["userid"]));
            $this->data = $stmt->fetch(PDO::FETCH_ASSOC);
        } else $this->email = $e;

    }

    public function login($p){
        //Perform database query for user
        $stmt = $dbh->prepare("SELECT `id`, `password` FROM `users` WHERE `email`=? LIMIT 1");
        $stmt->execute(array($this->email));
        if($stmt->rowCount()<1) return false;

        //Check password is correct
        $data = $stmt->fetch(PDO::FETCH_ASSOC);
        if(!password_verify($p, $data["password"])) return false;

        if(!$this->email) exit("User can only be logged in with an email address, not by User ID");

        $this->id = $data["id"];
        return $this->validate($this->id) ? true : false;
    }

}
Run Code Online (Sandbox Code Playgroud)

产量

注意:未定义的变量:第80行的/var/www/html/foo/public_html/bar/inc/classes.php中的 dbh

致命错误:在第80行的/var/www/html/foo/public_html/bar/inc/classes.php中调用null上的成员函数prepare()

80号线是:

$stmt = $dbh->prepare("SELECT `id`, `password` FROM `users` WHERE `email`=? LIMIT 1");
Run Code Online (Sandbox Code Playgroud)

题

如何在数据库连接中包含index.php并让classes.php文件接受该PDO对象?

Jay*_*ard 5

您必须使您的连接全局:

global $dbh; 
Run Code Online (Sandbox Code Playgroud)

因为范围.仔细完成就可以使用全局变量了.许多人过于随意地使用它,并且倾向于想要将所有变量全球化.我个人在类中的函数内做它以消除歧义.