【问题标题】:Active Records - Affected Rows always returning 1Active Records - 受影响的行总是返回 1
【发布时间】:2013-06-06 19:45:52
【问题描述】:

我正在尝试使用活动记录更改密码代码。这很好,但我需要知道密码是成功更改还是当前密码实际上是错误的。

我正在使用受影响的行来查看有多少记录受到影响。该值应该是 1 或 0,1 表示密码已成功更改,0 表示未更改(即输入的当前密码错误)。受影响的行将永远不会返回超过 1,因为用户名是唯一的。所以它应该按照我接近它的方式工作。 但它似乎不起作用,因为受影响的 rows 函数总是返回 1。

这里是代码 控制器:

function changepass() {
    $this->form_validation->set_rules('pass', 'Password', 'required|matches[passconf]|min_length[6]|max_length[12]');
    $this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
    if ($this->form_validation->run() == false) {
        //if not valid
        $this->session->set_flashdata('message', validation_errors());
        redirect('profile');
    } else {
        //if valid
        $current = $this->input->post('current');
        $change = $this->input->post('pass');
        $id = $this->input->post('id');
        $flag = $this->profile_model->update_pass($current, $change, $id);
        if ($flag = true) {// If Successful
            $this->session->set_flashdata('message', $flag);
        } else { // If Unsuccessful
            $this->session->set_flashdata('message', 'Current Password is not valid');
        }
        redirect('profile');
    }
}

型号:

function update_pass($current,$change,$id) {
  $data = array('pass'=>$change);
  $this->db->where('id',$id);
  $this->db->where('pass',$current);
  $this->db->update('users',$data);
  return ($this->db->affected_rows());
}

【问题讨论】:

  • 这没有意义,“.. 正在尝试使用受影响的行来查看受影响的行数是否大于 1,然后成功,否则失败。”应该只有一行会受到影响。
  • 我的意思是,如果受影响的行返回的值大于 0 - 这意味着行已受到影响。受影响的行不能超过 1,因为用户名是唯一的。因此受影响的行的值将是 0 或 1。如果受影响的行返回 0,则用户名和密码不匹配,因此失败。如果受影响的行返回 1,则密码已成功更改。但受影响的行总是返回 1,即使密码更改不成功。
  • The 3 different equals的可能重复

标签: php codeigniter codeigniter-2 rows-affected


【解决方案1】:

像这样改变你的模型

function update_pass($current, $change, $id) {
    $data = array('pass' => $change);
    $this->db->where('id', $id);
    $this->db->where('pass', $current);
    $this->db->update('users', $data);
    if ($this->db->affected_rows() > 0) {
        return true;
    } else {
        return false;
    }
}

并通过添加 '==' 而不是 '=' 来更改您的控制器 if 语句

if($flag == TRUE)// If Successful
{
    $this->session->set_flashdata('message', $flag);
}

【讨论】:

    【解决方案2】:

    试试这个代码

    function update_pass($current,$change,$id){
     $data = array('pass'=>$change);
     $this->db->where('id',$id);
     $this->db->where('pass',$current);
     $this->db->update('users',$data);
     $query = $this->db->affected_rows();
     if($query > 0){
        return true;
     }else{
        return false;
     }
    }
    

    【讨论】:

    • 这个建议是由 IshaS 两年半前提供的(并没有解决问题)。此外,仅代码答案在 Stackoverflow 上的价值很低,因为它们对教育/授权成千上万的未来研究人员几乎没有作用。
    【解决方案3】:
    function update_pass($current, $change, $id)
    {
      $data = array('pass'=>$change);
      $this->db->where('id',$id);
      $this->db->where('pass',$current);
      $this->db->update('users',$data);
    
      //comment the return
      //return ($this->db->affected_rows());
    
      // echo formatted last query
      echo '<pre>';
      echo $this->db->last_query();
      echo '</pre>';
      die();
     }
    

    您确定提供了正确的变量来进行更新吗?在您的模型上尝试此操作,然后在您的 phpmyadmin 上进行测试,或者打开 profiler 以查看正在运行的查询以及正在传递的参数。

    或者你可以试试

    var_dump($this->db->affected_rows());
    

    看看它返回了什么。

    【讨论】:

    • UPDATE users SET pass = '123456' WHERE id = '1' AND pass = 'qqq' 对于 ID 为 1 的当前登录用户,当前通行证输入 qqq 和新通行证 123456 这个东西适用于更改通行证。但是我无法区分通过更改和不更改的情况
    • 您的pass 是否经过哈希处理?或者只是纯文本
    • 纯文本。我只是在尝试不先对其进行散列以查看一切正常。当一切正常时,我将更改为通过加密,现在就像这样只是为了查看数据库中的值是否更改成功。
    • 我发现了问题。 If 条件是这样的 - if($flag = TRUE) 这应该是 if($flag == TRUE) 而不是评估它分配给标志的标志。小而不明显但巨大的错误-_-
    【解决方案4】:

    可能是由于查询缓存造成的。为此特定查询打开查询缓存并尝试。

    // Turn caching off for this one query 
      $this->db->cache_off();
      $data = array('pass'=>$change);
      $this->db->where('id',$id);
      $this->db->where('pass',$current);
      $this->db->update('users',$data);
      return ($this->db->affected_rows());
    

    【讨论】:

    • 好吧,当我转到配置文件夹中的 database.php 时。已经是这个 $db['default']['cache_on'] = FALSE;我将其更改为 TRUE 以查看是否发生任何事情。没有任何改变
    • 开启分析器:$this->output->enable_profiler(TRUE);并复制查询并在 phpmyadmin 中运行
    • 好吧,我检查了活动记录是否产生了正确的查询。使用控制器上的分析器我得到查询 -:SELECT id,user,first_name,last_name,gender,type,dob,email FROM users WHERE id =1
    • 上述查询被模型的另一个函数使用,该函数获取当前登录用户的数据。不要以为脚本的动作是针对这个函数的,因为它不是。当前密码正确时数据库中的密码发生变化,当前密码错误但数据库内部密码不变时显示相同的内容。因此,Active Records 生成的查询是正确的,并且提交按钮指向正确的函数
    • 我发现了问题。 If 条件是这样的 - if($flag = TRUE) 这应该是 if($flag == TRUE) 而不是评估它分配给标志的标志。小而不明显但巨大的错误-_-
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 2016-09-24
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多