我正在编写一个PHP脚本,看起来我遇到了乱序执行的问题。我有一个for循环,它检查表中是否存在记录,并在其后面插入一个插入。想法是在for循环找到现有记录时保持插入不发生。但是,当我运行以下脚本时,似乎我的插入语句在期间或之前执行 for循环,因为我仍然在获取记录插入即使reservations
中存在应该暂停执行的匹配记录,也会进入reservedTickets
。处理这个问题的最佳方法是什么?
PHP:
for ($i=1; $i<=$_POST['numTickets']; $i++)
{
$checkTID = $_POST["tid".$i];
if (mysql_fetch_assoc(mysql_query("SELECT EXISTS(SELECT 1 FROM reservedTickets WHERE tid=".$checkTID.") AS 'exists';"))['exists'] == 1)
{
header("Location: http://10.12.76.201/reservations/");
}
}
mysql_query("INSERT INTO reservations (aid, approval) VALUES (".$_POST['aid'].", 0);");
$reservationID = mysql_insert_id();
答案 0 :(得分:3)
在循环之后执行,因为单独调用header()
函数不会停止执行。相反,它告诉PHP在请求完成时附加响应头但不会阻止其下面的任何代码运行。
您应该使用以下结构之一:
for ($i=1; $i<=$_POST['numTickets']; $i++)
{
$checkTID = $_POST["tid".$i];
if (mysql_fetch_assoc(mysql_query("SELECT EXISTS(SELECT 1 FROM reservedTickets WHERE tid=".$checkTID.") AS 'exists';"))['exists'] == 1)
{
header("Location: http://10.12.76.201/reservations/");
exit; // STOP script execution, and send the header
}
}
或
$found = false;
for ($i=1; $i<=$_POST['numTickets']; $i++)
{
$checkTID = $_POST["tid".$i];
if (mysql_fetch_assoc(mysql_query("SELECT EXISTS(SELECT 1 FROM reservedTickets WHERE tid=".$checkTID.") AS 'exists';"))['exists'] == 1)
{
$found = true;
break; // exit the for loop
}
}
if (!$found) {
mysql_query("INSERT INTO reservations (aid, approval) VALUES (".$_POST['aid'].", 0);");
$reservationID = mysql_insert_id();
}