【问题标题】:Multiple queries with php code in mysqli one person at the timemysqli中的php代码多次查询一次一个人
【发布时间】: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 个更新查询)并且您需要在另一个用户可以执行相同操作之前连续发生这两个查询的许多情况,所以我确实认为这个问题对未来的读者很有价值。

标签: php mysql sql


【解决方案1】:

您的问题是一个很好的例子,说明了为什么人们应该始终学习数据库设计基础知识并始终遵循它们。

数据库中以分隔符分隔的字符串是致命的。出于多种原因,但我们对这种特殊情况很感兴趣。

如果您正确设计了数据库,将参与者添加到单独的行中,就不会出现任何问题。

因此,只需通过添加包含参与者的表格来更改您的设计,添加或删除任何数量的参与者都不会出现问题。

【讨论】:

    【解决方案2】:

    这是一种方法:

    理论解释:

    这样的事情可能会起作用。每次用户执行查询时,它都应该检查请求更新查询的时间。现在用户请求更新查询之间必须存在时间差。

    注意:仍然不能保证它会起作用,因为当您遇到互联网问题以及最初提交请求但遇到互联网问题的用户时,这就是他执行更新查询的原因在那段时间延迟,另一个用户来了,他发送更新查询的请求很晚,但他没有互联网连接问题,所以他的查询将在之前更新,我认为因此第一个用户查询将失败..!

    这是代码:

    <?php
    // You need to add another column for saving time of last query execution
    
    $current_time=time();
    $current_date=date("Y-m-d",$t);
    $query_execution_new_time = $current_time.":".$current_date;
    
    if (empty($row_schedule['query_execution_time'])) {
    $sql = $con->query("UPDATE schedule SET query_execution_time='{$query_execution_new_time}' where date='{$date}'");
    } else {
    $query_execution_time = explode(":",$row_schedule['query_execution_time']);
    if ($query_execution_time[0] < $current_time) {
    $con->query("UPDATE schedule SET participants='{$participants_new}' where date='{$date}'");
    $sql = $con->query("UPDATE schedule SET query_execution_time='{$query_execution_new_time}' where date='{$date}'");
    }
    }
    ?>
    

    【讨论】:

      【解决方案3】:

      试试这个

      无需先获取所有参与者然后更新。 只更新新的参与者用户。

      您可以将前一个结果保存在数据库列字段中。

      
      update schedule
       set participants = case when participants is null or participants ='' 
      
       then CONCAT(participants,'Fredrik') // assume Fredrik a new participant
       else CONCAT(participants,':','Fredrik')
       end
       where date='$date';
      

      这样,即使您同时有多个参与者,查询也不会在完全相同的时间运行,因此您最终会获得正确的用户。

      除非您拥有数百万用户,否则您无需担心多个用户点击它们

      【讨论】:

        猜你喜欢
        • 2014-11-12
        • 1970-01-01
        • 2019-04-08
        • 1970-01-01
        • 2017-10-22
        • 1970-01-01
        • 1970-01-01
        • 2013-08-09
        • 1970-01-01
        相关资源
        最近更新 更多