首页 > 解决方案 > 类中的 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.";
        }
    }

}

标签: phppdo

解决方案


如果要将连接封装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);

推荐阅读