【问题标题】:"Double Load" Issue with PHP isset() and $_POST dataPHP isset() 和 $_POST 数据的“双重加载”问题
【发布时间】:2016-05-18 11:25:43
【问题描述】:

我知道使用 isset()、$_POST 和 $_GET 的组合我做错了,但我想知道解决我的问题的最简单和轻松的方法是什么。

当我提交 HTML 表单时会出现问题...它会重新加载包含发布数据的页面。我使用 php isset() 函数捕获提交,处理 $_POST 数据,然后运行 ​​window.location 以使用一些 $_GET 数据刷新页面。

例如...

//example.php
...

<form action="" method="post">

  <input name="stage1name" type="text" class="textfield" size="22" value="<?php echo $ClaimRow['ClaimantName']; ?>">
  <input name="VehicleEngine" type="text" class="textfield" size="20" value="<?php echo $vehiclerow['VehicleEngine']; ?>">
  <input name="VehicleFuel" type="text" class="textfield" size="20" value="<?php echo $vehiclerow['VehicleFuel']; ?>">

  <input name="submitInfo" type="submit" value="<?php echo $LANG_Claims_Change_Info; ?>" />

</form>

...
<?php  

    if (isset($_POST['submitInfo']))
    { 
        $stage1name= mysqli_real_escape_string($db, $_POST['stage1name']);
        $VehicleEngine= mysqli_real_escape_string($db, $_POST['VehicleEngine']);
        $VehicleFuel= mysqli_real_escape_string($db, $_POST['VehicleFuel']);
        mysqli_query($db, "DO SOME COOL SQL HERE");

        //I've done what I need to do so lets reload the page with the updated data

        echo "<script>window.location='example.php?vehicle=" . $vehicleID . "&claimTab=Personal'</script>";

    }
?>

就像我之前说的,这种方法效果很好,但是用户得到了“双重负荷”的效果,并且非常容易诱发癫痫。

任何想法如何最好地解决这个问题?

谢谢

编辑 - 附加示例

我意识到这个例子可能没有完全的意义,所以我把另一个例子放在一起,希望可以。

...

<form action="" method="post">  
    <select name="addresstype[]" id="multiselectfrom" onchange='this.form.submit();' size="9" style="width:110px; text-align:center;">
        <option style="<?php if ($AddType == 'Claimant') { echo'background-color:#9AD3F1 !important;'; } ?>" value="Claimant"><?php echo $LANG_Claims_Claimant; ?></option>
        <option style="<?php if ($AddType == 'Vehicle') { echo'background-color:#9AD3F1 !important;'; } ?>" value="Vehicle"><?php echo $LANG_Claims_Vehicle; ?></option>
        <option style="<?php if ($AddType == 'Repairer') { echo'background-color:#9AD3F1 !important;'; } ?>" value="Repairer"><?php echo $LANG_Claims_Repairer; ?></option>
        <option style="<?php if ($AddType == 'Insurer') { echo'background-color:#9AD3F1 !important;'; } ?>" value="Insurer"><?php echo $LANG_Claims_Insurer; ?></option>
        <option style="<?php if ($AddType == 'Fleet') { echo'background-color:#9AD3F1 !important;'; } ?>" value="Fleet"><?php echo $LANG_Claims_Fleet; ?></option>
    </select>
</form>

...

<?php
    if (isset($_POST['addresstype']))
    { 
        foreach ($_POST['addresstype'] as $addresstype) {
            $addresstype2 = $addresstype;
        }
        echo "<script>window.location='claims.php?claimID=" . $claim . "&claimTab=Addresses&AddressType=" . $addresstype2 . "'</script>";
    }
?>

上面的例子应该是获取表单的结果,并根据表单结果更改 window.location。它确实有效,但是这样做会加载页面两次。

【问题讨论】:

  • header('Location: example.php?vehicle=' . $vehicleID . '&amp;claimTab=Personal'); 然后die();
  • 您再次在同一页面上发送数据example.php,我没有看到以查询字符串的形式在参数中发送值的任何用途。
  • 添加 die();在 window.location 之后没有做任何事情,因为它已经自我杀死了。 A-2-A 我相信我的例子不是一个很好的例子。我将发布另一个示例,也许它会更有意义。
  • 为什么不使用 ajax jquery ?
  • 你能举个例子吗?我将 ajax 用于一些表格内容,但我不是 100% 使用 ajax。

标签: php html forms post isset


【解决方案1】:

经过多次测试。事实证明,CMorriesy 是正确的。但是,为了将来参考,您需要在 php.ini 中打开 output_buffering = on 并将 &lt;?php ob_start(); ?&gt; 添加到代码的第一行。

header('Location: example.php?vehicle=' . $vehicleID . '&amp;claimTab=Personal'); die();

【讨论】:

    【解决方案2】:

    替换:

    echo "<script>window.location='example.php?vehicle=" . $vehicleID . "&claimTab=Personal'</script>";
    

    与:

    echo "<META HTTP-EQUIV = 'Refresh' Content = '0; URL =example.php?vehicle=" . $vehicleID . "&claimTab=Personal'>";
    

    【讨论】:

    • 不幸的是不起作用。在适用的情况下,它仍然“双重加载”,并且在我尝试传递表单结果的情况下,即在附加示例中它没有传递额外的值,它只是刷新。
    猜你喜欢
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    相关资源
    最近更新 更多