PHP - 重定向

时间:2018-02-07 08:07:32

标签: php redirect die

我正在尝试在项目中成功重定向后显示一条消息,但找不到一个非常好的方法。现在我有一个非常简单但不太好的解决方案,看起来像这样:

// Things happened:
$Alert = dangerMessage("Heyho, I am a message!");
header('refresh: 1.5 ; url = index.php');

我的dangerMessage是预定义Alertbox的简单回显:

function dangerMessage($text) {
    return "<div class='alert alert-danger alert-dismissable fade show mt-4'>
    <a href='#' class='close' data-dismiss='alert' aria-label='close'>&times;</a>".$text."</div>";
}

它只是显示一个带有文字的小盒子。

无论如何,就像我说这是我现在的“简单”解决方案一样,它运行正常,但它不是最好的解决方案。我知道你应该放一个

die();

exit();

在header()之后,但我的问题是,当我将它们放在我的标题()下时,页面只是空白1.5秒,重定向并显示没有消息框。

有没有办法让一个体面/良好的重定向也能显示我的信息?

感谢任何帮助过的人!

5 个答案:

答案 0 :(得分:4)

优雅而通用的方法是使用flash消息。这基本上是一次性会话条目,在一个请求中设置并在下一个请求中传递,然后立即删除。请考虑以下示例。

在重定向页面上,您可以在会话对象中设置Flash消息:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

在目标页面上,检查是否有Flash消息。如果是这样,输出并删除它。

$_SESSION["flash"] = ["type" => "success", "message" => "You are great!"];

注意:该示例假定您已经在使用PHP会话。如果没有,您必须先start the session

答案 1 :(得分:1)

我建议您使用会话来显示您的消息。 $_GET的问题在于,由于您依赖URL,任何人都可以不断操纵正在显示的消息。

在调用header()之前,将成功或失败的消息保存到会话变量。例如

$_SESSION['success'] = 'Data Saved to Database';

在索引页面上,检查会话密钥echo,然后将其从会话数组中删除。

if(!empty($_SESSION['success'])){
  echo $_SESSION['success'];
 unset($_SESSION['success']);//so you do not have to display it over and over again
}

答案 2 :(得分:0)

为什么不使用延迟的JavaScript重定向?

<?php echo dangerMessage("Heyho, I am a message!"); ?>
<script type="text/javascript">
    $(document).ready(function() {
        var target = 'index.php';
        setTimeout(function() {
            location.replace(target);
        }, 1500);
    });
</script>

以上代码将显示您的警报消息,然后在有效加载后1.5秒重定向页面。它使用jQuery,但很容易适应原生JS。

答案 3 :(得分:0)

我喜欢带有sessionStorage的解决方案。这完全是客户端,但是在使用现代浏览器时可以正常工作。

准备好下一页的文字时:

<script>
sessionStorage.setItem("my_report", <?php echo json_encode( $whatever_you_want_to_say ); ?> );
</script>

然后重定向。在脚本的顶部,您将重定向到,获取消息并对其进行处理,例如:

<script>
var msg = sessionStorage.getItem("my_report");
if( msg ){
    document.write( msg );
    sessionStorage.removeItem("my_report");
}
</script>

PHP header()在这种情况下将不起作用。必须先调用header()函数,然后才能将任何实际输出发送到浏览器。但是,由于魔术发生在客户端,因此您需要将输出发送到浏览器。因此,您将需要JavaScript重定向,例如

window.location = "?<?php echo $_SERVER['QUERY_STRING']; ?>";

答案 4 :(得分:-1)

一种方法是使用$_GET的强大功能,首先将header()修改为以下内容:

header('refresh: 1.5 ; url = index.php?success'); //or whatever you want to put after ?
exit;

然后在index.php中,输入以下内容:

if(isset($_GET['success'])){
    //display your message here
}
if(isset($_GET['error'])){
    //display your message here
}

这将检查successerror的网址,然后在检测到内部运行代码块