我正在为测试创建一个简单的登录表单,我创建了两个类' 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?
答案 0 :(得分:1)
Connection
是一个完全没用的课程,如果你继续使用它,你可能会意外地尝试创建多个PDO
个实例。
如果在连接到您的数据库时发生异常,不继续执行您的程序,就像它有效一样。
将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);
您的数据库查询正在做一些非常奇怪的事情。如果您只是想检查是否存在匹配$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
有唯一约束,请不在您的数据库中存储纯文本密码。