【发布时间】:2017-07-26 17:34:34
【问题描述】:
此代码有效,但问题是如果几个人同时使用它会导致一些人无法注册的问题。所以我需要重写它,使每个人的所有查询都在下一个人的查询开始之前执行和完成。
首先,代码从数据库中读取,以获取到目前为止所有注册人的字符串。
$sql_s = $con -> query("select * from schedule where date='$date'");
$row_schedule = $sql_s->fetch_array(MYSQLI_BOTH);
$participants = $row_schedule['participants'];
$participants 是一个类似于 "'Sara':'Richard':'Greg'" 的字符串
现在当前用户(Fredrik)想像这样将它的名字添加到字符串中
$current_user='Fredrik';
$participants_new=add_participant($participants,$current_user);
add_participant 是一个将“Fredrik”添加到参与者字符串的 php 函数。然后我想像这样在 SQL 数据库中用新的参与者字符串替换旧的参与者字符串
$sql = $con->query("UPDATE schedule SET participants='{$participants_new}' where date='{$date}'");
具体的问题是,如果另一个人(Linda)在 Fredrik 执行之前读取了数据库
$sql = $con->query("UPDATE schedule SET participants='{$participants_new}' where date='{$date}'");
Linda 不会得到包含 Fredrik 的字符串,她会得到“'Sara':'Richard':'Greg'”。当她添加她的名字时,它看起来像“'Sara':'Richard':'Greg':'Linda'”,当她像这样更新数据库时
$sql = $con->query("UPDATE schedule SET participants='{$participants_new}' where date='{$date}'");
包含 Fredrik ("'Sara':'Richard':'Greg':'Fredrik'") 的字符串将被 ("'Sara':'Richard':'Greg':'Linda'") 覆盖,并且没有人会知道 Fredrik 在课堂上注册了。
因此,我该如何重写这段代码,以便在 Linda 的查询开始之前执行 Fredrik 的所有查询?
【问题讨论】:
-
我喜欢这个问题。它非常具有架构性,旨在解决物流问题。
-
为什么不添加每行的每个参与者?相反,您将所有学生都保存在一行中???这不是一个好的做法,因为您已经知道如果所有用户都添加到一个字符串中,那么您应该为每个用户分别记录一个问题,因此多人同时向同一个字符串添加多个值是不可能的。 .!其中一些将丢失..!
-
您需要添加另一个表格,将参与者链接到日程安排,这不是将信息存储在数据库中的好方法,因为您将无法轻松搜索、过滤或加入信息。跨度>
-
您可以以某种方式这样做,每次用户添加时都会将其存储在新行中,然后在一天结束时您可以运行一个脚本,该脚本将删除上述所有行并将就留下最后一排吧……!
-
我知道一些提出问题的用户在设计上有缺陷,但是关于他提出的问题(如何创建各种队列),有人有答案吗?这适用于应用两个查询(1 个选择和 1 个更新查询)并且您需要在另一个用户可以执行相同操作之前连续发生这两个查询的许多情况,所以我确实认为这个问题对未来的读者很有价值。