我的上次订阅不会关闭订阅

时间:2016-08-10 04:51:33

标签: php sql innodb

我的系统现在遇到很大的实时问题。想象一下,您可以注册订阅。假设最多只有3名参与者。当有3个人到达时,必须为所有人关闭订阅!这是我的代码的一部分:

               function subscription_data($subid)  // activated by ajax
               { 
                    $sql = 'SELECT subEnrolled, subStatus FROM subscription WHERE subID=:subid';
                    $stmt = $db->prepare($sql);
                    $stmt->bindparam("subid", $subid);
                    $stmt->execute();
                    $row = $stmt->fetch(PDO::FETCH_ASSOC);
                    $subEnrolled = $row['subEnrolled'];
                    $subParticipants = '3';

                    // is this subscription already closed ???
                    if (!($row['subStatus'] =='1'))  // if '1' not run anymore
                    {    
                         if( $subEnrolled+1 == $subParticipants )
                         {
                              $status1 = '1'; // close subscription for the NEXT fire
                              $sql = 'UPDATE subscription SET subStatus=:substatus WHERE subID=:subid';
                              $stmt = $db->prepare($sql);
                              $stmt->bindparam("subid", $subid);
                              $stmt->bindparam("substatus",$status1);

                              $stmt->execute(); 
                         }    

                         //
                         // DO SOMETHING MORE
                         //

                         // Add to one enrollment
                         $add1enroll = '1';
                         $sql = 'UPDATE subscription SET subEnrolled=subEnrolled+:subenrolled WHERE subID=:subid';
                         $stmt = $db->prepare($sql);
                         $stmt->bindparam("subenrolled", $add1enroll);
                         $stmt->bindparam("subid", $subid);
                         $stmt->execute();
                    }
               }

我的问题是我希望在超过例如3人报名参加。但是,如果我快速点击我的AJAX按钮以激活该功能,使用多个帐户(4),我实际上可以从3中获得4个注册。我试图通过上面的if( $subEnrolled+1 == $subParticipants )来避免这种情况 - 这是最后一个特例注册订阅的参与者。它不起作用。

希望你了解我的变量,我尽量使它们成为逻辑。上面的代码也在transaction()函数中,我一般使用InnoDB表,但如果我改变它,我仍然有同样的问题。

1 个答案:

答案 0 :(得分:1)

在事务中包装语句时,只有在尝试运行INSERT,UPDATE或其他此类语句时才会应用表锁。

您应该在WHERE子句中添加另一个条件,以检查有多少个注册。

UPDATE subscription
SET subEnrolled=subEnrolled+:subenrolled
WHERE
  subID=:subid AND
  subEnrolled  < 3

可能还需要从+1删除if( $subEnrolled+1 == $subParticipants )