PHP标头重定向无法正常工作

Dre*_*rew 23 php

include('header.php');

$name = $_POST['name'];
$score = $_POST['score'];
$dept = $_POST['dept'];

$MyDB->prep("INSERT INTO demo (`id`,`name`,`score`,`dept`, `date`) VALUES ('','$name','$score','$dept','$date')");
// Bind a value to our :id hook
// Produces: SELECT * FROM demo_table WHERE id = '23'
$MyDB->bind(':date', $date);
// Run the query
$MyDB->run();

header('Location:index.php');
    exit;
Run Code Online (Sandbox Code Playgroud)

上面的代码一直给我一个重定向问题.错误如下:

警告:无法修改标头信息 - 已在/ Applications/MAMP/htdocs/testygubbins/OO/test/form中发送的标头(在/Applications/MAMP/htdocs/testygubbins/OO/test/header.php:15处开始输出). php在第16行.

我完全被这个弄得晕头转向.有谁知道我应该做些什么来使它工作?

编辑

header.php代码:

<?php
include('class.user.php');
include('class.Connection.php');

$date = date('Y-m-j');

?>
<html>
<head>
    <link rel=StyleSheet href="css/style.css" type="text/css" media=screen>
    <title>Test</title>
</head>
<body>
<div id="page">
Run Code Online (Sandbox Code Playgroud)

Pau*_*xon 46

仔细查看您的包含 - 也许您在关闭后有一个空行?>?

这将导致一些文字空格作为输出发送,从而阻止您进行后续标题调用.

请注意,将关闭?>关闭包含文件是合法的,这是避免此问题的有用习惯用法.

(编辑:查看标题,如果要输出标题,则需要避免执行任何HTML输出,或使用输出缓冲来捕获它).

最后,正如标题PHP手册页指出的那样,您应该使用完整的URL来重定向:

注意:HTTP/1.1需要绝对URI作为Location的参数: 包括方案,主机名和绝对路径,但某些客户端接受相对URI.你通常可以使用$ _SERVER ['HTTP_HOST'],$ _SERVER ['PHP_SELF']和dirname()自己创建一个相对的URI:

  • 它不仅仅是空白,而是导致错误的PHP块之后的整个HTML输出. (2认同)

T.T*_*dua 28

常见问题:

1)命令echo...之前应该没有输出(即HTML部分)header(...);.

2)后,header(...);您必须使用exit();

3)删除任何空白(或换行之前)<?php和后?>标记.

4) 检查php文件(以及其他.php文件,即included) - 它们应该具有没有BOM编码的UTF8(而不仅仅是UTF-8).因为默认的UTF8在文件的开头添加了不可见的字符(称为" BOM "),所以你应该避免这样!!!!!!!!!!!

5)使用301或302参考:

header("location: http://example.com",  true,  301 );  exit;
Run Code Online (Sandbox Code Playgroud)

6) 打开错误报告.并告诉错误.

7)如果以上都没有帮助,使用JAVASCRIPT重定向(但是,不鼓励的方法),可能是自定义案例中的最后一次机会......:

echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;
Run Code Online (Sandbox Code Playgroud)


ya2*_*a23 8

或者,不要考虑文件中某处的换行符或空格,可以缓冲输出.基本上,您ob_start()在文件的最开始和ob_end_flush()最后调用.您可以在php.net ob-start功能描述中找到更多详细信息.

编辑: 如果使用缓冲,则可以在header()函数之前和之后输出HTML - 缓冲将忽略输出并仅返回重定向标头.


小智 5

试试这个 :

**ob_start();**

include('header.php');

$name = $_POST['name'];
$score = $_POST['score'];
$dept = $_POST['dept'];

$MyDB->prep("INSERT INTO demo (`id`,`name`,`score`,`dept`, `date`) VALUES ('','$name','$score','$dept','$date')");
// Bind a value to our :id hook
// Produces: SELECT * FROM demo_table WHERE id = '23'
$MyDB->bind(':date', $date);
// Run the query
$MyDB->run();

header('Location:index.php');

**ob_end_flush();**

    exit;
Run Code Online (Sandbox Code Playgroud)