我正在尝试在项目中成功重定向后显示一条消息,但找不到一个非常好的方法。现在我有一个非常简单但不太好的解决方案,看起来像这样:
// 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'>×</a>".$text."</div>";
}
它只是显示一个带有文字的小盒子。
无论如何,就像我说这是我现在的“简单”解决方案一样,它运行正常,但它不是最好的解决方案。我知道你应该放一个
die();
或
exit();
在header()之后,但我的问题是,当我将它们放在我的标题()下时,页面只是空白1.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
}
这将检查success
或error
的网址,然后在检测到内部运行代码块