php - 将 PDO 对象传递到类中 - PHP fatal error : Call to a member function execute() on a non-object

标签 php mysql oop pdo

我正在重构一个(过程性的)PHP 库,我将一段时间写回一个轻量级 OOP 框架。我正试图传递一个要在类中使用的 PDO 对象。这是我到目前为止所得到的。

Config.php

<?php

class Config {
    // Database Variables
    private $db_type;
    private $db_host;
    private $db_user;
    private $db_pass;
    private $db_name;
    private $db_path; // for sqlite database path
    private $db_char; // charset

    // Site Variables
    private $s_protocol;
    private $s_subdomain;
    private $s_domain;
    private $s_tld;
    private $s_dir;
    private $s_name;
    private $s_description;
    private $s_path;
    private $s_visibility;
    private $s_pipe;
    private $s_apps;
    private $s_hooks;
    private $s_blocks;
    private $s_assets;

    // User Default
    private $u_groupid;

    public function __construct($config) {
        $this->set($config);
    }

    public function set($config) {
        if (!empty($config) && is_array($config)) {
            foreach ($config as $k => $v) {
                if (property_exists(get_class($this), $k)) {
                    $this->$k = $v;
                }
            }
            return true;
        }
        else { return false; }
    }

    public function get($config) {
        if (!empty($config)) {
            return $this->$config;
        }
    }

    public function domain() {
        return $this->get('s_protocol') .'://'. $this->get('s_domain') . $this->get('s_tld') .'/'. $this->get('s_dir');
    }
}
?>

数据库.php

<?php

class Database extends PDO {
    private $config;

    public function __construct($config) {
        $this->config = $config;
        switch($this->config->get('db_type')) {
            case 'mysql':
            case 'pgsql':
                try {
                    return new PDO(
                                $this->config->get('db_type') .':dbname='. $this->config->get('db_name') .';host='. $this->config->get('db_host'),
                                $this->config->get('db_user'),
                                $this->config->get('db_pass')
                    );
                }
                catch(PDOException $e) {
                    die($e->getMessage());
                }
                break;
            case 'sqlite':
                try {
                    return new PDO($this->config->get('db_type') .':'. $this->config->get('db_path'));
                }
                catch(PDOException $e) {
                    die($e->getMessage());
                }
                break;
            case 'firebird':
                try {
                    return new PDO(
                                $this->config->get('db_type') .':dbname='. $this->config->get('db_host') .':'. $this->config->get('db_path'),
                                $this->config->get('db_user'),
                                $this->config->get('db_pass')
                    );
                }
                catch(PDOException $e) {
                    die($e->getMessage());
                }
                break;
            case 'informix':
                try {
                    return new PDO(
                                $this->config->get('db_type') .':DSN='. $this->config->get('db_name'),
                                $this->config->get('db_user'),
                                $this->config->get('db_pass')
                    );
                }
                catch(PDOException $e) {
                    die($e->getMessage());
                }
                break;
            case 'oracle':
                try {
                    return new PDO(
                                'OCI:dbname='. $this->config->get('db_name') .';charset='. $this->config->get('db_char'),
                                $this->config->get('db_user'),
                                $this->config->get('db_pass')
                    );
                }
                catch(PDOException $e) {
                    die($e->getMessage());
                }
                break;
        }
    }


}
?>

Auth.php

<?php

class Auth {
    // Set Database object
    protected $db;

    // User fields in users table
    private $id;
    private $email;
    private $password;
    private $firstname;
    private $lastname;
    private $displayname;
    private $groupid;
    private $ip;
    private $created;
    private $updated;
    private $cookie;
    private $sessionid;
    private $lastlogin;
    private $token;
    private $active;

    public function __construct($dbh) {
        $this->db = $dbh;
    }

    public function add($params) {
        $sql = '
            INSERT INTO
                `users` (
        ';
        $cols = array_keys($params);
        $col_string = implode(', ', $cols);
        $sql .= $col_string .'
                )
            VALUES (
        ';
        array_walk($cols, function(&$v, $k) { $v = ':'. $v; });
        $col_string = implode(', ', $cols);

        $sql .= $col_string .'
                )
        ';
        $stmt = $this->db->prepare($sql);
        $stmt->execute($params);

    }

    public function remove($params) {

    }

    public function update($params) {

    }

    public function get($params) {

    }

    protected function set($params) {
        if (!empty($params) && is_array($params)) {
            foreach ($params as $k => $v) {
                if (property_exists(get_class($this), $k)) {
                    $this->$k = $v;
                }
            }
            return true;
        }
        else { return false; }
    }
}

?>

初始化文件

<?php
session_start();
$params = array(
                'db_type' => 'mysql',
                'db_host' => '127.0.0.1',
                'db_user' => 'user',
                'db_pass' => 'password',
                'db_name' => 'database',
                'u_groupid' => 4
            );
require_once('Config.php');         $c = new Config($params);
require_once('Database.php');       $db = new Database($c);
require_once('Auth.php');           $u = new Auth($db);

$user = array(
    'email' => 'newperson@email.com',
    'password' => md5('password'),
    'firstname' => 'Jeff',
    'lastname' => 'Wilson',
    'displayname' => 'Jeff Wilson',
    'groupid' => $c->get('u_groupid'),
    'ip' => $_SERVER['REMOTE_ADDR'],
    'created' => date('Y-m-d H:i:s'),
    'sessionid' => session_id(),
    'active' => 1,
);
$u->add($user);
?>

PHP Fatal error: Call to a member function execute() on a non-object in Auth.php on line 46

这是第 46 行: $stmt->执行($params);

据我所知,我正在将 PDO 对象正确传递给 Auth 类。它不应该说它是一个非对象。其他人能看出这里出了什么问题吗?

最佳答案

数据库类中的构造函数正在返回一个值(一个 PDO 对象)。 __construct() 函数不应显式返回值。由于您的数据库类扩展了 PDO,因此改为调用父构造函数:

parent::__construct(
    $this->config->get('db_type') .':dbname='. $this->config->get('db_name') .';host='. $this->config->get('db_host'),
    $this->config->get('db_user'),
    $this->config->get('db_pass')
);

关于php - 将 PDO 对象传递到类中 - PHP fatal error : Call to a member function execute() on a non-object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33980370/

相关文章:

php - 如何拦截 PDO 调用?

php - 如何在同一个字幕中显示所有图像?

PHP静态成员继承

PHP 命名空间利用率

php - 为返回数组的函数编写 PHPUnit 测试

php - 将 session 数组存储到变量中

php - 单击按钮运行 SQL 查询

php - 验证数据库中是否存在电子邮件时遇到问题

php - jQuery 数据表 MySQL 日期到 PHP 日期

java - 在 Java 中,为什么父类(super class)方法不能从子类实例访问 protected 或私有(private)方法/变量?