如何在页面刷新时停止表单重新提交

时间:2013-04-20 作者:ameeromar

您好,我有一个表单,可以在帖子中添加附件,但是当表单发布时,它显然不会显示带有新附件的帖子,新附件回显“您的文件已上载”。当用户刷新页面(尝试显示新附件)时,表单将再次发布!

是否可以(1)在刷新时再次停止表单发布,(2)自动刷新页面以显示带有新附件的帖子??(2更好)

<?php $post_id = $post->ID;
if ( isset( $_POST[\'html-upload\'] ) && !empty( $_FILES ) ) {
require_once(ABSPATH . \'wp-admin/includes/admin.php\');
$id = media_handle_upload(\'async-upload\', $post_id); //post id of Client Files page
unset($_FILES);
if ( is_wp_error($id) ) {
    $errors[\'upload_error\'] = $id;
    $id = false;
}

if ($errors) {
    echo "<p>There was an error uploading your file.</p>";
} else {
    echo "<p>Your file has been uploaded.</p>";
}
}

?>
<form id="file-form" enctype="multipart/form-data" action="<?php echo $_SERVER[\'REQUEST_URI\']; ?>" method="POST">

<p id="async-upload-wrap"><label for="async-upload">upload</label>
<input type="file" id="async-upload" name="async-upload"> <input type="submit" value="Upload" name="html-upload"></p>

<p><input type="hidden" name="post_id" id="post_id" value="<?php echo $post_id ?>" />
<?php wp_nonce_field(\'client-file-upload\'); ?>
<input type="hidden" name="redirect_to" value="<?php echo $_SERVER[\'REQUEST_URI\']; ?>" /></p>

<p><input type="submit" value="Save all changes" name="save" style="display: none;"></p>
</form>
谢谢!:)

9 个回复
SO网友:fuxia

而不是…

} else {
    echo "<p>Your file has been uploaded.</p>";
}
…成功时重定向到其他地址:

} else {

    $new_url = add_query_arg( \'success\', 1, get_permalink() );
    wp_redirect( $new_url, 303 );
    exit;
}
Status code 303 triggers a GET request:

此方法主要用于允许后激活脚本的输出将用户代理重定向到选定的资源。新URI不是最初请求的资源的替代引用。不能缓存303响应,但可以缓存对第二个(重定向)请求的响应。

在表单处理程序中,首先检查$_GET[\'success\'] 设置,其值为1, 然后打印一条成功消息。访问者可以一次又一次地重新加载此页面,但不会发送任何内容。

SO网友:Jiwan

基本上,一般的想法是在表单提交后将用户重定向到其他页面,这将在页面刷新时停止表单重新提交,但是如果在表单提交后需要将用户保持在同一页面中,可以通过多种方式来实现。

Unset Form Data

在页面刷新时停止页面重新提交的一种方法是,在提交表单数据后将其取消设置,以便存储表单数据的变量变为空,并包装表单处理代码块以检查表单是否为空。

if(!empty($_POST) && $_SERVER[\'REQUEST_METHOD\'] == \'POST\'){
   $data = // processing codes here
   unset $data;
}
这将使$数据在处理后为空,并且第一个子句将在页面刷新时停止表单重新提交。

Javascript

此方法非常简单,在提交表单后,会阻止在刷新时要求重新提交表单的弹出窗口。只需将这行javascript代码放在文件的页脚,就可以看到它的神奇之处。

<script>
if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}
</script>

More on such queries you can visit this link.

SO网友:Hans Hokke

我也遇到了同样的问题,因为我将所有URL重定向到一个URL,所以问题变得“复杂”。php文件。事实证明,我所要做的就是在任何html写入页面之前插入以下代码。

<?php
if (isset($_POST[\'mypostvar\']) && isset($_SERVER[\'REQUEST_URI\']))
{
    [process the post data in \'mypostvar\']
    header (\'Location: \' . $_SERVER[\'REQUEST_URI\']);
    exit();
}
?>
这将在postdata按需要处理后重定向到同一页面。重定向后,原始postdata将消失,并且不会触发重新提交。只有在将任何内容写入页面之前插入函数“header()”才能工作。必须退出()。

在放置标头()之前,必须先处理post数据。

SO网友:Sunil

我使用template\\u重定向操作(在插件中或在themes functions.php文件中)解决了这个问题。

add_action(\'template_redirect\',\'myfunction\') ;

function myfunction() { 
  global $post;
  $post_id = $post->ID;
  if ( isset( $_POST[\'html-upload\'] ) && !empty( $_FILES ) ) {
     require_once(ABSPATH . \'wp-admin/includes/admin.php\');
     $id = media_handle_upload(\'async-upload\', $post_id); //post id of Client Files page
     unset($_FILES);
     if ( is_wp_error($id) ) {
        $errors[\'upload_error\'] = $id;
        $id = false;
    }

  }
  $error = ($errors) ? 1 : 0;
  wp_redirect( "/?p={$post_id}?errors={$error}",301);
}
然后在页面上检查错误

if ($_GET[\'errors\']) {
    echo "<p>There was an error uploading your file.</p>";
} else {
    echo "<p>Your file has been uploaded.</p>";
}
(我还没有测试这段代码……它应该给你一个很好的起点)。

SO网友:Jake

您还可以测试$_SERVER[\'REQUEST_METHOD\'] === \'POST\' 确保在处理表单之前已通过POST刷新页面。

if ( $_SERVER[\'REQUEST_METHOD\'] === \'POST\' )
{
   // Do Stuff
}

SO网友:timmac15

一种更简单的方法是从表单中删除操作,并隐藏操作,例如:

<html>
<form action="" method="post><input type="text" name="name" />
<input type="submit" value="Submit" />
<input type="hidden" name="action" value="Submit" />
</form>
</html>
让控制员检查表单的有效性和提交内容,以便检查表单是否已提交:

<?php 
if (isset($_POST[\'action\']) && $_POST[\'action\'] == \'Submit\'){
   //you should add code to validate user input here
   //if all ok submit the form
   header(\'Location: .\'); //redirects to the controller without resubmitting
}
?>
此方法对于在管理页面上添加或删除记录的脚本非常有用,因为它将在不重新提交的情况下重新加载页面,并且删除或添加的记录将被删除或添加到页面:)

SO网友:Ajith

我发现最好的方法是使用javascript和css。通用php重定向方法标头(\'位置:http://www.yourdomain.com/url); 将工作,但它会导致警告“警告:无法修改标题信息-标题已发送”在不同的框架和cms中,如wordpress、drupal等。因此,我的建议是遵循以下代码

echo \'<style>body{display:none;}</style>\'; 
echo \'<script>window.location.href = "http://www.siteurl.com/mysuccesspage";</script>\'; 
exit;
样式标记很重要,否则用户可能会觉得页面加载了两次。如果我们使用带有body display none的样式标记,然后刷新页面,那么用户体验将与php标题相同(\'位置:…..);

我希望这会有所帮助:)

SO网友:Paresh Sojitra

解决方案1:如果要在post类型中插入post,则只需使用rand() php函数,并在插入post时保存代码。在中也设置相同的代码$_POST[\'uniqueid\'] 变量

然后检查insert,如果当前唯一ID是否存在于帖子中,您可以使用wp_query().

解决方案2:使用javascript重定向到另一个页面。但请不要让用户返回页面,再次刷新时会保存帖子。对于这个问题,第一个解决方案是最好的。

解决方案3:使用ajax插入帖子,不会出现类似的问题。但如果你想要页面点击率。这不是一个好主意,可能对谷歌Adsense来说。

我只是想根据我的经验提供帮助。如果有人需要代码来解决问题,只需询问,我将与大家分享。

SO网友:rodgee

在php中实现这一点的简单方法。示例如下:

不要忘记html标记(此表单不允许在此使用,因此我使用[此])

$firstname = $post[firstname]

$lastname = $post[lastname]

[form action="here.php" method="post"]

first name[input type=\'firstname\' name=\'firstname\']

last name[input type=\'text\' name=\'lastname\']

[input type=submit value=submit]
[/form]

if($firstname==""||$lastname=="")
{

echo"the firstname and lastname are empty";

}
else
{

mysql_query("YOUR DATABASE INSERT HERE");

header("Location:here.php");

}
这是如何防止输入数据库的数据在页面刷新时两次发布相同的数据

结束