2017-02-17 17 views
2

model.phpcodeigniterで更新クエリが機能していませんか?

public function verifyLogin($username, $entered_password, $captcha_input) { 

    $this->db->trans_start(); 

    $sql = "SELECT 
       name, 
       selector, 
       password, 
       login_attempts 
      FROM 
       company 
      WHERE 
       username = ? 
      LIMIT 
       1 
      "; 

    $query = $this->db->query($sql, $username); 
    $result_num = $query->num_rows(); 

    if ($result_num == 1) { 

     $stored_password = $query->row()->password; 
     $login_attempts = $query->row()->login_attempts; 

     if (crypt($entered_password, $stored_password) == $stored_password) { 

      if ($captcha_input == $this->session->userdata('captchaWord')) 
      { 
       //recreate captcha 
      } 
      $data['company_name']  = $query->row()->name; 
      $data['company_selector'] = $query->row()->selector; 

      //Not working 
      $sql = "UPDATE 
         company 
        SET 
         login_attempts = 0 
        WHERE 
         username = ? 
        "; 
      $query = $this->db->query($sql, $username); 
      unset($this->captcha); 

      return $data; 
     } 
     else { 

      if ($login_attempts >= 3) 
      { 
       //Enable CAPTCHA 
       $random_number = substr(number_format(time() * rand(),0,'',''),0,6); 
       $vals = array(
       'word'   => $random_number, 
       'img_path'  => './captcha/', 
       'img_url'  => base_url().'captcha/', 
       'font_path'  => './path/to/fonts/texb.ttf', 
       'img_width'  => '150', 
       'img_height' => 30, 
       'expiration' => 7200, 
       'word_length' => 8, 
       'font_size'  => 16, 
       'img_id'  => 'Imageid', 
       'pool'   => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 

       // White background and border, black text and red grid 
       'colors'  => array(
         'background' => array(255, 255, 255), 
         'border' => array(255, 255, 255), 
         'text' => array(0, 0, 0), 
         'grid' => array(255, 40, 40) 
        ) 
       ); 

       $this->captcha = create_captcha($vals); 
       $this->session->set_userdata('captchaWord', $random_number); 
      } 

      //Not working 
      $sql = "UPDATE 
         company 
        SET 
         login_attempts = login_attempts + 1 
        WHERE 
         username = ? 
        "; 
      $query = $this->db->query($sql, $username); 

      echo $this->db->last_query(); 
      return FALSE; 
     } 
    } else { 
     return 0; 
    } 

    $this->db->trans_complete(); 

    if ($this->db->trans_status() === FALSE) { 
     return 'Transaction failed'; 
    } 
} 

controller.php

public function testAdminLogin() { 
    $this->load->model('Company_model'); 

    $is_logged_in = $this->Company_model->verifyLogin('sarah', '33123', ''); 

    if ($is_logged_in === 0) { 

     echo "No username found"; 
    } 
    else if ($is_logged_in === FALSE) { 

     echo "Password not matched"; 
     $data['cap'] = $this->Company_model->getCaptcha(); 

     if (isset($data['cap'])) 
     { 
      $this->load->view('test_captcha', $data); 
     } 
    } 
    else if ($is_logged_in === 'Transaction failed') { 
     //possibly an error 
    } 
    else { 
     //successful 

     $session_array = array(
      'company_selector' => $is_logged_in['company_selector'], 
      'company_name' => $is_logged_in['company_name'] 
      ); 

     $this->session->set_userdata('session_array', $session_array); 
     echo "Login successful. Company selector: ".$this->session->userdata['session_array']['company_selector']; 
    } 
} 

私はこれを実行すると、データベース内のレコードが更新されません。 1だけインクリメントされますが、値は変わりません。 エコーされたSQL文は$this->db->last_query()から正しいです。 MySQL Workbenchに直接コピーして貼り付け、変更が有効になりました。

私はアクティブレコードを無駄にしようとしました。

答えて

0

これは$this->db->trans_complete();と関係があります。ユーザーが間違ったパスワードを入力するとすぐに値が返され、トランザクションは完了せず、変更は決してコミットされません。

間違ったパスワードを確認する代わりにフラグを設定する必要がありました。 $this->db->trans_complete();後に続いて

private $wrong_password = FALSE; 

if ($login_attempts >= 3) 
       { 
        //Enable CAPTCHA 
        $random_number = substr(number_format(time() * rand(),0,'',''),0,6); 
        $vals = array(
        'word'   => $random_number, 
        'img_path'  => './captcha/', 
        'img_url'  => base_url().'captcha/', 
        'font_path'  => './path/to/fonts/texb.ttf', 
        'img_width'  => '150', 
        'img_height' => 30, 
        'expiration' => 7200, 
        'word_length' => 8, 
        'font_size'  => 16, 
        'img_id'  => 'Imageid', 
        'pool'   => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 

        // White background and border, black text and red grid 
        'colors'  => array(
          'background' => array(255, 255, 255), 
          'border' => array(255, 255, 255), 
          'text' => array(0, 0, 0), 
          'grid' => array(255, 40, 40) 
         ) 
        ); 

        $this->captcha = create_captcha($vals); 
        $this->session->set_userdata('captchaWord', $random_number); 
       } 

       // $data = array(
       //  'login_attempts' => 'login_attempts + 1' 
       // ); 
       // $this->db->where('username', $username); 
       // $this->db->update('company', $data); 
       $sql = "UPDATE 
          company 
         SET 
          login_attempts = login_attempts + 1 
         WHERE 
          username = ? 
         "; 
       $query = $this->db->query($sql, $username); 

       $this->wrong_password = TRUE; 

if ($this->db->trans_status() === FALSE) { 
     return 'Transaction failed'; 
    } else { 

     if ($this->wrong_password === TRUE) { 
      return FALSE; 
     } 
    } 

このようなうっかりミス。

関連する問題