我写的非常非常简单!! php中的脚本。标头重定向不起作用。 1-编码:没有BOM的UTF-8 2-添加ob_start()问题就是问题。 我的代码有什么问题;
的login.php:
<?php session_start();
require_once("funcs.php");
db_connection();
$username = $_POST['username'];
$password = $_POST['pwd'];
$submit = $_POST['login'];
if($submit){
if (!filled_out($_POST)) {
echo "please fill all fields";
}
else{
$query = "SELECT * FROM *** WHERE username ='{$username}' AND password ='{$password}'";
$result = mysql_query($query);
if(mysql_num_rows($result) == 1){
$found_user = mysql_fetch_array($result);
$_SESSION['id'] = $found_user['id'];
$_SESSION['username'] = $found_user['username'];
$_SESSION['password'] = $found_user['password'];
setcookie(session_name(), '', time()+86400, '/');
header("Location: tst.php");
}
else{
echo "incorrect username or password";
}
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<form id="form1" name="form1" method="post" action="">
<p>
<label for="username">
Username:
</label>
<input type="text" name="username" id="username" />
</p>
<p>
<label for="textfield">
Password
</label>
<input type="password" name="pwd" id="pwd" />
</p>
<p>
<input name="login" type="submit" id="login" value="Log in" />
</p>
</form>
</body>
</html>
<?php
db_disconnect();
?>
和tst.php:
<?php session_start();
require_once("funcs.php");
if (!isset($_SESSION['id'])){
header("Location : login.php");
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<table id="structure">
<tr>
<td id="navigation"> </td>
<td id="page"><?php echo "welcome"."". $_SESSION['username']; ?></td>
</tr>
</table>
</body>
</html>
直接对tst.php进行操作,header()不会重定向到login.php
答案 0 :(得分:4)
尝试添加die():
header("Location: tst.php");
die();
您应该始终添加die(),因为位置标题只是对浏览器更改页面的请求。如果您没有die()
,页面的其余部分仍会到达浏览器,包括用户可能不会看到的敏感数据。
答案 1 :(得分:3)
尝试删除“位置”后的空格:
header("Location: login.php");
请注意我对正确格式化代码的评论,因为很难发现其他任何可能不对的问题。
答案 2 :(得分:2)
在打开<?php
标记之前检查空格。很难从这里的格式中判断出是否存在,但是在代码执行之前会发送空格,从而阻止标题。还要在包含文件中的任何结束标记后检查空格。 (更好的做法是完全省略结束标签)
旧回答
您正在使用setcookie()
来发送标头,然后尝试重定向。一旦发送标头,您就无法重定向。 (对不起,这是不正确的)
答案 3 :(得分:1)
标题不仅仅是一个php函数。它确实修改了http标头的一部分,所以不可能有一部分标题,然后是html数据,然后是另一个标题。为了使它工作,你应该在任何html输出完成之前将标题放在文件的开头。
答案 4 :(得分:1)
重定向可以采用相对或绝对URL。问题在于结肠前的空间。试试这样:
header("Location: whatever.php");
答案 5 :(得分:1)
我猜重定向有效,但你用空值覆盖Session-Cookie。所以tst.php创建一个新的空Session并重定向回login.php。
尝试:
// DELETE this line: setcookie(session_name(), '', time()+86400, '/');
header("Location: tst.php?".SID);
Importent:标头+会话总是需要SID才能失去会话!
更正:感谢@Pekka。
答案 6 :(得分:0)
与其他答案一样,Location:标题应包含绝对URL,示例标题(“Location:http://example.com/”);
答案 7 :(得分:0)
你需要在header函数之后放一个exit()或die() - 否则脚本的其余部分将继续执行。