header("profil.php?id=" . $show["id"]);
我尝试做什么,但标题已经在顶部发送,那么如何重定向用户?我应该使用window.location.replace(“URL”); (javascript)而不是?
答案 0 :(得分:4)
如果你无法控制脚本的最开头,那里会发送标题,那么是的,你唯一的方法就是使用JavaScript。
另外,正确的语法是header('Location: profil.php?id=' . $show['id']);
您需要Location:
部分,以便浏览器知道它正在接收哪个标头。此外,请不要忘记在重定向后立即执行exit()
或die()
。
答案 1 :(得分:1)
如果我错了,有人会纠正我,但我认为您可以在页面开头使用ob_start()
,即使已经发送了标题,也可以通过PHP重定向。
答案 2 :(得分:1)
您应该重新设计您的应用程序,使其更加明智 它应该仅在必要时才开始输出,而不仅仅是每次调用此文件时。
您必须通过将每个脚本分成2个部分来修改所有代码。第一部分将包含所有数据操作,第二部分仅包含输出。将后者放入单独的文件(称为模板)会更好。因此你的个人资料php看起来像
include 'dbc.php';
//some code that sends headers, gets data etc
//after it's all done, call your template files
include 'top.php';
include 'profiles.tpl.php';
include 'bottom.php';
可能会有一些变化,但主要思路是相同的:将数据操作与数据表示分开。
答案 3 :(得分:0)
我认为你有两个选择
1)您尝试确保在执行代码之前不会设置标头。在您确定要向用户发送的内容之前设置标题会显示您的代码有点混乱,或者您在某种程度上受到限制。
2)您可以使用您的JavaScript解决方案。但是,我认为这是一个黑客,而不是一个合适的解决方案。试着弄清楚为什么你不能使用方法1的答案。
编辑:添加了一个代码示例
您的代码看起来应该是这样的
<?php
// perform logic to determine if you need to do the redirect or not.
// if you do need to redirect, set the following
$iNeedToRedirect = true;
// if you do not need to redirect, set the following
$iNeedToRedirect = false;
if ($iNeedToRedirect) {
header("Location: profil.php?id=" . $show["id"]");
die();
}
// if code gets here, carry on as normal
include("dbc.php");
include("top.php");
... etc etc etc
?>
答案 4 :(得分:0)
请记住,在发送任何实际输出之前,必须通过普通HTML标记,文件中的空行或PHP来调用header()。使用include()或require(),函数或其他文件访问函数读取代码是一个非常常见的错误,并且在调用header()之前输出空格或空行。使用单个PHP / HTML文件时存在同样的问题。
由于脚本输出,在您致电header()
之前会发送标头。您只需要追踪输出的来源。