我正在建立一个网站,人们可以在这个网站上选择他们想要的门票,他们只需要一张身份证就可以付费并将它们送到所需的位置。
我有一个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,它工作,除了我之前描述的实例。谁能让我知道如何避免这种情况?
答案 0 :(得分:1)
为每张故障单添加一个唯一ID。
插入 门票进入“保留”表。
在交易中执行此操作,所以全部 门票立刻提交。
放一个独特的 对票证id的约束 保留表。
如果您在插入过程中遇到错误,则其他人已经保留了其中一张故障单。
答案 1 :(得分:0)
PHP + MySQL transactions examples
使用交易。当你需要做多个无法并行完成的查询时,它们会让你的生活变得更轻松。
答案 2 :(得分:0)
执行此操作的正确方法是在seat / ticket列上设置带有unique
约束的数据库,然后在一个原子查询中插入新的预留。如果此席位已经存在预订,数据库会投诉,您可以在代码中处理该投诉。无法在数据库中插入两个相同的座位预订。选择所有记录并在你的应用程序中循环它们,对不起,很荒谬。
答案 3 :(得分:0)
如果担心如果同时保留相同的座位,您可以使用MySQL table locks。锁定时,没有其他人可以写入该表。这个过程看起来像这样:
这样可以防止故障单被保留两次,因为在解锁之前没有其他脚本可以访问该表(如果其他请求同时发生,则其他请求会“排队”)