Php 我如何确保在制作预先订购门票的站点时不会出现重复?
我正在制作一个网站,人们可以在其中选择他们想要的车票,他们只需要获得一个ID就可以去付款,然后把它们拿到想要的位置 我有一个PHP函数,在允许人们预订车票之前检查车票是否已经预订,但我刚刚发现,如果两个人在同一秒钟内点击“预订”按钮,我的系统会两次预订车票 有没有办法防止这种情况?我当前的代码运行良好,除了我所说的以外,如下所示:Php 我如何确保在制作预先订购门票的站点时不会出现重复?,php,Php,我正在制作一个网站,人们可以在其中选择他们想要的车票,他们只需要获得一个ID就可以去付款,然后把它们拿到想要的位置 我有一个PHP函数,在允许人们预订车票之前检查车票是否已经预订,但我刚刚发现,如果两个人在同一秒钟内点击“预订”按钮,我的系统会两次预订车票 有没有办法防止这种情况?我当前的代码运行良好,除了我所说的以外,如下所示: $f1=""; $f2=""; $sqlAP="SELECT * FROM apartados"; if ($res
$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约束
预订的桌子
如果在插入过程中出现错误,则表示其他人已经预订了其中一张票。正确的方法是在座位/票列上使用唯一的约束设计数据库,然后在一个原子查询中插入新的预订。如果此座位已有预订,数据库将投诉,您可以在代码中处理投诉。无法将两个相同的座位预订插入数据库。抱歉,在应用程序中选择所有记录并循环使用这些记录是荒谬的。如果担心相同的座位将在同一时间被预订,您可以使用。锁定后,其他人无法写入该表。该过程如下所示:
- 锁台
- 检查是否有座位
- 为该用户保留座位(如果可用),否则返回错误
- 解锁表
这将防止保留两次票证,因为在解锁之前,没有其他脚本可以访问该表(如果同时发生其他请求,则会“排队”)