php – 几个请求同时导致错误的SQL结果

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – 几个请求同时导致错误的SQL结果脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
面临一个未知问题,我创建了一个连接到MysqLPHP API(Slim框架Slim PDO).我使用Nginx作为HTTP服务器. API使用“device-id”标头来识别客户端( Android应用程序).令人担忧的是,最近AndROId应用程序的更新使得在启动此应用程序时,如果用户未知,它现在在结果API上发出2个异步请求我发现自己在表中的两个条目用户携带相同的设备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;
  }

createUser()函数在users表中创建一个带有device-id的条目以及其他信息,如date等.

User lists

预先感谢您的帮助

解决方法

>如果表中的device_id字段应该是唯一的,则为其添加唯一索引.
>然后你就可以在DUPLICATE KEY上运行一个mySQL查询

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

我不知道是否可以使用Slim-PDO运行这样的查询,但至少你可以使用通用插入和更新查询,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;
    }
}

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

脚本宝典总结

以上是脚本宝典为你收集整理的php – 几个请求同时导致错误的SQL结果全部内容,希望文章能够帮你解决php – 几个请求同时导致错误的SQL结果所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。