更新后的查询执行受影响的行在mysql中返回0

时间:2015-06-25 06:18:53

标签: php mysql mysqli

我正在尝试从MySQL表中连续更新单列。执行UPDATE查询后,MySQL表中发生了UPDATE。但$stmt->affected_rows正在返回0。为什么它会返回零?

function updateSignUp($status,$recordId){
            $prepareStmt='UPDATE <DBNAME>.<TABLENAME> SET status=? WHERE id=?;';
            $mysqli=$this->connectDB(<DBNAME>);#connectDB user written function
            if ($stmt=$mysqli->prepare($prepareStmt)){
                $stmt->bind_param('ii', $status, $recordId);
                if (!$stmt->execute()) {
                    $stmt->close();
                    $mysqli->close();
                    return $this->errormsg('FAILURE!','Staff SignUp cannot Perform at this moment.');#errormsg user written function
                }elseif($stmt->affected_rows>0){
                    $stmt->close();
                    $mysqli->close();
                    return $this->errormsg('SUCCESS!','Staff SignUp Done.',2);
                }else{
                    $stmt->close();
                    $mysqli->close();
                    return $this->errormsg('WARNING!','Staff SignUp Not Done.',4);
                }
            }else{ return $this->errormsg('PREPARE FAILED:','(' . $mysqli->errno . ') ' . $mysqli->error); }
        }

        echo updateSignUp(0,15);
  

结果显示:警告!工作人员注册不完成。

     

期待结果:成功!工作人员注册完成。

注意:

  • PHP Version 5.5.12
  • MySQL 5.6.17
  • Apache 2.4.9
  • WAMPSERVER 2.5

实际表格如下:

+------------------------+---------------+------+-----+-------------------+-----------------------------+
|         Field          |     Type      | Null | Key |      Default      |            Extra            |
+------------------------+---------------+------+-----+-------------------+-----------------------------+
| id                     | int(11)       | NO   | PRI | NULL              | auto_increment              |
| ldapusername           | varchar(30)   | YES  |     | NULL              |                             |
| email                  | varchar(50)   | NO   |     | NULL              |                             |
| firstname              | varchar(20)   | YES  |     | NULL              |                             |
| lastname               | varchar(20)   | YES  |     | NULL              |                             |
| designation            | varchar(30)   | YES  |     | NULL              |                             |
| username               | varchar(30)   | NO   |     | NULL              |                             |
| role                   | int(5)        | NO   |     | NULL              |                             |
| manager                | int(11)       | NO   |     | NULL              |                             |
| currency               | int(11)       | NO   |     | NULL              |                             |
| country                | int(11)       | YES  |     | NULL              |                             |
| payee_id               | varchar(50)   | YES  |     | NULL              |                             |
| bank_acc_no            | varchar(30)   | YES  |     | NULL              |                             |
| bank_name              | varchar(50)   | YES  |     | NULL              |                             |
| bank_branch            | varchar(50)   | YES  |     | NULL              |                             |
| bank_swift_code        | varchar(30)   | YES  |     | NULL              |                             |
| ext_no                 | int(10)       | YES  |     | NULL              |                             |
| department             | int(5)        | NO   |     | NULL              |                             |
| marital_status         | int(5)        | NO   |     | NULL              |                             |
| monthly_limit          | decimal(15,2) | YES  |     | NULL              |                             |
| communication_limit    | decimal(15,2) | YES  |     | NULL              |                             |
| medical_per_bill       | decimal(15,2) | YES  |     | NULL              |                             |
| medical_per_annum      | decimal(15,2) | YES  |     | NULL              |                             |
| medical_cur_year_total | decimal(15,2) | YES  |     | NULL              |                             |
| dental_per_bill        | decimal(15,2) | YES  |     | NULL              |                             |
| dental_per_annum       | decimal(15,2) | YES  |     | NULL              |                             |
| dental_cur_year_total  | decimal(15,2) | YES  |     | NULL              |                             |
| doj                    | date          | YES  |     | NULL              |                             |
| status                 | int(5)        | NO   |     | 2                 |                             |
| members_link_id        | int(11)       | YES  |     | NULL              |                             |
| created_on             | timestamp     | NO   |     | CURRENT_TIMESTAMP |                             |
| modified_by            | int(10)       | YES  |     | NULL              |                             |
| modified_on            | timestamp     | YES  |     | NULL              | on update CURRENT_TIMESTAMP |
+------------------------+---------------+------+-----+-------------------+-----------------------------+

2 个答案:

答案 0 :(得分:1)

您是否使用SELECT语句检查了要更新的行是否存在并且在更新之前具有其他值而不是之后的值?因为当更新前后的值相同时,mysql将返回零受影响的行。见this similiar SO question

编辑:如果您想要找到所有找到的行(不仅是实际更改的行),您可以尝试连接标记FLAG_FOUND_ROWS(请参阅MYSQL Doc)。

edit2:好主意:错误可能在if / elseif / else语句中可能无法读取受影响的行

尝试:

$success = $stmt->execute();

if(!success) {
   $stmt->close();
  $mysqli->close();
  return $this->errormsg('FAILURE!','Staff SignUp cannot Perform at this moment.');#errormsg user written function   
} else {
  if($stmt->affected_rows>0) {
    $stmt->close();
    $mysqli->close();
    return $this->errormsg('SUCCESS!','Staff SignUp Done.',2);
  } else {
    $stmt->close();
    $mysqli->close();
    return $this->errormsg('WARNING!','Staff SignUp Not Done.',4);
  }
}

答案 1 :(得分:0)

感谢所有试图解决我的问题的人。我使用jQuery AJAXbootstrapvalidator使用HTML form呈现POST提交表单。同样的问题在另一个项目中模拟,并注意到单个表单提交 AJAX调用触发了两次

表格提交JS:

.on('success.form.bv', function(e){
    e.preventDefault();     
    var $form = $("#signupapprovalform"), url = $form.attr('action'); 
    $.post(url,$form.serialize()).done(function(dte){ $("#signup-content").html(dte); });
});
  

解决问题:我只是添加 e.stopImmediatePropagation();旁边   e.preventDefault();

实际上PHP和mysql没有问题。