2012-12-11 183 views
1

當試圖做到這一點:php pdo mysql fetch返回一般錯誤?

 // make unread notifications 
     $db->sqlquery("SELECT `participant_id` FROM `user_conversations_participants` WHERE `conversation_id` = ? AND `participant_id` != ?", array($_POST['conversation_id'], $_SESSION['user_id'])); 
     while ($participants = $db->fetch()) 
     { 
      $db->sqlquery("UPDATE `user_conversations_participants` SET `unread` = 1 WHERE `participant_id` = ?", array($participants['participant_id'])); 
     } 

我似乎得到這個錯誤:

Warning: PDOStatement::fetch() [pdostatement.fetch]: SQLSTATE[HY000]: General error in /home/gamingon/public_html/prxa.info/includes/class_mysql.php on line 68

這裏是我的查詢和提取功能:

// the main sql query function 
public function sqlquery($sql, $objects = array()) 
{ 
    global $core; 

    try 
    { 
     $this->STH = $this->database->prepare($sql); 

     foreach($objects as $k=>$p) 
     { 
      // +1 is needed as arrays start at 0 where as ? placeholders start at 1 in PDO 
      if(is_numeric($p)) 
      { 
       $this->STH->bindValue($k+1, (int)$p, PDO::PARAM_INT); 
      } 
      else 
      { 
       $this->STH->bindValue($k+1, $p, PDO::PARAM_STR); 
      } 
     } 

     $this->counter++; 

     return $this->STH->execute(); 
    } 

    catch (Exception $e) 
    { 
     $core->message($e->getMessage()); 
    } 
} 

public function fetch() 
{ 
    $this->STH->setFetchMode(PDO::FETCH_ASSOC); 
    **return $this->STH->fetch();** 
} 
+0

你能突出顯示第68行嗎? – Baronth

+0

爲什麼不使用'UPDATE ... SELECT'? – Kermit

+0

我已經突出顯示像星星每邊68。 – NaughtySquid

回答

4

期間的第一次迭代循環,則會覆蓋$db實例的STH屬性。換句話說:

  1. 你做一個SELECT查詢,$db->STH是一個SELECT語句。
  2. 你可以在SELECT語句上調用fetch(),它可以工作。
  3. 第一次循環迭代:用UPDATE準備語句覆蓋$db->STH
  4. 就在第二次循環迭代之前:由於SELECT語句消失,INSERT語句就位,因此不能再執行fetch()調用。

重構您的數據庫類或創建$db的類的新實例(使用不同的變量名!)以用於循環。

+0

這就是它,所以我改變它來獲取所有,然後foreach循環:),謝謝! – NaughtySquid

+0

我希望我可以upvote這個答案10倍!我正在做一些與內部循環一樣愚蠢的事情。 :d – dotslash