2017-02-17 5 views
2

model.phpОбновление запроса не работает в codeigniter?

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(). Я скопировал и вставил это непосредственно в Workbench MySQL, и изменения вступили в силу.

Я пробовал Активные записи безрезультатно.

ответ

0

Это как-то связано с $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; 

Затем после $this->db->trans_complete();:

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

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

Такая честная ошибка.