php - 类中的 PHP PDO 注入
问题描述
我试图了解如何PDO
在课堂上使用。我写了这个简单的类,它持有一个作为另一个类内部PDO
的一部分传递的连接。__construct()
问题是每次我尝试使用需要数据库连接的类的方法时,我都会收到一条与PDO
's 内置函数相关的错误消息,例如prepare()
,execute()
。错误是PHP Fatal error: Uncaught Error: Call to undefined method Database::prepare()
。我该如何解决这个问题?我已经阅读了有关依赖注入的信息,但现在在使用时如何将这种模式应用于代码有点令人困惑PDO
<?php
class Database {
public function __construct() {
return $this->db = new PDO("mysql:host=localhost;dbname=testdb;", "root", "root");
}
}
class user {
public function __construct($db) {
$this->db = $db;
}
public function createUser($email, $username, $password) {
$stmt = $this->db->prepare("INSERT INTO users (email,username,password) VALUES (?, ?, ? )");
if ($stmt->execute(array($email, $username, $password))) {
echo "Account successful created";
} else {
echo "Something was wrong during the registration process.";
}
}
public function loginUser($username, $password) {
$stmt = $this->db->prepare("SELECT email,username,password FROM users WHERE email = ? OR username = ?");
$stmt->execute(array($username, $username));
if ($stmt->rowCount() > 0) {
$result = $stmt->fetch(PDO::FETCH_OBJ);
if (password_verify($password, $result->password)) {
echo "logged";
} else {
echo "wrong password";
}
} else {
echo "Username or email does not exist in the database.";
}
}
}
解决方案
如果要将连接封装PDO
在一个额外的类中,则应该为实际连接创建一个 getter
<?php
class Database {
private $dbh = null;
public function __construct($user, $pass, $database) {
$this->dbh = new PDO("mysql:host=localhost;dbname=".$database.";", $user, $pass);
}
public function getConnection() {
return $this->dbh;
}
}
class User {
private $db = null;
public function __construct($db) {
$this->db = $db;
}
public function createUser($email, $username, $password) {
$stmt = $this->db->getConnection()->prepare("INSERT INTO users (email,username,password) VALUES (?, ?, ? )");
if ($stmt->execute(array($email, $username, $password))) {
echo "Account successful created";
}else {
echo "Something was wrong during the registration process.";
}
}
}
}
$user = new User(new Database('root', 'root', 'testdb'));
从评论:
对于您的情况,最好将一个实例传递PDO
给您的类。这应该有效:
<?php
class user {
public function __construct(\PDO $db) {
$this->db = $db;
}
}
<?php
/** Init the one and only DB connection for this request **/
$dbh = new PDO("mysql:host=localhost;dbname=".$database.";", $user, $pass);
//... Do some stuff
//....
$user = new User($dbh);
推荐阅读
- google-apps-script - onFormSubmit 触发器大约每隔几周随机发生两次
- excel - 使代号和索引一致
- javascript - date.getTime 不是 extJS 日期字段列的功能
- microsoft-graph-api - 请求 Microsoft Graph 委派权限时,没有为 AD B2C 用户返回访问令牌
- c++ - 如何在我的自定义虚幻引擎模块中#include 插件源文件?
- python - 反正有在 GPU 上运行 TensorFlow 代码吗?
- ada - Ada 有标准的堆栈实现吗?
- amazon-web-services - 我应该如何修改 AWS DynamoDB Query 通过 AWS API Gateway 返回给我的响应?
- r - 根据其他表替换数据框中的列名
- javascript - 如何选择 iframe 并将其 src 传递给函数