Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 多个请求同时出现错误的SQL结果_Php_Mysql_Nginx_Pdo_Slim - Fatal编程技术网

Php 多个请求同时出现错误的SQL结果

Php 多个请求同时出现错误的SQL结果,php,mysql,nginx,pdo,slim,Php,Mysql,Nginx,Pdo,Slim,我面临一个未知的问题,我创建了一个连接到Mysql的PHP API(Slim framework+Slim PDO)。我使用Nginx作为HTTP服务器。API使用“设备id”头来识别客户端(android应用程序)。令人担忧的是,最近android应用程序的一次更新使得在启动此应用程序时,如果用户未知,它现在会在结果API上发出两个异步请求。我发现自己的表中有两个条目,用户携带相同的设备id 在中间件中 $user = new User($device_id, $ip); 在用户类中 f

我面临一个未知的问题,我创建了一个连接到Mysql的PHP API(Slim framework+Slim PDO)。我使用Nginx作为HTTP服务器。API使用“设备id”头来识别客户端(android应用程序)。令人担忧的是,最近android应用程序的一次更新使得在启动此应用程序时,如果用户未知,它现在会在结果API上发出两个异步请求。我发现自己的表中有两个条目,用户携带相同的设备id

在中间件中

$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;
  }
函数的作用是:在用户表中创建一个条目,其中包含设备id以及日期等其他信息

提前感谢您的帮助

  • 如果设备id字段在表中应该是唯一的,则为其添加唯一索引
  • 然后您就可以在重复密钥上运行mysql查询,如

    INSERT INTO users (...) VALUES(:device_id, :ip, ...)
    ON DUPLICATE KEY UPDATE ip = values(ip) , ...
    
  • 我不知道是否可以使用Slim PDO运行这样的查询,但至少可以使用通用的插入和更新查询:


    只更新某个错误非常重要,否则重新抛出它。

    请注意:PDO连接选项
    PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,
    必须设置为抛出
    PDO EXCEPTION
    $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;
        }
    }