簡體   English   中英

更新查詢執行后受影響的行在mysql中返回0

[英]After Update Query Executed Affected rows returning 0 in mysql

我正在嘗試從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版本5.5.12
  • MySQL 5.6.17
  • 阿帕奇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 |
+------------------------+---------------+------+-----+-------------------+-----------------------------+

您是否用SELECT語句檢查了要更新的行是否存在,並且在更新之前和之后都有另一個值? 因為當更新前后值相同時,mysql將返回零受影響的行。 看到這個類似的問題

編輯:如果要獲取所有行(不僅是實際更改的行),可以嘗試使用連接標志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);
  }
}

感謝所有試圖解決我的問題的人。 我正在使用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();旁邊e.preventDefault();

實際上,PHP和mysql沒有問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM