2011-01-27 2 views
0

Я пишу класс, содержащий массив других объектов, которые он генерирует, запрашивая базу данных. Каждый экземпляр этого класса выполняет почти идентичный запрос, поэтому я решил настроить общий обработчик инструкций, и каждый класс просто привязал к нему другую переменную. Вот фрагмент кода:Реализация общей подготовленной инструкции SQL в PHP

class CQuestion 
{ 
    // this is line 16 
    static private $sthAns = SPDO::prepare(
     'SELECT * FROM answers WHERE answers.q_id = :qid' 
    ); 

    // constructor, other functions, etc. 

    private function GetAnswers() 
    { 
     self::$sthAns->bindParam(':qid', $this->m_iQID, PDO::PARAM_INT); 
     self::$sthAns->execute(); 
    } 

} 

Я знаю, что это не работает, потому что я получаю следующее сообщение об ошибке:

Анализировать ошибка: синтаксическая ошибка, неожиданный «(», ожидая «» или „;“ в C: \ XAMPP \ HTDOCS \ mbtest \ CQuestion.php на линии 16

кто-нибудь знает способ осуществить это без необходимости сброса подготовленного заявления для каждого экземпляра класса

Incase есть какой-либо путаница Я обернул PDO в моем собственном синглтоне (SPDO), который устанавливает файл ini. Вот почему я обращаюсь к подготовке через статическую ссылку.

+0

Что такое линия 16? Это похоже на обычную синтаксическую ошибку. Хотя я не уверен, что вы можете получить доступ к заявлению статически, чтобы это могло быть другой проблемой. – Cfreak

+0

Извините, что забыл про это. Я добавил примечание о строке 16. Я уверен, что строка 16 является синтаксической ошибкой, поэтому мой вопрос: как мне это сделать? – Krustal

ответ

2

Вы не можете вызвать метод при создании свойства объекта/класса. Для этого вам потребуется использовать конструктор/инициализатор. Попробуйте что-то вроде этого:

class CQuestion 
{ 
    private static $sthAns; 

    private static function getSthAns() 
    { 
     if (!isset(self::$sthAns)) self::$sthAns = SPDO::prepare(
      'SELECT * FROM answers WHERE answers.q_id = :qid' 
     ); 
     return self::$sthAns; 
    } 

    private function GetAnswers() 
    { 
     self::getSthAns()->bindParam(':qid', $this->m_iQID, PDO::PARAM_INT); 
     self::getSthAns()->execute(); 
    } 
} 
+0

Большое спасибо, чувствуя себя немного глупо, поскольку это, в некотором смысле, способ реализации класса SPDO. – Krustal

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