php中的header跳转常用方式

header("Location:")作为php的转向语句。其实在使用中,他有几点需要注意的地方。 1、要求header前没有任何输出 但是很多时候在header前我们已经输出了好多东西了,此时如果再次header的话,显然是出错的,在这里我们启用了一个ob的概念,ob的意思是在服务器端先存储有关输出,等待适当的时机再输出,而不是像现在这样运行一句,输出一句,发现header语句就只能报错了。 具体的语句有: ob_start(); ob_end_clean();ob_flush();......... 2、在header("Location:")后要及时exit 否则他是会继续执行的,虽然在浏览器端你看不到相应的数据出现,但是如果你进行抓包分析的话,你就会看到下面的语句也是在执行的。而且被输送到了浏览器客户端,只不过是没有被浏览器执行为html而已(浏览器执行了header进行了转向**作)。 所以,标准的使用方法是: ob_start(); ........ if ( something ){ ob_end_clean(); header("Location: yourlocation"); exit; else{ .......... ob_flush(); //可省略 要想在header前有输出的话,可以修改php.ini文件 output_handler =mb_output_handler 或 output_handler =on Output Control 函数可以让你**控制脚本中数据的输出。它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况。输出控制函数不对使用 header() 或 setcookie(), 发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用。 一、 相关函数简介: 1、Flush:刷新缓冲区的内容,输出。 函数格式:flush() 说明:这个函数经常使用,效率很高。 2、ob_start :打开输出缓冲区 函数格式:void ob_start(void) 说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。 3 、ob_get_contents :返回内部缓冲区的内容。 使用方法:string ob_get_contents(void) 说明:这个函数会返回当前缓冲区中的内容,如果输出缓冲区没有激活,则返回 FALSE 。 4、ob_get_length:返回内部缓冲区的长度。 使用方法:int ob_get_length(void) 说明:这个函数会返回当前缓冲区中的长度;和ob_get_contents一样,如果输出缓冲区没有激活。则返回 FALSE。 5、ob_end_flush :发送内部缓冲区的内容到浏览器,并且关闭输出缓冲区。 使用方法:void ob_end_flush(void) 说明:这个函数发送输出缓冲区的内容(如果有的话)。 6、ob_end_clean:删除内部缓冲区的内容,并且关闭内部缓冲区 使用方法:void ob_end_clean(void) 说明:这个函数不会输出内部缓冲区的内容而是把它删除! 7、ob_implicit_flush:打开或关闭绝对刷新 使用方法:void ob_implicit_flush ([int flag]) 说明:使用过Perl的人都知道$|=x的意义,这个字符串可以打开/关闭缓冲区,而ob_implicit_flush函数也和那个一样,默认为关闭缓冲区,打开绝对输出后,每个脚本输出都直接发送到浏览器,不再需要调用 flush() ob_start() 开始输出缓冲, 这时PHP停止输出, 在这以后的输出都被转到一个内部的缓冲里. ob_get_contents() 这个函数返回内部缓冲的内容. 这就等于把这些输出都变成了字符串. ob_get_ length() 返回内部缓冲的长度. ob_end_flush() 结束输出缓冲, 并输出缓冲里的内容. 在这以后的输出都是正常输出. ob_end_clean() 结束输出缓冲, 并扔掉缓冲里的内容. 举个例子, var_dump()函数输出一个变量的结构和内容, 这在调试的时候很有用. 但如果变量的内容里有 < , > 等HTML的特殊字符, 输出到网页里就看不见了. 怎么办呢? 用输出缓冲函数能很容易的解决这个问题. ob_start(); var_dump($var); $out = ob_get_contents(); ob_end_clean(); 这时var_dump()的输出已经存在 $out 里了. 你可以现在就输出: echo '<pre>' . htmlspecialchars($out) . '</pre>' ; 或者等到将来, 再或者把这个字符串送到模板(Template)里再输出.

原文发布于微信公众号 - 竹清助手(zhuqing_help)

原文发表时间:2015-06-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏swag code

XML文档树形结构图解

  3)<book>节点下有许多的子节点<title>、< author>、<year>、<price>

943
来自专栏二进制文集

Java 代码模拟死锁

983
来自专栏安恒网络空间安全讲武堂

Python编写渗透工具学习笔记一 | 0x08字典生成程序

0x08字典生成程序 这里主要用到了exrex模块,这个模块的主要功能是: 生成所有匹配的字符串 生成随机匹配的字符串 计算匹配字符串的数量 简化正则表达式 这...

2949
来自专栏Java编程

Java中volatile关键字的含义

在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。

5670
来自专栏海说

Class类文件的结构

  各种不同平台的虚拟机与所有平台都统一使用的程序存储格式---字节码(ByteCode)是构成平台无关性的基石。Class文件是一组以8位字节为基础单位的二进...

1890
来自专栏有趣的Python

py编程技巧-2.4-如何对迭代器做切片操作实现对于文本的切片操作?

实际案例 有某个人文本文件,我们想读取某范围的内容:如100-300行之间的内容 ,python中文本文件是一个可迭代对象,我们是否可以使用类似于列表切片 ...

2976
来自专栏二进制文集

Java 代码模拟死锁

1122
来自专栏java一日一条

如何防止单例模式被JAVA反射攻击

单例模式相信大家都知道,用过的人不在少数。之前写过一篇博文《singleton模式四种线程安全的实现》(参见:http://blog.csdn.NET/u013...

1283
来自专栏C/C++基础

C++构造函数体内赋值与初始化列表的区别

问题描述下: Linux环境运行,使用g++编译,贴上如下代码出错处已标注于代码中。 代码如下:

1002
来自专栏码云1024

c++ 文件操作详解

3596

扫码关注云+社区

领取腾讯云代金券