如果页面已经打开一段时间,PHP表单只会刷新

时间:2018-03-06 01:52:31

标签: php forms centos7 vps http-status-code-302

这是一个奇怪的,我真的需要帮助搞清楚!我们为所有网站使用CentOS VPS,如果这有所不同的话。我们的业务为企业制作自定义Web应用程序,有时这些应用程序在提交表单之前保持打开状态超过30分钟。

我们遇到的问题是,如果表格暂时打开(我不知道确切的时间,但它已经超过20分钟,我确定)当您提交表单时,它只会刷新页面并且不会发送任何数据等。点击刷新并不会要求您重新提交表单数据或类似的内容。

以下是表单的代码:

<form action="/workorder/edit/" method="post">
    <div class="col-md-12 padded-sm">
        <label>Notes:</label>
        <textarea name="notes" class="form-control" required></textarea>
    </div>
    <div class="col-md-12 padded-sm">
        <label>Choose Hourly Rate:</label><br>
        <div class="radio radio-success">
            <input type="radio" name="rate" value="standard" id="checkoutrate-standard">
            <label for="checkoutrate-standard">Standard</label>
        </div>
        <div class="radio radio-success">
            <input type="radio" name="rate" value="overtime before 8" id="checkoutrate-otbefore8">
            <label for="checkoutrate-otbefore8">Overtime Before 8pm</label>
        </div>
         <div class="radio radio-success">
            <input type="radio" name="rate" value="overtime after 8" id="checkoutrate-otafter8">
            <label for="checkoutrate-otafter8">Overtime After 8pm</label>
        </div>
    </div>
    <div class="col-md-12 padded-sm text-right">
        <input type="submit" name="checkoutsubmit" class="btn btn-success" value="End Time">
    </div>
</form>

这是在提交表单时运行的简单PHP代码:

$checkoutsubmit = $_POST['checkoutsubmit'];
if($checkoutsubmit):
    $checkinid = val_db($_POST['checkinid']);
    $notes = val_db($_POST['notes']);
    $rate = val_db($_POST['rate']);
    $sql = "UPDATE workorders_labor SET userid='$userid',endtime='$time',notes='$notes',rate='$rate' WHERE id='$checkinid'";
    $db->query($sql) or die($db->error);
    $_SESSION['success'] = "You have successfully checked out of the job.";
    redirect("/workorders/edit/");
endif;

我99%确定代码没有问题,因为当您加载页面,填写表单并提交时,它可以正常工作。但是如果你加载页面,让它静置一段时间,然后填写该表单并提交它只是刷新页面。

我只能重复几次这个问题,但我的一位客户一直都有这个问题。

值得注意:

我看不到PHP的错误。没有数据库错误。 $_SESSION['success']没有成功消息。看起来它看起来根本就没有发送数据。

我最近将这些客户从GoDaddy VPS转移到另一个VPS提供商。相同版本的PHP,相同版本的CentOS ......据我所知,所有的Apache设置都是一样的(但它可能不是我们不能而且我只是不寻找合适的人。)

如果页面在提交表单之前保持打开一段时间,也会发生这种情况。加载页面并在几分钟后提交表格没问题。让页面静置30分钟,刷新它然后填写表格并提交是好的。让页面静置30分钟然后填写表单而不做任何其他事情,它只是刷新页面。

有问题的客户正在使用iPad,我们已经能够在我们的Macbook上重现......这可能是Apple相关的问题吗?但似乎在Macbook上发生了Chrome或Safari。

更新

在开发者工具中Chrome浏览器的“网络”标签的评论中使用建议后,现在发生了什么:

您加载页面并获得200 OK状态。 让表格坐30分钟,然后提交表格。 获得302临时重定向状态&amp;自动返回200 OK状态的同一页面。

Chrome的“网络”标签基本上显示了这一点:

  • / workorders / edit 200 OK - 初始加载
  • - 所有JS,css等 -
  • / workorders / edit 302提交表单后的临时重定向 -
  • / workorders / edit 200 OK - 在302错误后立即
  • - 所有JS,css等 -

如果我不让表格暂停一段时间(在我的测试用例中约30分钟),则在初始加载时返回200,在提交表单时返回200,然后当表单完成处理并重定向时,它会给出200再次。

更新#2

根据评论中的建议,我在Chrome的开发者工具中复制了来自302响应的Curl请求,并从Postman发送了Curl请求。我尝试了三次 - 一次等待几分钟,一次等待30分钟,再一次等待30分钟,所有三次返回200 OK并发布数据。它似乎发送为Curl不返回302.

更新#3

虽然我没有修复这个问题,但我确实找到了一种方法来避免它发生,而我试图弄清楚根本原因是什么。这可能有助于诊断发生了什么。我认为它可能在服务器端,因为这与实际的PHP代码没有任何关系。

为了解决这个问题,我使用jQuery&#39; $.get(url,function(data){})功能的页面只是拍摄到我称为session_keep_alive.php的空白页面。我每隔5分钟就有一段时间来获取该页面。当它运行时问题永远不会发生在表格中(至少在测试3次/1.5小时后......如果我在提交表格前等待30分钟,我可以100%的时间重现问题)。

所以我只能假设它可能是服务器端的东西而不是PHP代码。就像服务器在会话已经持续30分钟左右时强制302一样。与上述解决方法相比,有关永久修复的任何想法?

0 个答案:

没有答案