2015-05-22 2 views
-1

Я делаю проект с PHP OOP. Но я получаю ошибку: Неустранимая ошибка: вызов функции-члена prepare() для не-объекта в ..../PhotoSection.php в строке 12. Ниже приведен мой исходный код.PHP OOP Вызов функции-члена prepare() для не-объекта

класс DatabaseAdapter для подключения к базе данных

<?php 

class DatabaseAdapter { 

    protected $_pdo; 

    function connect() { 
     if (!$this->_pdo) { 
      try { 
       $this->_pdo = new PDO("mysql:host=localhost;dbname=xxx", "xxx", "123456"); 
       $this->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
       $this->_pdo->exec("SET CHARACTER SET utf8"); 

       $this->_pdo->exec("set character_set_client='utf8'"); 
       $this->_pdo->exec("SET character_set_results='utf8'"); 
       $this->_pdo->exec("SET collation_connection='utf8_general_ci'"); 
      } catch (PDOException $e) { 
       echo $e->getMessage(); 
       exit; 
      } 
     } 
    } 

    function disconnect() { 
     $this->_pdo = null; 
    } 

} 

класс DatabaseBusiness

require 'DatabaseAdapter.php'; 

class DatabaseBusiness extends DatabaseAdapter { 

    protected $_table = ""; 
    protected $_primaryKey = ""; 

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

    function __destruct() { 
     parent::disconnect(); 
    } 

} 

класс PhotoSection

<?php 

class PhotoSection extends DatabaseBusiness { 

    function __construct() { 
     $this->_table = "photo_section"; 
     $this->_primaryKey = "id"; 
    } 

    function selectAll() { 
     try { 
      $stmt = $this->_pdo->prepare("select * from ?"); 
      $stmt->execute(array($this->_table)); 
     } catch (PDOException $ex) { 
      echo $ex->getMessage(); 
      exit(); 
     } 

     return $stmt->fetchAll(); 
    } 

} 

теперь включают в шаблон для отображения данных

<?php 
include_once 'libraries/DatabaseBusiness.php'; 
include_once 'libraries/PhotoSection.php'; 
$photoSection = new PhotoSection(); 
$photos = $photoSection->selectAll(); 
?> 

Я прочитал дубликаты вопросов, но я объявил и инициализировал _pdo в DatabaseAdapter и расширяет его, поэтому я не знаю, почему ошибка. спасибо за любые помочь

+0

sidenote: вы не можете связывать имена таблиц – Ghost

+0

@Ghost спасибо. Это моя ошибка. Я отредактирую. – carboncrystal

+0

Добавляя "parent :: __ construct()" в класс PhotoSection в порядке – yip

ответ

0

вы должны понимать, о защищаемом ключевом слове в PHP:

мы используем защищенную сферу, когда мы хотим, чтобы ваша переменная/функция видна только во всех классах, которые расширяют текущий класс, включая его родитель класс

сделать этот protected $_pdo; до global $_pdo; в вашем файле DatabaseAdapter.

+0

Да. Я использую protected $ _pdo в DatabaseAdapter. DatabaseBusiness расширяет DatabaseAdapter и PhotoSection расширяет DatabaseBusiness. Поэтому я думаю, что PhotoSection может использовать $ _pdo, где моя ошибка? – carboncrystal

+0

Я сказал, пожалуйста, измените это на глобальное и посмотрите, решает ли это вопрос. –

+0

Я знаю, что ваше решение может решить мою проблему, но моя ошибка не вызывает функцию connect(), поэтому $ _pdo не инициализируется. во всяком случае, спасибо за помощь. – carboncrystal

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