gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:00:04 26 4
gpt4 key购买 nike

概览

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

代码

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");
}

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;
}

}

输出

Notice: Undefined variable: dbh in /var/www/html/foo/public_html/bar/inc/classes.php on line 80

Fatal error: Call to a member function prepare() on null in /var/www/html/foo/public_html/bar/inc/classes.php on line 80

第 80 行是:

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

问题

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

最佳答案

你必须让你的连接全局化:

global $dbh; 

因为scope .小心使用全局变量是可以的。许多人过于随意地使用它,并且倾向于将所有变量全局化。我个人是在类内部的函数中进行的,以消除歧义。

关于php - 在 "require"d 文件中包含父对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35154210/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com