Как я могу удалить последние все транзакции, сделанные PHP API? - PullRequest
0 голосов
/ 09 октября 2019

У меня есть API квитанции, который генерирует квитанцию. При создании квитанции выполняется несколько операций SQL. Теперь, если я генерирую квитанцию ​​по ошибке, как я могу отменить все последние операции.

Что мне нужно сделать, так это то, что я хочу, чтобы все данные были такими, как перед вызовом API. У меня есть идея о Rollback, но я не знаю, как я могу использовать это в этом. Если вы поможете, пожалуйста, сделайте это.

Моя квитанция выглядит следующим образом.

<?php

include 'connection.php';

extract($_REQUEST);
$data = array();
$resArr = array();

$payment_type = $_POST['payment_type'];
$cheque_date = $_POST['cheque_date'];
$cheque_no = $_POST['cheque_no'];
$paid_amount = $_POST['paid_amount'];



$query = customSelectQuery(
    "SELECT c.emi_amount as customer_emi_amount, ltc.no_of_month as ltc_no_of_month, 
    ltc.emi_date as ltc_emi_date, ltc.loan_amount as ltc_loan_amount
    from loan_to_customer ltc
    LEFT JOIN customer c ON c.customer_id = ltc.customer_id
    WHERE ltc.customer_id = $customer_id");

//  print_r($query);

if (isset($query)) {
    $ltc_data = array();
    foreach ($query as $row) {
        $ltc_data = array(
            'ltc_emi_date' => explode(',', $row['ltc_emi_date']),
            'ltc_no_of_month' => $row['ltc_no_of_month'],
            'ltc_loan_amount' => $row['ltc_loan_amount'],
            'customer_emi_amount' => $row['customer_emi_amount']
        );
    }
}

$ltc_loan_amount = $ltc_data['ltc_loan_amount'];

$remaining_loan_amount = $ltc_loan_amount - $paid_amount;

$receipt_number = 'CMF/EMI/RECEIPT/126';
$receipt_data = array(

    'customer_id' => $customer_id,
    'payment_type' => $payment_type,
    'cheque_date' => $cheque_date,
    'cheque_no' => $cheque_no,
    'paid_amount' => $paid_amount,
    'remain_amount' => $remaining_loan_amount,
    'receipt_no' => $receipt_number

);

$insert_in_reciept = insert("receipt", $receipt_data);


$removed_emi_date = array_shift($ltc_data['ltc_emi_date']);


$number_of_month_remaining = count($ltc_data['ltc_emi_date']);

$string_number_of_month_remaining = implode(',', $ltc_data['ltc_emi_date']);


$loan_to_customer_data = array(

    'customer_id' => $customer_id,
    'loan_amount' => $remaining_loan_amount,
    'no_of_month' => $number_of_month_remaining,
    'emi_date' => $string_number_of_month_remaining


);

$update_ltc = update("loan_to_customer", $loan_to_customer_data, 'customer_id = ' . $customer_id);

$query1 = customSelectQuery("select r.*, ltc.emi_date as ltc_emi_date, ltc.*, c.first_name,
c.middle_name, c.last_name, c.gender, c.cust_address, c.cust_city,
c.cust_dist, c.cust_state, c.cust_pincode FROM receipt r 
LEFT JOIN customer c ON c.customer_id = r.customer_id
LEFT JOIN loan_to_customer ltc ON r.customer_id = ltc.customer_id
WHERE r.customer_id = $customer_id");

if (isset($query1)) {
    $d = array();
    foreach ($query1 as $row) {
        $d = array(
            'first_name' => $row['first_name'],
            'middle_name' => $row['middle_name'],
            'last_name' => $row['last_name'],
            'gender' => $row['gender'],
            'cust_address' => $row['cust_address'],
            'cust_city' => $row['cust_city'],
            'cust_state' => $row['cust_state'],
            'cust_pincode' => $row['cust_pincode'],
            'ltc_emi_date' => explode(',', $row['ltc_emi_date']),
            'payment_type' => $row['payment_type'],
            'cheque_date' => $row['cheque_date'],
            'cheque_no' => $row['cheque_no'],
            'paid_amount' => $row['paid_amount'],
            'remain_amount' => $row['remain_amount'],
            'penalty_amount' => $row['penalty_amount'],
            'receipt_no' => $row['receipt_no'],
            'emi_date' => $row['emi_date'],
            'pending_penalty' => $row['pending_penalty'],
            'paid_penalty' => $row['paid_penalty'],
            'user' => $row['user'],
            'user_branch' => $row['user_branch'],
            'verify' => $row['verify'],
        );
    }
}


$resArr = array("success" => 1, "data" => $d, "message" => "");
header('Content-Type: application/json');
echo str_replace("\/", "/", json_encode($resArr, JSON_UNESCAPED_UNICODE));

?>

Ответы [ 3 ]

0 голосов
/ 09 октября 2019

Вы можете сделать что-то вроде этого:

mysqli_begin_transaction($connection, MYSQLI_TRANS_START_READ_ONLY);

try {
    mysqli_query($connection, $yourSelectQuery1);
    mysqli_query($connection, $yourSelectQuery2);
    mysqli_query($connection, $yourSelectQuery3);

    mysqli_commit($connection);
} catch($e) {
    mysqli_rollback($connection);
}

mysqli_close($connection);
0 голосов
/ 09 октября 2019

Конечно, , невозможно использовать транзакции для подобного сценария.

И нет надежного способа отменить предыдущую операцию со структурой базы данных, подобной этой.

Чтобы сделать это возможным, вы должны нормализовать вашу базу данных. Другими словами, любое добавление должно выполняться только с помощью запросов INSERT, но не следует использовать ни одного UPDATE.

Учитывая, что для отмены операции вам нужно собрать все идентификаторы вставки из запросов вставки и сохранить их в сеансе. После нажатия кнопки отмены просто удалите записи, основанные на сохраненных идентификаторах

0 голосов
/ 09 октября 2019
  1. Сначала запустите транзакцию с помощью оператора START TRANSACTION .
  2. Выполните все, что вы хотите.
  3. Наконец, зафиксируйте транзакцию с помощью COMMIT оператор для сохранения данных.
  4. Если вы не хотите изменять откат текущей транзакции и отменить ее изменения, вы используете оператор ROLLBACK .

См. Ссылку ниже для получения дополнительной информации. https://dev.mysql.com/doc/refman/8.0/en/innodb-autocommit-commit-rollback.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...