2012-12-11 158 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