【问题标题】:PHP echo redirectPHP 回显重定向
【发布时间】:2015-08-13 12:33:04
【问题描述】:

我想在提交表单后在帖子中回显某些内容,然后重定向标题以取消双重提交问题。目前,Output_buffering 打开以允许重定向工作。这里有一些说明问题的示例代码。只需确保在 php.ini 中打开 Output_buffering。

<?php
   if(isset($_POST['submit'])){
   echo "hi";
}

   if (count($_POST) {
    header("Location: ".$_SERVER['REQUEST_URI']);
    exit();
    }
?>

<form action="<?php echo htmlentities($_SERVER['REQUEST_URI']); ?>" method="POST" name="edit" >
    <button type="submit" value="submit" name="submit">edit</button>
</form>

【问题讨论】:

  • 解决方法不是很适用。
  • 标头发送后无法输出。这意味着您必须从 HTML/Javascript 执行重定向。它看起来像 Rocky 从相同的答案复制粘贴 HTML 方式,这里是 JS 方式。为什么你认为这些不适用?
  • 对不起,下一个解释更早。我们正在重定向标头以防止用户在刷新时进行双重提交。我们希望显示回声,因此将其重定向回自身将删除回声。

标签: php


【解决方案1】:

你应该颠倒顺序。

提交时:

  1. 处理您的提交表单。
  2. 将所需的输出消息推送到您的会话中。
  3. 重定向到任何/消息页面。

在消息页面显示:

  1. 检索消息,推送到会话。
  2. 清理会话记录。
  3. 显示消息。

它可以是单独的页面、相同的页面、提交的页面或任何其他页面。

或者…… 使用 JavaScript 和 AJAX 完成工作:

<?php
    if(isset($_POST['submit'])) {
        ...
        if (/all is ok/)
            die(json_encode(array('status' => 'ok', 'message' => 'Hi!')));
        else {
            die(json_encode(array('status' => 'err', 'message' => 'I\'m failed!')));
        }
    }
?>

<form action="<?php echo htmlentities($_SERVER['REQUEST_URI']); ?>" method="POST" name="edit" >
    <button type="submit" value="submit" name="submit">edit</button>
</form>
<script language="javascript">
  $('form').submit(function() {
      var parameters = ...; // collect parameters from form
      $.getJSON('/url-to-script', parameters)
       .success(function(response) {
           if (response.message == "ok")
               alert(response.message);
           else
               alert('Can\'t process input:\n' + response.message);
       })
       .error(function(response) {
           alert('What a terrible failure!');
       });
  });
</script>

当 .success() 触发时 - 您可以通过警报/自定义模式消息框向用户显示提供的消息,然后进行重定向 (document.location = '&lt;?php echo ... ?&gt;') 或用一些自定义消息和链接/按钮替换页面上的表单以继续.. . 很多变种。

【讨论】:

    【解决方案2】:

    标头必须在之前发送任何内容(echo 提供的内容)。

    您可以将您的消息存储到session 并在下次请求时打印(这将是您的后续重定向)。

    示例:

    sessions_init.php

    <?php 
    session_start();
    

    post.php

    <?php
    include_once 'sessions_init.php';
    // assuming POST succeeded, data is valid, etc
    $_SESSION['messages'][] = 'You have been redirected';
    
    header("Location: ".$_SERVER['REQUEST_URI']);
    exit();
    

    html模板:

    include_once 'sessions_init.php';
    // print HTML:
    // <html><head>...</head><body>...
    
    foreach($_SESSION['messages'] as $message) {
       print($message);
    }
    
    // some other content </body></html>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      • 2013-07-24
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 2013-07-10
      相关资源
      最近更新 更多