php - 是否可以让 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,都被订阅了,超出了限制,这是错误的)。
你知道可以做什么吗?提前感谢您的帮助!!
解决方案
即使只有一个位置可用,您也无法避免两个人都有机会订阅。
但是,如果两者都尝试同时订阅,您可以确保其中只有一个成功。
它可以像重复测试长度一样简单,以保护您的第一个代码块中的更新:
$sql_t = "UPDATE talleres SET user_email='$arrayEncoded' WHERE taller='$tallerM'";
if (count($arrayDecoded)<$num){
mysqli_query($conn, $sql_t);
}
该解决方案可能导致用户 A 获得最后一个订阅,然后用户 B 替换用户 A 作为最后一个订阅者。如果它很重要,您可以通过使用事务来避免这种情况。
顺便说一句:将订阅者存储为 json 编码列表不是一个好主意。您应该改用两列订阅表。实体和用户之间存在多对多关系
推荐阅读
- python - Python manage.py runserver 错误做 Python Crash Course
- r - 打印屏幕后如何修改按钮输出(R闪亮)?
- salesforce - 通过 Lightning Web 组件中的插槽渲染图表 JS
- python-3.x - Dask 因 Tornado 错误“打开的文件过多”而失败
- swift - 在同一个 UIView 中使用两个 UIPickerView 第二个 UIPickerView 不能居中对齐内容
- amazon-web-services - AWS Cloudformation:为用户数据添加参数
- javascript - 如何修复:在字符串中找到一个子字符串
- java - 如果我在 java 中为 int 和 long 类型添加 2147483647 到自身,为什么会得到 -2?
- ios - 如何调整标签栏项目iOS的位置?
- python-3.x - 自定义模块导入失败