带字符串的zend select语句

时间:2012-02-27 23:42:02

标签: php sql string zend-framework select

我花了2个小时才选择一个陈述。

我做错了什么?

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 个答案:

答案 0 :(得分:2)

从技术上讲,语法应该可行,但我建议稍微更改一下,以确保您的数据被正确转义。当您收到错误时,您对$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