制作预订门票的网站时,如何确保不会发生重复?

时间:2010-11-18 01:48:08

标签: php

我正在建立一个网站,人们可以在这个网站上选择他们想要的门票,他们只需要一张身份证就可以付费并将它们送到所需的位置。

我有一个PHP函数实际检查门票是否已经预订,然后才允许人们保留它们,但我发现如果2个人碰巧在同一秒内点击“预订”按钮,我的系统保留两次。

有没有办法防止这种情况发生?我目前的代码运行良好,除了我所说的,它就在这里:

$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++;
                }
            }

这将从数据库中获取已预订(apartados)和付费(pagados)然后检查重复的座位试图获得预订(repetidos)之后,如果只是寻找repetidos&gt; 0,它工作,除了我之前描述的实例。谁能让我知道如何避免这种情况?

4 个答案:

答案 0 :(得分:1)

  • 为每张故障单添加一个唯一ID。

  • 插入 门票进入“保留”表。

  • 在交易中执行此操作,所以全部 门票立刻提交。

  • 放一个独特的 对票证id的约束 保留表。

如果您在插入过程中遇到错误,则其他人已经保留了其中一张故障单。

答案 1 :(得分:0)

PHP + MySQL transactions examples

使用交易。当你需要做多个无法并行完成的查询时,它们会让你的生活变得更轻松。

答案 2 :(得分:0)

执行此操作的正确方法是在seat / ticket列上设置带有unique约束的数据库,然后在一个原子查询中插入新的预留。如果此席位已经存在预订,数据库会投诉,您可以在代码中处理该投诉。无法在数据库中插入两个相同的座位预订。选择所有记录并在你的应用程序中循环它们,对不起,很荒谬。

答案 3 :(得分:0)

如果担心如果同时保留相同的座位,您可以使用MySQL table locks。锁定时,没有其他人可以写入该表。这个过程看起来像这样:

  • 锁定表
  • 检查座位是否可用
  • 为此用户预留座位(如果可用)或如果不是则返回错误
  • 解锁表

这样可以防止故障单被保留两次,因为在解锁之前没有其他脚本可以访问该表(如果其他请求同时发生,则其他请求会“排队”)