2015-01-20 95 views
0

IM学习化的PHP :) 在第一,对不起我的英文不好,我尽量讲normaly :)致命错误:调用未定义的方法DBConnection的准备::()

我总是先从数据库编写一些代码,但所有的时间都有延伸问题。请帮帮我。

的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中必须包括会话和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,这个类从我的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; 
     } 
    } 
} 

如果更多钞票,我需要的是核心类包括会话和数据库类,并采取这些会话类包括数据库和核心类

+1

'堂课扩展DbConnection' **指违反**里氏替换原则和单一职责原理。它也打破了关注的分离。如果你关心代码的质量和可维护性,你应该谷歌为这些东西 – Yang 2015-01-21 00:35:47

回答

0

你,因为你是在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以便参考dbconnection::db变量的类型PDO 可能值得重新思考类的结构,正如您发现的那样,当前的结构很容易导致混淆。

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

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; 
     } 
    } 
} 

主业变更 -Removed $ DB变量到处 -Capitalised类名 -Moved设置任务,例如::的DbConnection连接()来构造

+0

谢谢你的帮助,但不工作:( – umprex 2015-01-20 21:06:24

+0

你现在得到什么错误,是同一个? – Matt 2015-01-20 21:06:58

+0

是的,但即时通讯找到answe,我需要一个$ this-> db = parent :: connect();不仅parent :: connect();我怎样才能关闭这个问题? – umprex 2015-01-20 21:10:50

相关问题