首页 > 解决方案 > 是否可以让 sql 一次执行来自不同用户的一个请求?

问题描述

我正在构建一个订阅系统,对于每个类别,都有订阅者限制。我使用的语言是 PHP,数据库是 MySQL。

这个想法是,在登录页面中,用户选择一个类别进行订阅。在那里,有一个可用类别的输入(尚未超过订阅者限制的类别)。

我为订阅用户编写的代码如下:

$array_m = "SELECT * FROM talleres WHERE taller = '$tallerM'";
    $result = mysqli_query($conn, $array_m);
    $row = mysqli_fetch_assoc($result);

    if($row['user_email'] === '') {
      $row['user_email'] = json_encode(array());
    }

    $arrayDecoded = json_decode($row['user_email']);
    $session_email = $_SESSION['u_email'];
    // $usersYoga = array();
    array_push($arrayDecoded, $session_email);

    $arrayEncoded = json_encode($arrayDecoded);

    $sql_t = "UPDATE talleres SET user_email='$arrayEncoded' WHERE taller='$tallerM'";
    mysqli_query($conn, $sql_t);

我为显示哪些是可用订阅而编写的代码是:

$tallerCheck = "SELECT user_email FROM talleres WHERE taller='$value'";
          $result = mysqli_query($conn, $tallerCheck);
          $row = mysqli_fetch_array($result);
          $rowDecoded = json_decode($row['user_email']);
          if(count($rowDecoded) >= $num) {
            // Code for showing only the available options in the front-end
            echo "<script>blockTaller('".$value."')</script>";
          }

我期望当用户订阅时,订阅者数量会增加,并且当达到限制时,该类别不会显示(或被阻止)。当一次只有一个用户订阅时,没有问题。但是,当多个用户同时订阅时,他们都订阅了,没有为每个用户检查限制(例如,假设 A 类的限制是 15,订阅数是 14;当两个用户同时订阅了A,都被订阅了,超出了限制,这是错误的)。

你知道可以做什么吗?提前感谢您的帮助!!

标签: phpsql

解决方案


即使只有一个位置可用,您也无法避免两个人都有机会订阅。

但是,如果两者都尝试同时订阅,您可以确保其中只有一个成功。

它可以像重复测试长度一样简单,以保护您的第一个代码块中的更新:

$sql_t = "UPDATE talleres SET user_email='$arrayEncoded' WHERE taller='$tallerM'";
if (count($arrayDecoded)<$num){
    mysqli_query($conn, $sql_t);
}

该解决方案可能导致用户 A 获得最后一个订阅,然后用户 B 替换用户 A 作为最后一个订阅者。如果它很重要,您可以通过使用事务来避免这种情况。

顺便说一句:将订阅者存储为 json 编码列表不是一个好主意。您应该改用两列订阅表。实体用户之间存在多对多关系


推荐阅读