彻底杜绝PHP的session,cookie,Cannot modify header错误
作者:骆驼 日期:2006-10-12 07:22
本文讨论的是如何彻底杜绝warning: Cannot add header information - headers already sent in...... 这种令人莫明其妙的的错误。
只要你写过PHP代码,相信都遇上过这个大多时候都令人莫明其妙的warning吧..今天我们就来搞定它...............
看了PHP手册,回答如下:
消息“Warning: Cannot send session cookie - headers already sent...”或者“Cannot add/modify header information - headers already sent...”。
函数 header(),setcookie() 和 session 函数需要在输出流中增加头信息。但是头信息只能在其它任何输出内容之前发送。在使用这些函数前不能有任何(如 HTML)的输出。函数 headers_sent() 能够检查您的脚本是否已经发送了头信息。请参阅“输出控制函数”。
意思是:不要在使用上面的函数前有任何文字,空行,回车,空格等。但。。。问题是,这答案并不令人满意。因为往往程序在其他PHP环境下运行却正常。
首先:这错误是怎么产生的呢?让我们来看看PHP是如何处理HTTP header输出和主体输出的。
PHP脚本开始执行时,它可以同时发送header(标题)信息和主体信息。 Header信息(来自 header() 或 SetCookie() 函数)并不会立即发送,相反,它被保存到一个列表中。 这样就可以允许你修改标题信息,包括缺省的标题(例如 Content-Type 标题)。但是,一旦脚本发送了任何非标题的输出(例如,使用 HTML 或 print() 调用),那么PHP就必须先发送完所有的Header,然后终止 HTTP header。而后继续发送主体数据。从这时开始,任何添加或修改Header信息的试图都是不允许的,并会发送上述的错误消息之一。
好!那我们来解决它:
web2.0中流行的设计元素:颜色
作者:骆驼 日期:2006-10-07 07:20
★淡淡的浅色系及延伸应用
此类颜色似乎最早被应用在一些文档处理软件比如word,和操作系统里(比如MacOSX)用于分类归档,标记,或者突出显示使用.此类颜色给人的感觉很环保,不伤眼睛,而且对比度恰到好处,既可以有效区分,又不会显的太过突兀.
google,Yahoo更为成熟的运用了这些颜色.MSN在新版网站中也设置了Simple White主题选择,并且新的LIVE系列产品更是对那种淡淡的兰色与1PX线条情有独忠~另外一些新兴的WEB-base办公软件也大量选用了此类颜色!事实证明,这些颜色的运用取得了大部分用户的认可并领导了趋势!
例子:GMail,yahoo360,live.com,start.com,netvibes,rember the milk
MySQL加速动态网站之MySQL 索引分析和优化
作者:骆驼 日期:2006-09-27 02:42
索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。
假设我们创建了一个名为people的表:
CREATE TABLE people ( peopleid SMALLINT NOT NULL, name CHAR(50) NOT NULL );
然后,我们完全随机把1000个不同name值插入到people表。下图显示了people表所在数据文件的一小部分:
可以看到,在数据文件中name列没有任何明确的次序。如果我们创建了name列的索引,MySQL将在索引中排序name列:
MySQLi vs MySQL
作者:骆驼 日期:2006-09-25 07:21
Background
Between participating in a MySQLi group and telling others about PHP5's new MySQLi (MySQL improved) extension, there always seems to be a redundant (though valid) question, "Why?" Simple enough right? Maybe not, so I attempted to come up with some good benchmarks. Now note, just because of the pure nature of PHP extensions, this is easier and harder in some ways than doing let's say, "ATI X800 vs Nvidia 6800" type benchmarks.
With that said, I tried my best to keep the test scripts used identical down to the variables. There will obviously be some differences as conceptually some things are different between the two extensions.
常用CSS缩写语法总结
作者:骆驼 日期:2006-08-23 07:27
颜色
16进制的色彩值,如果每两位的值相同,可以缩写一半,例如:#000000可以缩写为#000;#336699可以缩写为#369;
盒尺寸
通常有下面四种书写方法:
property:value1; 表示所有边都是一个值value1;
property:value1 value2; 表示top和bottom的值是value1,right和left的值是value2
property:value1 value2 value3; 表示top的值是value1,right和left的值是value2,bottom的值是value3
property:value1 value2 value3 value4; 四个值依次表示top,right,bottom,left
方便的记忆方法是顺时针,上右下左。具体应用在margin和padding的例子如下:
margin:1em 0 2em 0.5em;
边框(border)
边框的属性如下:
border-width:1px;
border-style:solid;
border-color:#000;
可以缩写为一句:border:1px solid #000;
语法是border:width style color;
PHP5盗链函数(referfile)
作者:骆驼 日期:2006-08-16 07:59
<coolcode lang="php" download="referer.php">
<?php
/**
@title:PHP5盗链函数
@author:axgle
@filename:referer.php
@contents:This is a demo that show referer made success
*/
if($_GET['id']) {
echo $_SERVER['HTTP_REFERER'];
} else {
echo referfile('http://joesen.f2blog.com/download.php?id=1','http://joesen.f2blog.com/');
}
function referfile($url,$refer='') {
$opt=array('http'=>array('header'=>"Referer:$refer"));
$context=stream_context_create($opt);
return file_get_contents($url,false,$context);
}
?>
</coolcode>
PHP生成MySQL数据字典
作者:骆驼 日期:2006-08-11 11:22
动态网页中慢数据的延迟输出
作者:骆驼 日期:2006-08-07 07:29
想起博客网中打开一个blog时,边上的小栏目起初会显示“数据读取中...”,片刻后才显示出来,使慢速数据不至于拖慢整个页面。遂研究此网页的代码。不过只能研究输出后的静态代码,动态部分虽然猜想是用ASP.NET做,但也看不到程序代码,于是也研究不出结果。次日欲在科大bbs的网页版上发帖求助,却无意看到一不相干的帖子,受到启发,想通了处理方法。
首先,在原模版欲延迟输出处写:
<div id="data">正在读取数据...</div>
在</html>标签后写:
<div id="data_load" style="display:none;"><script language="javascript" src="data.php"></script></div>
<script language="javascript">if (document.getElementById("data") != null) document.all("data").innerHTML = document.all("data_load").innerHTML;</script>
要注意的是,如果上段代码写在了</html>标签之前,则整个页面仍在数据完全读取后才显示,达不到目的。
如果模版是大小嵌套的(或曰子母模版),则可在大模版(母模版)的</html>标签后加一数据域{loaddata},在此动态php网页中用上段代码填充{loaddata}域。
此时可以把原动态页中的慢速查询移到data.php中,而模版中对应的内容则移到新建的模版data.tpl中,或嵌入data.php中,且每句均要改成javascript写文本格式document.write('原句')。
注意过滤原句中的引号。
其它动态网页语言可类推使用。





