【问题标题】:handle php error after foreach successforeach 成功后处理 php 错误
【发布时间】:2023-03-06 12:07:01
【问题描述】:

我尝试在foreach循环中catch if do 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;

【问题讨论】:

  • ??不,以上就是全部了..
  • $response_message['success_message'] 在您的职能范围内如何? $response_message['success_message']undefined
  • @Arif_suhail_123 谢谢!
  • @PHPglue 我之前定义的
  • @PHPglue nah.. 它可以使用状态来检查一个 sql 执行像这样$status = $stmt->execute(); 但我试图找到如何检查所有 sql 执行成功并完成而不是发送消息

标签: php loops pdo foreach


【解决方案1】:

$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)

【讨论】:

  • 感谢回复,这是每次检查,但我试图找到毕竟 foreach 成功而不是推送一条成功消息或推送一条失败消息
  • 我不明白?这正是我所做的。也许刷新页面@user1775888
  • mm.. 您确实在 foreach 循环中检查了if($status && $row_count > 0) 并推送消息$success_message = 'Successful update for sequence id ='.$each_data['id']; array_push($response_message['success_message'], $success_message);,但如果全部成功或一条失败,我只想要一条消息
猜你喜欢
  • 2012-02-12
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 2018-09-20
相关资源
最近更新 更多