php命令执行无法重定向输出,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;

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

Warning: Cannot modify header information - headers already sent by (output

started at /Applications/MAMP/htdocs/testygubbins/OO/test/header.php:15) in

/Applications/MAMP/htdocs/testygubbins/OO/test/form.php on line 16.

我完全被这个弄得晕头转向。 有谁知道我应该做些什么让它起作用?

编辑

header.php代码:

include('class.user.php');

include('class.Connection.php');

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

?>

Test

什么是header.php?

如果您已经发送了HTML输出,则无法重定向。 使用输出缓冲或用header.php中的PHP块替换'include"header.php"'。

也许header.php中存在问题,这就是为什么标头不能重定向。

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

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

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

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

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

Note: HTTP/1.1 requires an absolute

URI as argument to Location:

including the scheme, hostname and

absolute path, but some clients accept

relative URIs. You can usually use

$_SERVER['HTTP_HOST'],

$_SERVER['PHP_SELF'] and dirname() to

make an absolute URI from a relative

one yourself:

干杯伙计,这是空白。 好玩!

它不仅仅是空白,而是导致错误的PHP块之后的整个HTML输出。

这篇文章的编辑显示了这一点,其中包含html代码,即时发送给客户端。

老兄,这也是我的问题,我删除了空白和中提琴! 谢谢。

先生,非常感谢你。 当其他一切都失败了,你的回答让我的剧本变得生动。

常见问题:

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

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

3)在之前和?>标签之后删除任何空格(或换行符)。

4)检查php文件(以及其他.php文件,include d) -

它们应该没有BOM编码的UTF8(而不仅仅是UTF-8)。因为默认的UTF8在文件的开头添加了不可见的字符(称为"BOM"),所以你应该避免这样!!!!!!!!!!!

5)使用301或302参考:

header("location: http://example.com",  true,  301 );  exit;

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

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

echo"

出口; 或者死(); 为我做了

"在标题(...)之前应该没有输出(即回声...或HTML部分);命令"...保存我的一天,谢谢

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

编辑:

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

试试这个 :

**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;

请查看/Applications/MAMP/htdocs/testygubbins/OO/test/header.php第15行。

在那个位置,它会产生一些输出。修理它。 :)

第15行是空白的

无论是否为空白 - 也会输出换行符。

不要包含header.php。当您要重定向时,不应输出HTML。

制作一个新文件,例如。"pre.php"。把它放进去:

<?php

include('class.user.php');

include('class.Connection.php');

?>

然后在header.php中,包含它,而不是包括其他两个文件。

在form.php中,包括pre.php而不是header.php。

您可能在php文件中的某处有一些"纯文本",它被解释为脚本输出。它甚至可能是php脚本标记说明符之前或之后的换行符(小于+问号+"php")。

此外,如果我没记错的话,根据http规范,"Location"标题只接受完整的URL,而不接受相对位置。也要考虑到这一点。

如果我理解正确,已经从header.php(可能是一些HTML)发送了一些东西,所以标题已经设置好了。您可能需要重新检查header.php文件,以查找可能在第一个之前输出HTML或空格的任何部分

编辑:我现在确定它是由header.php引起的,因为你有那些HTML输出。您可以通过删除"include('header.php');"来解决此问题。并将以下代码复制到您的文件中。

include('class.user.php');

include('class.Connection.php');

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

也取出了html。 谢谢!:)

也尝试include_once()而不是include()也可以工作

您的include会产生输出,从而无法在以后发送http标头。两个选项:

在include之后将输出移动到某处。

使用输出缓冲,即在脚本的最开始,放置ob_start(),最后放入ob_flush()。这使PHP能够首先等待收集所有输出,确定以何种顺序呈现它并输出它。

我建议你学习第二个选项,因为它会让你更加灵活。

另请参阅您的php文件文本编码。我的UTF-8 BOM,它阻止了脚本工作。但是在删除BOM之后,现在可以完美地工作......

尝试使用JavaScript重定向:

window.location.href='index.php';

搜索引擎如何解释这个? 它肯定不能是301重定向,可以吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值