2017-12-17 26 views
4

알 수없는 문제가 발생하여 MySQL에 연결된 PHP API (Slim framework + Slim PDO)를 만들었습니다. Nginx를 HTTP 서버로 사용합니다. API는 클라이언트 (안드로이드 응용 프로그램)를 인식하기 위해 "device-id"헤더를 사용합니다. 관심사는 최근에 안드로이드 응용 프로그램의 업데이트로 인해 사용자가 알 수없는 경우 result API에 대한 2 개의 비동기 요청을하게됩니다. 사용자가 동일한 장치 ID를 전달하는 두 개의 항목으로 나 자신을 찾습니다 사용자 클래스 미들웨어여러 번에 동시에 나쁜 결과가 발생했습니다.

$user = new User($device_id, $ip); 

에서

는 createUser() 함수 날짜 등의 장치 ID와 함께 사용자 테이블 엔트리뿐만 아니라 다른 정보 등을 만드는
function __construct($device_id, $ip) 
    { 
    $this->_device_id = $device_id; 
    $this->_ip = $ip; 

    if ($this->isExists()) 
     $this->updateInfo(); 
    else 
     $this->createUser(); 
    } 

    private function isExists() 
    { 
    global $db_core; 

    $selectStatement = $db_core->select(array('id', 'current_group')) 
         ->from('users') 
         ->where('device_id', '=', $this->_device_id); 
    $stmt = $selectStatement->execute(); 
    if ($stmt->rowCount() > 0) 
    { 
     $u = $stmt->fetch(); 
     $this->_id = $u['id']; 
     $this->_current_group = $u['current_group']; 
     return true; 
    } 
    return false; 
    } 

및 곧. DEVICE_ID 필드가 다음 표에 고유 그것을 위해 고유 인덱스를 추가하도록되어있는 경우

User lists

당신의 도움이

답변

1
  1. 에 미리 감사드립니다.
  2. 그런
  3. 중복 KEY ON MySQL의 쿼리를 실행 할 수 있습니다,

    같은
    INSERT INTO users (...) VALUES(:device_id, :ip, ...) 
    ON DUPLICATE KEY UPDATE ip = values(ip) , ... 
    

는 슬림 PDO와 같은 쿼리를 실행할 수 있는지 내가하지만,에서, 모르는

$this->_device_id = $device_id; 
$this->_ip = $ip; 
try { 
    $this->createUser(); 
} catch (PDOException $e) { 
    $search = "!Integrity constraint violation: 1062 Duplicate entry\ .*? for key 'device_id'!"; 
    if (preg_match($search, $e->getMessage())) { 
     $this->updateInfo(); 
    } else { 
     throw $e; 
    } 
} 

그것은 단지 특정 오류에 업데이트하는 것이 매우 중요하고, 그렇지 않으면 그것을 다시 던져 : 적어도 당신 일반 삽입 및 업데이트 쿼리 using exceptions, as shown in my article을 갈 수 있습니다.

+0

잠깐 : PDO 연결 옵션'PDO :: ATTR_ERRMODE => PDO :: ERRMODE_EXCEPTION '은'PDOException'이 던져 지도록 설정되어야합니다. – DanielO

+0

좋은 지적, 감사합니다. –