我正在编写一个 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();
最佳答案
执行发生在循环之后,因为调用 header()
函数本身不会停止执行。相反,它告诉 PHP 在请求完成时附加该响应 header ,但不会阻止其下面的任何代码运行。
您应该使用以下结构之一:
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();
}
关于PHP乱序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31928332/