Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我如何确保在制作预先订购门票的站点时不会出现重复?_Php - Fatal编程技术网

Php 我如何确保在制作预先订购门票的站点时不会出现重复?

Php 我如何确保在制作预先订购门票的站点时不会出现重复?,php,Php,我正在制作一个网站,人们可以在其中选择他们想要的车票,他们只需要获得一个ID就可以去付款,然后把它们拿到想要的位置 我有一个PHP函数,在允许人们预订车票之前检查车票是否已经预订,但我刚刚发现,如果两个人在同一秒钟内点击“预订”按钮,我的系统会两次预订车票 有没有办法防止这种情况?我当前的代码运行良好,除了我所说的以外,如下所示: $f1=""; $f2=""; $sqlAP="SELECT * FROM apartados"; if ($res

我正在制作一个网站,人们可以在其中选择他们想要的车票,他们只需要获得一个ID就可以去付款,然后把它们拿到想要的位置

我有一个PHP函数,在允许人们预订车票之前检查车票是否已经预订,但我刚刚发现,如果两个人在同一秒钟内点击“预订”按钮,我的系统会两次预订车票

有没有办法防止这种情况?我当前的代码运行良好,除了我所说的以外,如下所示:

$f1="";
    $f2="";

    $sqlAP="SELECT * FROM apartados";
                if ($resultAP = mysql_query($sqlAP)) {
                    while ($rowAP = mysql_fetch_array($resultApP)) {
                        $f = $rowAP['funcion'];
                        $lugar=$rowAP['lugar'];
                        $count++;
                            if($f=="F1"){
                            $f1.=($lugar. " ");
                            }else if($f=="F2"){
                            $f2.=($lugar. " ");
                            }

                    }
                }
            $sqlPag2="SELECT * FROM pagados";

                if ($resultPag2 = mysql_query($sqlPag2)) {
                    while ($rowPag2 = mysql_fetch_array($resultPag2)) {
                        $f = $rowPag2['funcion'];
                        $lugar=$rowPag2['lugar'];
                        $count++;
                        if($f=="F1"){
                            $f1.=($lugar. " ");
                            }else if($f=="F2"){
                            $f2.=($lugar. " ");
                            }
                    }
                }
            $func1= explode(" ",$f1);
            $func2= explode(" ",$f2);
        $repetidos=0;

        for($int=0;$int<$cant;$int++){
            $helper=0;
            while($func1[$helper]){
                if($func1[$helper]==$lugar[$cant]){
                    $repetidos++;       
                    }
                $helper++;
                }
            }
        for($int=0;$int<$cant2;$int++){
            $helper=0;
            while($func2[$helper]){
                if($func2[$helper]==$lugar2[$cant2]){
                    $repetidos++;       
                    }
                $helper++;
                }
            }
$f1=”“;
$f2=“”;
$sqlAP=“从apartados选择*”;
if($resultAP=mysql\u查询($sqlAP)){
while($rowAP=mysql\u fetch\u数组($resultap)){
$f=$rowAP['funcion'];
$lugar=$rowAP['lugar'];
$count++;
如果($f==“F1”){
$f1.=($lugar。“”);
}否则如果($f==“F2”){
$f2.=($lugar“”);
}
}
}
$sqlPag2=“从pagados中选择*”;
if($resultPag2=mysql\u查询($sqlPag2)){
while($rowPag2=mysql\u fetch\u数组($resultPag2)){
$f=$rowPag2['funcion'];
$lugar=$rowPag2['lugar'];
$count++;
如果($f==“F1”){
$f1.=($lugar。“”);
}否则如果($f==“F2”){
$f2.=($lugar“”);
}
}
}
$func1=分解(“,$f1);
$func2=分解(“,$f2);
$repetidos=0;
对于($int=0;$int

使用事务。当您需要执行无法并行执行的多个查询时,事务将使您的生活更加轻松。

  • 给每张票一个唯一的id

  • 插入 把票放进“预订”的桌子上

  • 在事务中执行此操作,因此所有 票马上就到

  • 放一个独特的 中的票证id约束 预订的桌子


如果在插入过程中出现错误,则表示其他人已经预订了其中一张票。

正确的方法是在座位/票列上使用
唯一的
约束设计数据库,然后在一个原子查询中插入新的预订。如果此座位已有预订,数据库将投诉,您可以在代码中处理投诉。无法将两个相同的座位预订插入数据库。抱歉,在应用程序中选择所有记录并循环使用这些记录是荒谬的。

如果担心相同的座位将在同一时间被预订,您可以使用。锁定后,其他人无法写入该表。该过程如下所示:

  • 锁台
  • 检查是否有座位
  • 为该用户保留座位(如果可用),否则返回错误
  • 解锁表
这将防止保留两次票证,因为在解锁之前,没有其他脚本可以访问该表(如果同时发生其他请求,则会“排队”)