PHP无序执行

时间:2015-08-10 20:14:38

标签: php mysql

我正在编写一个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(); 

1 个答案:

答案 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();
}