foreach成功后处理php错误


handle php error after foreach success

我尝试了catch,如果在foreach循环中执行CRUD,如果成功循环完成了将消息推送到数组中,下面是我的函数,我在foreach之后推送消息,这是正确的吗?

// .. defined response_message array
try {
  foreach ($data as $i => $each_data) {
    $sql = "UPDATE tag_0 SET sequence = :sequence WHERE id = :id";
    $stmt = $connect_db_read->prepare($sql);
    $stmt->bindValue(':id', $each_data['id']);
    $stmt->bindValue(':sequence', $each_data['sequence']);
    $stmt->execute();
  }
  // here
  $success_message = 'success_message: store in database success';
  array_push($response_message['success_message'], $success_message);
} catch (PDOException $e) {
  $debug_message = $e->getMessage();
  array_push($response_message['debug_message'], $debug_message);
  $error_message = "error_message: ? database";
  array_push($response_message['error_message'], $error_message);
}

$data = array();
$data['response_message'] = $response_message;

return $data;
查询成功时,

$stmt->execute();将返回true。

这并不意味着记录已更新,只意味着查询执行时没有出现错误。

为了真正确定,您必须使用rowCount() 检查受影响的行数

尝试这种方法:

$error_counter = 0;
$sql = "UPDATE tag_0 SET sequence = :sequence WHERE id = :id";
$stmt = $connect_db_read->prepare($sql);  
foreach ($data as $i => $each_data) {
    $stmt->bindValue(':id', $each_data['id']);
    $stmt->bindValue(':sequence', $each_data['sequence']);
    $status = $stmt->execute();
    $row_count = $stmt->rowCount();
    if($status && $row_count > 0){
        $success_message = 'Successful update for sequence id ='.$each_data['id'];
        array_push($response_message['success_message'], $success_message);
    }else{
        $failed_message = 'update failed for sequence id ='.$each_data['id'];
        array_push($response_message['fail_message'], $fail_message);
        $error_counter++;
    }
}

您还应该准备一次,然后在循环中绑定和执行,无需在每次迭代中将查询发送回数据库。


我添加了另一种方法来跟踪变量$error_counter,如果值是0,那么所有记录都会更新。

//check after the loop
if($error_counter === 0){
    echo 'All UPDATES SUCCESSED !!!!';
}else{
    echo 'NOT ALL SUCCESFUL !';
}

或者,您可以使用失败消息的计数来实现相同的目的:

(count($response_message['fail_message'])===0)