Я надеялся, что кто-нибудь направит меня в правильном направлении. Я пытаюсь сделать следующее:
пользователь загружает CSV-файл, после чего данные сохраняются в многомерном массиве $ formatted_payments. Затем я проверяю записи в файле по сравнению с записями в БД. Мне нужно проверить, совпадает ли маршрут из файла с маршрутом в БД, если он подходит для всех записей, а затем зафиксировать все обновления, но если есть одно несоответствие, мне нужно откатить все обновления. Я надеюсь, что все это имеет смысл. Вот что я сделал, но я еще не проверял.
Спасибо
$conn->autocommit(FALSE);
$route_errors = [];
foreach($formatted_payments as $val){
$sql = "SELECT id, account_no, payment_amount, route_id, payment_date FROM car_payments WHERE payment_date = '".$date."' AND account_no = '".$val['account_no']. "'";
$res = $conn->query($sql);
$data = $res->fetch_object();
if($data){
if($val['amount'] > 0){
if($val['route_id'] != $data->route_id){
$route_errors[] = $val['account_no'];
}else{
$sql = "UPDATE car_payments SET payment_amount = ? charged = ? WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("sss", $val['amount'], 'Si', $data->id);
$stmt->execute();
}
}else{
$sql = "UPDATE car_payments SET payment_amount = ? charged = ?, pending = ? WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ssss", $val['amount'], 'No', 1, $data->id);
$stmt->execute();
}
}
}
if(!empty($route_errors)){
$conn->roll_back();
echo 'The following accounts do not match the route. Records not imported.<br>';
foreach($route_errors as $value){
echo '<li>' . $value . '</li>';
}
}else{
$conn->commit();
}