2015-01-20 93 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

相關問題