2012-02-27 185 views
0

我花了2個小時只是選擇語句。zend 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 

回答

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

+0

尼斯解釋。 +1 – RockyFord 2012-02-28 04:59:30

+0

這救了我的生命.. – Proto 2012-02-28 07:51:52

+0

非常好,很高興幫助! – drew010 2012-02-28 08:06:15