2012-05-21 3 views
-2

Привет, У меня есть программа, которая должна быть исправлена. Вот проблема:php двойной вычитание из бесплатного кредита и регулярного кредита?

Например, у меня есть:

Бесплатный кредит 2 и регулярный кредит 5.

Для примера я хочу купить товар за 3 кредитов.

Я хочу вычитать 2 бесплатных кредита и 1 регулярный кредит.

поэтому оставшийся остаток будет 0 бесплатных кредитов и 4 обычных кредита.

Бесплатные кредиты будут первыми вычитать до вычета основного кредита.

В моей существующей программе, если я покупаю 1 пункт за 3 кредитов

здесь баланс вышли: -1 бесплатных кредитов 5 регулярных кредитов

Что не быть.

Я хочу, чтобы, как это: 0 бесплатных кредитов 4 регулярных кредитов

Я надеюсь, что кто-то может помочь мне в этом вопросе. Спасибо.

+1

Просьба показать (* соответствующие * части) вашего кода. – eggyal

ответ

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 должен быть подписан .

+0

Итак, вы получаете регулярные кредиты, если у вас недостаточно свободных кредитов? Вычитание отрицательного добавляет номер ... – animuson

+0

LOL, да, я думаю, я пытался выяснить, что будет для его приложения, и саботировать его для моих собственных интересов (я исправил его, спасибо) –

+0

OP может захотеть проверить, что перед проведением этих операций есть достаточные кредиты, что приведет к возникновению проблем с параллелизмом ... – eggyal

Смежные вопросы