Zend Select оператор со строкой - PullRequest
0 голосов
/ 28 февраля 2012

Я потратил 2 часа только на утверждение select.

Что я делаю не так?

public function fetchSpecific($moderatorid = 1)
    {

        $resultSet = $this->getDbTable()->fetchAll("moderatorid = ".$moderatorid);

        $entries   = array();
        foreach ($resultSet as $row) {
            $entry = new Application_Model_Network();
            $entry->setId($row->id)
                  ->setName($row->name)
                  ->setModeratorId($row->moderatorid);
            $entries[] = $entry;
        }
        return $entries;
    }

Все дело в этой строке:

$resultSet = $this->getDbTable()->fetchAll("moderatorid = ".$moderatorid);

Это выдает ошибку вроде этого:

Message: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1

1 Ответ

2 голосов
/ 28 февраля 2012

Технически этот синтаксис должен работать, хотя я бы порекомендовал немного его изменить, чтобы убедиться, что ваши данные правильно экранированы. Какое значение вы видите для $moderatorid, когда получаете эту ошибку? Я подозреваю, что переменная по какой-то причине генерирует синтаксическую ошибку.

Попробуйте вместо этого:

$results = $this->getDbTable()
                ->fetchAll($this->getDbTable()
                                ->getAdapter()
                                ->quoteInto('moderatorid = ?', $moderatorid));

Это обеспечит правильное экранирование $moderatorid и поможет предотвратить синтаксические ошибки, и, что еще более важно, предотвратит возможные инъекции SQL.

Другая проблема, связанная с использованием Zend_Db_Table::fetchAll(), заключается в том, что при возникновении таких ошибок трудно отладить выполняемый запрос.

Чтобы обойти это, создайте оператор SELECT самостоятельно, чтобы вы могли отобразить значение, если вам нужно отладить фактический выполняемый SQL.

$select = 
$this->getDbTable()
     ->select()
     ->from($this->getDbTable()) // optionally you can specify cols as the 2nd param
     ->where('moderatorid = ?', $moderatorid);

echo $select;  // e.g. SELECT `table`.* FROM `table` WHERE (moderatorid = 1)

$results = $this->getDbTable()->fetchAll($select);

Надеюсь, это поможет вам решить вашу проблему.

Некоторые полезные ссылки:
Zend_Db_Select
Zend_Db_Table

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...