-3

こんにちは、修正が必要なプログラムがあります。問題は次のとおりです。

たとえば、私は持っています:

2 の無料クレジットと 5 の通常のクレジット。

たとえば、アイテムを 3 クレジットで購入したいとします。

無料クレジット2枚と通常クレジット1枚を差し引きたいです。

したがって、残りの残高は無料クレジット 0 と通常クレジット 4 になります。

無料クレジットは、通常のクレジットが差し引かれる前に最初に差し引かれます。

既存のプログラムで 1 アイテムを 3 クレジットで購入した場合

出てくる残高は次のとおりです: -1 無料クレジット 5 通常クレジット

それはそうではありません。

こんな感じにしたい: 0 無料クレジット 4 通常クレジット

この問題について誰かが私を助けてくれることを願っています。ありがとうございました。

4

1 に答える 1

1
$free_credits -= $cost;
if($free_credits < 0) {
    $regular_credits += $free_credits;
    $free_credits = 0;
}

またはできればSQLで直接:

START TRANSACTION;
    SELECT @ok := (free_credits + regular_credits) > :cost
        FROM user_credits WHERE id = :id  FOR UPDATE;

    IF @ok THEN
        UPDATE user_credits
            SET
                free_credits = free_credits - :cost,
                regular_credits = regular_credits + IF(free_credits < 0, free_credits, 0)
            WHERE id = :id
    ELSE;
        /* something to cause the commit to fail */
    END IF;
COMMIT;

技術的には、これが機能するには、free_credits のデータ型を署名する必要があります

于 2012-05-21T06:56:16.483 に答える