2016-08-10 1 views
0

지금 내 시스템에서 거대한 실시간 문제가 있습니다. 구독을 등록 할 수 있다고 상상해보십시오. 최대 참가자가 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 명이 등록합니다. 그러나 여러 계정 (4)을 사용하여 기능을 실행하기 위해 AJAX 버튼을 빨리 누르면 3에서 4 개의 등록을 얻을 수 있습니다. 위의 if($subEnrolled+1 == $subParticipants)과 함께이 문제를 피하려고했는데 - 마지막으로 등록한 사람의 경우 신청. 작동하지 않습니다.

당신이 내 변수를 이해하기를 바랍니다. 가능한 한 논리로 만들려고 노력했습니다. 위의 코드는 transaction() 함수 안에 있으며 일반적으로 InnoDB 테이블을 사용합니다. 그러나 이것을 변경하면 여전히 동일한 문제가 있습니다.

+0

얼마나 많은 구독이 있는지 추적하고 계십니까? – Terminus

+0

에'// DO SOMETHING' 내가'UPDATE subscription' 테이블을 추가하고 함수가 실행될 때마다 1 개의 등록을 추가합니다. 함수를 시작할 때이 번호 (등록 번호)를 추출하여'$ subEnrolled '변수에 넣습니다. 위의 내용은 단지 설명을위한 것입니다 –

+0

구독을 종료하더라도 등록을 추가하는 것 같습니다. 아마도 문제가 생길 수 있습니다. – Terminus

답변

1

트랜잭션에서 명령문을 래핑 할 때 INSERT, UPDATE 또는 다른 명령문을 실행하려고 할 때만 테이블 잠금이 적용됩니다.

등록 수를 확인하는 다른 조건을 WHERE 절에 추가해야합니다.

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

아마 너무 if($subEnrolled+1 == $subParticipants)에서 +1을 제거해야합니다.

+0

Ok Terminus, 나는 올바른 길로 가야한다고 생각합니다. 지금까지는 그것이 작동한다면, 나는이 중요한 문제를 확신하기 위해 내일 시험을 마칠 것입니다. 돌아 오는 것을 잊지 않을거야, 고마워! –

+0

많은 조합을 시도했습니다. 불행히도 저는 여전히 3 번 이상 등록 할 수 있습니다. 'if ($ subEnrolled + 1 == $ subParticipants)'에'+ 1 '을 쓰지 않고 첫 번째 등록 후 바로 구독을 마칠 것입니다.'subEnrolled <3 'WHERE 절이 3 이하이어야합니다. 또한이 하위 폴더를'subEnrolled + 1 = 3'으로 변경하려고 시도했다. –

관련 문제