Реализация оператора общего подготовленного SQL в PHP - PullRequest
0 голосов
/ 28 января 2011

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

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

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

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

1 Ответ

2 голосов
/ 28 января 2011

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

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();
    }
}
...