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

コマンドが同期していません。現在、このコマンドを実行することはできません

UPDATE ci_sessionsSET last_activity= 1358764263、user_data='a:2:{s:9:\" user_data \ "; s:0:\" \ "; s:7:\" user_id \ "; s:2:\" 35 \ " ;}'WHERE session_id='05e340b2aa6bd9b21261ed0d20354b3c'

ファイル名:libraries / Session.php

行番号:289

問題は、を使用しMySQL procedureてモデルレイヤーを実装する必要があることですが、ci_session間で競合が発生しているようです。その問題に対する推奨される解決策はありますか?ありがとう。

4

1 に答える 1

0

このエラーは、mySQL ストアド プロシージャに select ステートメントが 1 つしかない場合でも MULTI RESULTS が返されるために発生します。解決策は、単純に $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 に答える