当时在一个人的mysqli中使用php代码进行多次查询

时间:2016-04-28 10:16:19

标签: php mysql sql

这段代码有效,但问题是如果有几个人同时使用它会导致某些人不会注册的问题。所以我需要以一种方式重写它,即在下一个人的查询开始之前执行并完成每个人的所有查询。

首先,代码从数据库中读取,以获取到目前为止注册的所有人的字符串。

        $sql_s = $con -> query("select * from schedule where date='$date'");
$row_schedule = $sql_s->fetch_array(MYSQLI_BOTH);
        $participants = $row_schedule['participants'];

$参与者是一个看起来像“'Sara'的字符串:'Richard':'Greg'”

现在,当前用户(Fredrik)希望将其名称添加到字符串中,如此

$current_user='Fredrik';
$participants_new=add_participant($participants,$current_user);

add_participant是一个php函数,它将'Fredrik'添加到参与者字符串中。然后我想用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的查询?

3 个答案:

答案 0 :(得分:0)

这是一种方法:

理论解释:

这样的事情可以工作。每当用户执行查询时,它应该检查请求更新查询的时间。现在用户请求更新查询之间必须存在时间差异。

注意:仍然无法保证它会起作用,因为当您遇到互联网问题时,首先提交请求的用户会遇到互联网问题而且#39 ;为什么他的更新查询执行在此期间被延迟而另一个用户来了并且他发送了更新请求的延迟请求,但他没有互联网连接问题所以他的查询将在之前更新,因此我认为这样第一个用户查询会失败..!

以下是代码:

<?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}'");
}
}
?>

答案 1 :(得分:0)

您的问题是非常好的示例,说明为什么人们应该始终学习数据库设计基础并始终遵循它们。

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

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

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

答案 2 :(得分:-1)

试试这个

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

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


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';

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

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