使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,它们都被订阅,超过了限制,这是错误的。)

您是否知道可以做什么?在此先感谢您的帮助!

avafavaf 回答:使sql一次执行来自不同用户的一个请求是否可行?

即使只有一个地方,您也无法避免两个人都可以订阅。

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

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

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

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

顺便说一句: 将订户存储为json编码列表不是一个好主意。您应该改为使用两列订阅表。您在实体 taller user

之间存在多对多关系
本文链接:https://www.f2er.com/3169781.html

大家都在问