查询成功时,
我添加了另一种方法来跟踪变量
我尝试了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)