2017-12-17 25 views
4

私は未知の問題に直面しています。私はPHP API(Slimフレームワーク+ Slim PDO)をMysqlに接続して作成しました。私はHTTPサーバーとしてNginxを使用します。 APIはクライアント(アンドロイドアプリケーション)を認識するために "device-id"ヘッダーを使用します。気になるのは、最近アンドロイドアプリケーションをアップデートすると、このAPIの起動時に、ユーザーが不明な場合に結果APIに対して2つの非同期要求が行われることになります。同じデバイスID複数のリクエストが同時に悪いSQL結果

ミドルウェア

$user = new User($device_id, $ip); 
ユーザクラスの

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; 
    } 

でのcreateUser()関数は、日付などのデバイスIDを持つユーザテーブル内のエントリ、ならびに他の情報を作成しそうです。

User lists

DEVICE_IDフィールドは、テーブルに一意であることが想定される場合には、それのために一意のインデックスを追加あなたの助けのために事前に

答えて

1
  1. 、ありがとうございました。
  2. INSERT INTO users (...) VALUES(:device_id, :ip, ...) 
    ON DUPLICATE KEY UPDATE ip = values(ip) , ... 
    

ように私はそれがスリム-PDOで、このようなクエリを実行することができます場合は、知っているではありません、あなたは、DUPLICATE KEY ON mysqlのクエリを実行できるようになります少なくともあなたは、一般的な挿入および更新クエリでusing exceptions, as shown in my articleを行くことができます:

$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; 
    } 
} 

それだけで特定のエラーに更新することは非常に重要だし、そうでない場合は、それを再スローします。

+0

簡単な注意:PDO接続オプション 'PDO :: ATTR_ERRMODE => PDO :: ERRMODE_EXCEPTION 'は、' PDOException'がスローされるように設定する必要があります。 – DanielO

+0

良い点、ありがとうございます。 –

関連する問題