0

我有一个这样的控制器:

$r_result = $this->storedprocedure->user_email_exist($in_email);

if($r_result->num_rows() == 1)
{
    foreach ($r_result->result() as $row)
    {
       $salt = $row->salt;
       $hash = $row->hash_password;
       if(strcasecmp(Application_Helper::hash_password($aData['password'], $salt), 
          $hash)==0)
       {
           //Login success
           echo('login success');

           $newdata = array('user_id'  => $row->id);
           $this->session->set_userdata($newdata);
       }
    }
}

在 Storedprocedure 模型中,是这样的:

public function user_email_exist($aEmail)
{   
    $r_result = $this->db->query("CALL user_email_exist('".$aEmail."')");

    return $r_result;
}

我测试了一下,可以登录成功,但是打印错误:

发生数据库错误

错误编号:2014

命令不同步;你现在不能运行这个命令

更新ci_sessionslast_activity= 1358764263, user_data= 'a:2:{s:9:\"user_data\";s:0:\"\";s:7:\"user_id\";s:2:\"35\" ;}' WHERE session_id= '05e340b2aa6bd9b21261ed0d20354b3c'

文件名:库/Session.php

行号:289

问题是,我必须使用MySQL procedure模型层来实现,但似乎ci_session之间有一些冲突。有针对该问题的推荐解决方案吗?谢谢。

4

1 回答 1

0

这个错误是由于 mySQL 存储过程返回 MULTI RESULTS 导致的,即使它们中只有一个 select 语句。解决方案是简单地调用 $r_result->next_result() 来释放预期的无关结果集。

我从这个链接得到了这个想法。

请更换控制器代码,如下所示:

$r_result = $this->storedprocedure->user_email_exist($in_email);

if($r_result->num_rows() == 1)
{
    $row = $r_result->row_array();
    $r_result->next_result(); // Dump the extra resultset.
    $r_result->free_result(); // Does what it says.

    $salt = $row->salt;
    $hash = $row->hash_password;
    if(
      strcasecmp(Application_Helper::hash_password($aData['password'], $salt),$hash)==0
    ) {
       //Login success
       echo('login success');

       $newdata = array('user_id'  => $row->id);
       $this->session->set_userdata($newdata);
    }

}
于 2013-01-21T15:11:29.850 回答