【问题标题】:Fatal error: Call to undefined method dbconnection::prepare()致命错误:调用未定义的方法 dbconnection::prepare()
【发布时间】:2015-01-20 20:46:16
【问题描述】:

我正在学习 php :) 首先,对不起我的英语不好,我试着正常说话:)

我总是开始用数据库编写一些代码,但总是遇到扩展问题。请帮帮我。

index.php

define('CWM', TRUE);
define('DS', DIRECTORY_SEPARATOR);
define('PATH', dirname(__FILE__) . DS);
define('LINK', dirname($_SERVER['SCRIPT_NAME']));

require_once 'classes' . DS . 'database.php';
require_once 'classes' . DS . 'session.php';
require_once 'classes' . DS . 'core.php';
$core = new core;

core.php 必须包含 session 和 dbconnection 类

if(!defined('CWM')) die('script access error');
class core extends session{
    protected $db;

    function __construct(){
        $this->db = new dbconnection();
        parent::session();
    }
}

我尝试连接数据库的database.php类

class dbconnection{
protected $db;
protected $dbinfo = array();

public function connect(){
        if(file_exists(PATH . 'classes' . DS . 'config.php')){
            $this->dbinfo = require_once PATH . 'classes' . DS . 'config.php';

            try{
                $this->db = new PDO('mysql:host=' . $this->dbinfo['hostname'] . ';dbname='. $this->dbinfo['dbname'], $this->dbinfo['username'], $this->dbinfo['password'], array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC));
                return $this->db;
            }catch(PDOException $e){
                die($e->getMessage());
            }
        }else{
            trigger_error('undefined config.php', E_USER_ERROR);
        }
    }

    function __destruct(){
        $this->db = NULL;
    }
}

session.php 如果用户有会话 cookie,则此类 tri 从我的 bd 中选择信息

if(!defined('CWM')) die('script access error');
class session extends dbconnection{
    protected $db;
    protected $member = array();

    function __construct(){
        parent::connect();
        $this->session;
    }

    protected function session(){
        $_COOKIE['session'] = 5;
        if(!empty($_COOKIE['session'])){
            $this->member = $this->db->prepare("SELECT * FROM `users` WHERE `session` = '?'")->execute(array($_COOKIE['session']));
            var_dump($this->member);
        }else{
            $this->member = false;
        }
    }
}

如果可能的话,我需要核心类包括会话和数据库类,而会话类包括数据库和核心类

【问题讨论】:

  • class Session extends DbConnection 表示违反里氏替换原则和单一责任原则。它还打破了关注点分离。如果你关心代码质量和可维护性,你应该在谷歌上搜索这些东西

标签: php mysql oop pdo


【解决方案1】:

您收到此错误是因为您在 session::db 变量上调用 prepare(),此变量的类型为 dbconnection,因此不包含 prepare() 方法,您需要将您的代码更改为:

if(!defined('CWM')) die('script access error');
class session extends dbconnection{
    protected $db;
    protected $member = array();

    function __construct(){
        parent::connect();
        $this->session;
    }

    protected function session(){
        $_COOKIE['session'] = 5;
        if(!empty($_COOKIE['session'])){
            $this->member = $this->db->db->prepare("SELECT * FROM `users` WHERE `session` = '?'")->execute(array($_COOKIE['session']));
            var_dump($this->member);
        }else{
            $this->member = false;
        }
    }
}

(我添加了第二个 ->db 以引用 PDO 类型的 dbconnection::db 变量 可能值得重新考虑类的结构,因为正如您所发现的,当前的结构很容易导致混乱。

以下是这些类的建议结构:

Core.php

if(!defined('CWM')) die('script access error');
class Core extends Session {

    function __construct(){
        parent::__construct();
        $this->session();
    }
}

DbConnection.php

class DbConnection{
    protected $db;
    protected $dbinfo = array();

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

    public function connect(){
        if(file_exists(PATH . 'classes' . DS . 'config.php')){
            $this->dbinfo = require_once PATH . 'classes' . DS . 'config.php';

            try{
                $this->db = new PDO('mysql:host=' . $this->dbinfo['hostname'] . ';dbname='. $this->dbinfo['dbname'], $this->dbinfo['username'], $this->dbinfo['password'], array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC));
                return $this->db;
            }catch(PDOException $e){
               die($e->getMessage());
           }
        }else{
            trigger_error('undefined config.php', E_USER_ERROR);
        }
    }

    function __destruct(){
        $this->db = NULL;
    }
}

Session.php

if(!defined('CWM')) die('script access error');
class Session extends DbConnection {

    protected $member = array();

    function __construct(){
        parent::__construct();
    }

    protected function session(){
        $_COOKIE['session'] = 5;
        if(!empty($_COOKIE['session'])){
            $this->member = $this->db->prepare("SELECT * FROM `users` WHERE `session` = '?'")->execute(array($_COOKIE['session']));
            var_dump($this->member);
        }else{
            $this->member = false;
        }
    }
}

主要变化 - 到处移除 $db 变量 -大写的类名 - 将设置任务,例如 DbConnection::connect() 移至构造函数

【讨论】:

  • 你现在遇到什么错误,是同一个吗?
  • 是的,但我找到了答案,我需要一个 $this->db = parent::connect();不仅是父::connect();我怎样才能结束这个问题?
  • 是的,我重新阅读了您的代码,我明白了为什么我的修复不起作用。如果你发现事情变得混乱,仍然值得考虑重组事情。问题下应该有一个紧密的链接。
猜你喜欢
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
  • 1970-01-01
  • 2020-02-23
  • 2015-01-28
  • 2015-05-13
相关资源
最近更新 更多