在代码点火器中使用MySQL过程和会话数据库会导致“2014”错误

时间:2013-01-21 10:36:39

标签: php mysql codeigniter

我有一个像这样的控制器:

$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_sessions SET last_activity = 1358764263,user_data =   'a:2:{s:9:\“user_data \”; s:0:\“\”; s:7:\“user_id \”; s:2:\“35 \”;}''在哪里   session_id ='05e340b2aa6bd9b21261ed0d20354b3c'

     

文件名:libraries / Session.php

     

行号:289

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

1 个答案:

答案 0 :(得分:0)

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

我从这个link得到了这个想法。

请更换以下控制器代码:

$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);
    }

}