1

MySQL トランザクションを正しく使用して、重要なことを正しく処理していることを確認したいと思います (競合エラーなどはありません)。

$mysqli->autocommit(FALSE);
$mysqli->query("UPDATE users SET balance=balance-$amount, transactions=transactions+1, sent=sent+$amount WHERE email='$email'");
$mysqli->query("UPDATE users SET balance=balance+$amount, transactions=transactions+1, recv=recv+$amount WHERE email='$address'");
$newBalanceQ = $mysqli->query("SELECT balance FROM users WHERE email='$email'");
$newBalance = $newBalanceQ->fetch_row()[0];
if($newBalance < 0){
    $mysqli->rollback();
} else {
    $mysqli->commit();
}
4

1 に答える 1

2

UPDATEまたは、両方のクエリを 1 つのステートメントに結合できるため、トランザクションなしで実行できます。

UPDATE  users 
SET     balance = balance - (CASE WHEN email = '$email' THEN $amount ELSE $amount * -1 END), 
        transactions = transactions + 1,
        sent = (CASE WHEN email = '$email' THEN sent + $amount ELSE sent END),
        recv = (CASE WHEN email = '$address' THEN recv + $amount ELSE recv END)
WHERE   email IN ('$email','$address')

を使用してMySQLiいますが、値をパラメータ化していません。この場合、SQL Injection.

于 2013-06-03T01:16:06.373 に答える