2015-01-20 2 views
0

им Шипованные PHP :) В первой, извините за мой плохой английский, я стараюсь говорить нормально :)Фатальная ошибка: Вызов неопределенной метод 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 этот класс tri выбирает информацию из моего bd, если у пользователя есть файл cookie сеанса

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

если этого Возможное, мне нужно, что основной класс включает сессию и базы данных классов и класс Thes сессии включал классы базы данных и ядра

+1

класс 'Session распространяется DbConnection' ** означает нарушение ** из Лиск принципа замещения и Единой ответственности Принцип. Также он нарушает разделение проблем. Если вам небезразлично качество кода и ремонтопригодность, вы должны использовать Google для этих вещей. – Yang

ответ

0

Вы получаете эту ошибку, потому что вы звоните prepare() на переменной session::db эта переменная имеет тип 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; 
     } 
    } 
} 

Основные изменения -Удалена переменные $ DB везде -Capitalised имена класса -Moved задача настройки, например, DbConnection :: Connect() в конструкторы

+0

благодарим вас за помощь, но не работает :( – umprex

+0

Какая ошибка вы получаете сейчас, это то же самое? – Matt

+0

да, но им найти answe, им нужно $ this-> db = parent :: connect(); не только parent :: connect(), как я могу закрыть этот вопрос? – umprex

Смежные вопросы