首页 > php框架

PHP关于session的问题集锦解决方案

PHP的session功能,一直为许多的初学者为难。就连有些老手,有时都被搞得莫名其妙。本文,将这些问题,做一个简单的汇总,以便大家查阅。
 

1.
错误提示
Warning: Cannot send session cookie - headers already sent
Warning: Cannot send session cache limiter - headers already sent
分析及解决办法
这一类问题,的原因是你在程序中使用session_start()时,之前已经有实际的html内容输出了。或许你说,我没有啊,我只不过是echo或print一条消息了。很抱歉,你的echo或print语句所产生的输出,就是实际的html内容输出。解决此类问题的办法是,将你的session_start()调到程序的第一行。
 

2.
错误提示
Warning: open(F:/689phpsessiondatasess_66a39376b873f4daecf239891edc98b5, O_RDWR) failed
分析及解决方法
出现这样的错误语句一般是因为你的php.ini中关于session.save_path一项没有设置好,解决的方法是将session.save_path和session.cookie_path 设置置为
session_save_path = c: emp
session.cookie_path = c: emp
然后在c:目录下建立一个temp目录,即可

3.
错误提示
Warning: Trying to destroy uninitialized session in
分析及解决方法
出类这样的提示,一般情况都是你直接调session_destroy()函数造成的。很多的朋友认为session_destroy()函数可以独立的运行,其实不然。解决的方法是在你调session_destroy()函数之前,要用session_start()开启session的功能。
 

4.问题:怎么获得当前session的id值呢?
最简单的方法是:
echo SID;
你会发现的。
 

5.问题:我的程序,在调用header函数之前没有任何的输出,虽然我include了一个config.php文件,但在config.php文件中也没有任何的输出,为什么session还是会报出与问题1同样的错误呢,是不是因为我在header之前用了session_start()的缘故呢?
答:或许你确实认真的检查了你的php程序,在引用header()之前确实也没有任何的输出,并且在你的include文件中也没有任何的输出!但是你是否用光标键在?>这个PHP代码结束语句后移动检查呢?那么你会发现在?>这个后面,有一个空行或几个空格,你删除了这几个空行或空格,那么问题就解决了。

阅读全文

PHP关于简单的页面缓冲技术

其实说它为技术,也许不能说是真正的技术。这只不过是我自已想出来的页面处理的方法,当然与别人的想法可能是一致的。不过我还是想给它一个好听的名字。那么我这里所指的页面缓冲是什么呢?就是指将动态生成的页面保存起来,供下一次的使用。这样下一次访问它可能就不需要动态生成了。就象提供了一个cache 一样。在我的网站上,也许你的网站也是如此,使用了象模板之类的技术,这样用户所看到的页面就是动态生成的。但是一个页面对于你是这样,对于别人可能还是这样,即在一段时间内是不会变化的,如果将上次生成的结果直接返回给下一次访问的用户不是更好吗?减少了生成时间,效率要高一些。我想随着网站的发展,速度与效率问题还是要考虑的。这里我给出我的实现,希望对大家有所帮助。只是一个思路,没有具体的实现。
 
使用条件
  是不是所有的网页最好都使用呢?我想不需要,而且也不可能。之所以能缓冲就是因为下一次访问与上一次访问的内容可能是完全一样的。所以对于经常变化的页面就不合适了。比如页面上要显示计数信息的就不太合适。还有就是如果你的动态页面输出时,没有先输出到变量中,而是直接返回给用户,如使用echo,print ,readfile之类的输出,我个人认为现在还作不到。因为无法将输出结果得到,保存到文件中去(反正我是想了半天没有想出有什么可以将直将输出的东西截下来,重定向到文件中去)。那么比较适的动态页面的处理就是:输出结果应该可以放到一个字符串之中。所以使用条件就是:
页面基本不会变化
动态页面的处理结果可以存放到字符串中
  这样使用模板类来处理动态页面就很好了。通过在模板中设置可替换的变量,然后根据实际的值替换相应的模板中的变量,同时可以将结果放到字符串中进行输出,这种模板类的处理非常适合保存处理后的页面。当然不使用模板类,也可以通过字符串的处理来生成输出结果也是可行的。至于怎么做就不讨论了。
 
实现
  如前所述,不是一个真正的实现,而是一个实现的思路。
 
  处理流程:
根据访问的要求,生成缓冲文件名
查看文件名是否存在,如果文件不存在,则生成动态页面,将页面保存,同时输出结果,结束;如果存在,则执行第3步
统计文件的修改时间,及与动态页面生成有关的文件的修改时间
比较缓冲文件的修改时间与其它页面的修改时间,如果其它页面修改时间大于缓冲文件修改时间,认为动态结果可能会发生变化,则重新生成动态页面结果,保存到文件中,且输出结果,结束;否则执行第5步

阅读全文

正则表达式例子:php中检查email完整性

<?php
if (eregi(^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]$,$email)) {
echo 您的 E-Mail 通过初步检查;
}
?> 
在这句话里,首先是应用了一个eregi函数,这个函数还算好理解。随便找本书,就能给你一段解释: 
语法: int ereg(string pattern, string string, array [regs]); 
返回值: 整数/数组 
本函数以 pattern 的规则来解析比对字符串 string。

比对结果返回的值放在数组参数 regs 之中,regs[0] 内容就是原字符串 string、regs[1] 为第一个合乎规则的字符串、regs[2] 就是第二个合乎规则的字符串,余类推。若省略参数 regs,则只是单纯地比对,找到则返回值为 true。

而不太好理解的就是前面的这段正则表达式了:^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]$ 
在这段正则表达式中,+表示前面的字符串连续出现一个或多个;^表示下一个字符串必须出现在开头,$表示前一个字符串必须出现在结尾; 
.也就是.,这里是转义符;表示前面的字符串可以连续出现2-3次。()表示包含的内容必须同时出现在目标对象中。[_.0-9a-z-]表示包含在_、.、-、从a到z范围内的字母、从0到9范围内的数字中的任意字符; 
这样一来,这个正则表达式可以这样翻译: 
下面的字符必须在开头(^)、该字符必须包含在_、.、-、从a到z范围内的字母、从0到9范围内的数字中([_.0-9a-z-])、前面这个字符至少出现一次(+)、@、该字符串由一个包含在从a到z范围内的一个字母、从0到9范围内的数字中的字符开头,后面跟至少一个包含在-、从a到z范围内任何一个字母、从0到9范围内任何一个数字中的字符,最后以.结束(([0-9a-z][0-9a-z-]+.))、前面这个字符至少出现一次(+)、从a到z范围内的字母出现2-3次,并以它结束([a-z]$) 
很繁杂是吧,对了,正因为这样,人们才使用正则表达式。

阅读全文

在静态页面中实现点击数统计

在文章发布系统中采用服务器端生成静态页面的方法可以有效减轻服务器的负担,特别是对大流量网站非常有效。但是既然生成的是静态页面,生成时是什么样,显示就是什么样了,对于文章常见文章被阅读次数怎么显示呢?
经考虑,可用如下方案解决:
生成静态页面时会产生一个文章的id存到数据库中,那么我们在制作文章的模板的时候就可以在这个文章的id上做文章,文章模板包含以下语句:
<SCRIPT src=counter.asp?articleId=<%=#articleId#%>></SCRIPT >
说明:
在利用模板生成文章时,把#articleId#进行模式匹配,替换为新添加的文章的id号。
 
counter.asp 文件为实现记数的asp文件
<%
###################
######开始#########
BY 王向超
###################
dim articleId,sqlStr,hits
articleId=int(trim(request.querystring(articleId)))
sqlStr=update articles set hits=hits+1 where articleId= & articleId
给文章点击数加1
conn.execute(sqlStr)
读出文章点击数
hits=conn.execute(select hits from articles where articleId= & articleId)(0)
%>
打印出文章点击数
document.write(<%=hits%>)

阅读全文

PHP实现网页自动更新块

  能不能让php为你的网页添加一些每隔一段时间就自动更新的内容,以更好的吸引访客呢?实现这一功能并不需要太高深的编程知识,请看以下例子:
  (一)英语谚语
  让我们来看一个简单的应用:让php程序从数据库中随机提取一行记录,显示在网页上,隔15分钟再去读取另一条记录。英汉对照的谚语是个适合显示的内容。
  考虑到放置个人主页的廉价虚拟主机多数不支持MySQL之类的数据库,我们使用文本型数据文件来存放数据,这对于流量不很大的网站来说足够了。建立一个文本文件,命名为english.dat,内容如下:
  A bad beginning makes a bad ending. 恶其始者必恶其终。
 
  A bad bush is better than the open field. 有胜于无。
 
  A bad compromise is better than a good lawsuit. 吃亏的和解也比胜诉强。
 
  A bad conscience is a snake in one’s heart. 做贼心虚。
 
  A bad custom is like a good cake, better broken than kept. 坏习惯像鲜馅饼,分食要比保存好。
 
  A bad padlock invites a picklock. 开门揖盗。
  ……
  注意,每行是一条完整的记录,中间不要换行;文件中不能有半角的双引号( )否则在输出数据时程序会解析出错。网上有很多这样的内容,搜索一下即可,也可以去我的网站

阅读全文

用PHP制作静态网站的模板框架(一)

模板能够改善网站的结构。本文阐述如何通过PHP 4的一个新功能和模板类,在由大量静态HTML页面构成的网站中巧妙地运用模板控制页面布局。
提纲:
===================================
分离功能和布局
避免页面元素重复
静态网站的模板框架
===================================

分离功能和布局
   首先我们来看看应用模板的两个主要目的:

分离功能(PHP)和布局(HTML)
避免页面元素重复
   第一个目的是谈论得最多的目的,它设想的情形是:一组程序员编写用于生成页面内容的PHP脚本,同时另一组设计人员设计HTML和图形以控制页面的最终外观。分离功能和布局的基本思想就是使得这两组人能够各自编写和使用独立的一组文件:程序员只需关心那些只包含PHP代码的文件,无需关心页面的外观;而页面设计人员可以用自己最熟悉的可视化编辑器设计页面布局,无需担心破坏任何嵌入到页面的PHP代码。
   如果你曾经看过几个关于PHP模板的教程,那么你应该已经明白模板的工作机制。考虑一个简单的页面局部:页面的上方是页头,左边是导航条,其余部分是内容区域。这种网站可以拥有如下模板文件:
<!-- main.htm -->
<html>
<head><title>模板示例</title></head>
<body>
<table><tr><td>{HEADER}</td></tr>
<tr><td>{LEFTNAV}</td><td>{CONTENT}</td></tr>
</table>
</body></html>
<!-- header.htm -->
<img src="sitelogo.jpg">
<!-- leftnav.htm -->
<br><a href="foo">Foo</a>
<br><a href="bar">Bar</a>

   可以看出页面如何由这些模板构造而成:main模板控制着整个页面的布局;header模板和leftnav模板控制着页面的公共元素。花括号“{}”里面的标识符是内容占位符。使用模板最主要的好处在于界面设计者能够按照自己的意愿编辑这些文件,比如设置字体、修改颜色和图形,或者完全地改变页面的布局。界面设计者可以用任何普通HTML编辑器或者可视化工具编辑这些页面,因为这些文件都只包含HTML代码,没有任何PHP代码。

阅读全文

浅议PHP程序开发中的模板选择

关于PHP的模板的确是一个说起来容易做起来麻烦的事情。随便一数大概有20种以上的选择,光pear里面就包含了5中不同的模板,实在让人头疼。
 
  千万不要人云亦云的说这个好那个不好,选择模板之前最好先应该搞清楚模板的真正目的是什么? 简单地说,模板的核心目的就是一个 team work。主要的作用方式有两种:
  1、分离HTML和PHP使网页设计师和PHP程序员合作更加愉快。
 
  2、分离显示逻辑和事物逻辑,使得核心事务逻辑的变更和应用程序的扩展更加容易和灵活,也就是说使得程序员之间合作更加愉快。(这一点经常被人们忽视或者误解,总以为把PHP从HTML中弄出去就叫分离显示逻辑和事物逻辑了,如果这样当初又何苦让PHP和html 混在一起呢?)
  搞清楚这个模板的真正目的是什么,就容易做出正确的选择了。
 
  如果只有你一个php程序员但是需要和其他的网页设计人员一起协同工作,那么选择能够分离HTML和PHP的模板就可以了,phplib (现在好像集成到 Pear 里面了 http://pear.php.net/package/HTML_Template_PHPLIB)或者
FastTemplate 都是这样的东西,很简单容易上手。
 
  如果你的网站界面比较丑陋并且主要由程序员来完成,但是功能比较复杂更需要强大的扩展功能,需要分离各个层次包括显示逻辑,那么不要用什么特别的东西,PHP本身就是最好的模板了。要注意的是在这种情况下,你要非常认真的设计你的程序,始终记住要分离的不是PHP和 html 而是事务逻辑(business logic )和显示逻辑(presentation logic)。这也是为什么我一直对于Smarty 这种东西非常的抵触, 因为这个 Smarty 的语法太复杂了太强大了, 几乎重新发明了一种脚本语言东西, (即使是PHP的程序员也要重新学习它)。更让人费解的是 这种脚本 越是强大,越容易让人将事务逻辑(business logic )和显示逻辑(presentation logic)混在一起, 破坏了模板的初衷。
 
  如果你既想HTML和PHP分离,得到更好的视觉设计,又想整个系统有非常强大的扩展能力能够适应html,xml,wml各种界面,而且不用去学习复杂的语法的同时提供较高的运行效率,那么这就是一个相当有挑战性的问题了。坏消息是目前还没有一个成熟的模板真正能够达到这样的要求,好消息是完成这样的一个模板并不是很难,如果你尝试过Zope或者是ColdFusion就会发现这种模板的影子,
(wact http://wact.sourceforge.net/ 和 phptal http://phptal.sourceforge.net/ 就是在向这个方向发展,应该很有前途)。

阅读全文

多Web服务器之间共享Session的解决方案

  很多开发中涉及到用户的Session验证很保留的问题,这个问题比较有意思,总结了几种方案,只供参考。
  


  为了满足足够大的应用,满足更多的客户,于是我们架设了N台Web服务器(N>=2),在多台Web服务器的情况下,我们会涉及到一个问题:用户登陆一台服务器以后,如果在跨越到另一台服务器的时候能够继续使用客户的Session?
  (以下描述方案只是针对Linux/Unix Apache Mysql PHP的开发架构,当然,也可以扩展到其他平台。)
  

阅读全文

说一说PHP程序开发中的模板选择

关于PHP的模板的确是一个说起来容易做起来麻烦的事情。随便一数大概有20种以上的选择,光pear里面就包含了5中不同的模板,实在让人头疼。

千万不要人云亦云的说这个好那个不好,选择模板之前最好先应该搞清楚模板的真正目的是什么? 简单地说,模板的核心目的就是一个 team work。主要的作用方式有两种:

1、分离HTML和PHP使网页设计师和PHP程序员合作更加愉快。
 

2、分离显示逻辑和事物逻辑,使得核心事务逻辑的变更和应用程序的扩展更加容易和灵活,也就是说使得程序员之间合作更加愉快。(这一点经常被人们忽视或者误解,总以为把PHP从HTML中弄出去就叫分离显示逻辑和事物逻辑了,如果这样当初又何苦让PHP和html 混在一起呢?)

搞清楚这个模板的真正目的是什么,就容易做出正确的选择了。
 

如果只有你一个php程序员但是需要和其他的网页设计人员一起协同工作,那么选择能够分离HTML和PHP的模板就可以了,phplib (现在好像集成到 Pear 里面了 http://pear.php.net/package/HTML_Template_PHPLIB)或者

FastTemplate 都是这样的东西,很简单容易上手。
 

如果你的网站界面比较丑陋并且主要由程序员来完成,但是功能比较复杂更需要强大的扩展功能,需要分离各个层次包括显示逻辑,那么不要用什么特别的东西,PHP本身就是最好的模板了。要注意的是在这种情况下,你要非常认真的设计你的程序,始终记住要分离的不是PHP和 html 而是事务逻辑(business logic )和显示逻辑(presentation logic)。这也是为什么我一直对于Smarty 这种东西非常的抵触, 因为这个 Smarty 的语法太复杂了太强大了, 几乎重新发明了一种脚本语言东西, (即使是PHP的程序员也要重新学习它)。更让人费解的是 这种脚本 越是强大,越容易让人将事务逻辑(business logic )和显示逻辑(presentation logic)混在一起, 破坏了模板的初衷。
 

如果你既想HTML和PHP分离,得到更好的视觉设计,又想整个系统有非常强大的扩展能力能够适应html,xml,wml各种界面,而且不用去学习复杂的语法的同时提供较高的运行效率,那么这就是一个相当有挑战性的问题了。坏消息是目前还没有一个成熟的模板真正能够达到这样的要求,好消息是完成这样的一个模板并不是很难,如果你尝试过Zope或者是ColdFusion就会发现这种模板的影子,

阅读全文

正则表达式判断email和URL,帮忙看看有没有要补充的.

<body    onload="f.a.select();">
<?php
echo a:.htmlspecialchars($a);
echo <br>a1:;
$a1 = eregi_replace((^[_.][:alnum:]-]+@([[:alnum:]][[:alnum:]-]*.)+[[:alpha:]]{2,3}$), <a href="mailto:1">1</a> , $a) ;
echo htmlspecialchars($a1);
echo "<br>a1:$a1";
echo <br>a2:;
$a2 = eregi_replace(([[:alnum:]]+://([[:alnum:]][[:alnum:]-]*.)+[[:alpha:]]{2,3}([#?/][^#?/][:space:]][^[:space:]]*)?),
        <a href="1" target="_blank">1</a>, $a);
echo htmlspecialchars($a2);
echo "<br>a2:$a2";
// eregi(^[_.][:alnum:]-]+@([[:alnum:]][[:alnum:]-]*.)+[[:alpha:]]{2,3}$,$a) or die("not a email");
?>
<form name="f">
<input    name="a" value="<?php echo $a; ?>">
<input type="submit" >
</form>
</body>    


阅读全文

php的字符编码转换工具

前一阵子见到了qiushuiwuhen君的关于gbk,unicode,big5的转换的文章
但是多少有一些不太大的问题
于是我设计了一个负责字符转换的类,修正了其中的一些不足,增加了部分功能,以后我会不断扩充该类,来支持更多的字符集
增加了如下几点:
unicode->gbk 符号部分的转换
欧元符(€)的识别
big5,Unicode,GBK之间的相互转换,前提是只转换共同的字符集部分,
使用说明:
暂时程序支持以下字符编码方式:
GBK,BIG5,UTF-16BE(Unicode big-endian字节顺序),UTF-16LE(Unicode little-endian字节顺序),UTF-8
默认输入编码方式为GBK,默认输出编码方式为UTF-16BE;
该类别提供两个函数用来修改输入和输出编码方式:
修改输入编码方式 boolean SetGetEncoding(string $GetEncoding)
修改输出编码方式 boolean SetToEncoding(string $ToEncoding)
函数参数只能使用上述5种编码方式,区分大小写,如GBK不能写成gbk
如果设置成功,返回true,如果使用了错误的编码名,返回false,并现实错误信息
函数
string EncodeString(string $String)
负责进行字符编码转换,返回转换后的字符串
使用前,请将var $FilePath=""变量该为该程序文件的绝对路径,否则将会找不到数据文件
例子:
将gbk编码的字符串转化为UTF-8编码:
$s="GBK编码";
$CharEncoding=new Encoding();
$CharEncoding->SetGetEncoding("GBK")||die("编码名错误");
$CharEncoding->SetToEncoding("UTF-8")||die("编码名错误");
echo $CharEncoding->EncodeString($s);
在浏览器中使用UTF-8编码察看,将会看到正确的字符
 
程序下载地址:
http://dreamcity2000.myetang.com/encoding.zip
下载时请重新打开一个浏览器窗口然后输入上面的地址才能下载.
ps:程序如要转载,请和作者联系


阅读全文

PHP与WAP

WAP(无线通讯协议)是在数字移动电话、个人手持设备(PDA等)及计算机之间进行通讯的开放性全球标准协议。随着无线通讯的不断发展,静态的WAP页面在很多方面已经不能满足用户个性化的要求,因此开发者可以在WAP服务器端使用诸如PHP等语言产生动态的WML页面,来满足用户的需要。

   WAP的应用结构非常类似于Internet,一个典型的WAP应用请求步骤描述如下:
   1. 具有WAP用户代理功能的移动终端(如WAP手机),通过内部运行的微浏览器向某一网站发送WAP服务请求。该请求先由WAP网关截获,对信息内容进行编码压缩,以减少网络数据流量,同时根据需要将WAP协议转换成HTTP协议。
   2. 协议将处理后的请求转送到相应WAP服务器。在WAP服务器端,根据页面扩展名等属性,被请求的页面直接或由服务器端脚本解释后输出,再经过网关传回给用户。
  从上述的WAP应用流程可以发现,生成动态WAP页面与动态产生Web网页的过程非常相似。但是由于WAP应用使用的WML语言来源于语法严格的XML,因此要求输出的格式必须按WAP网页的规范输出。同时,由于WAP协议的应用范围及移动客户端的软、硬件配置等局限性,对每次输出的页面的大小、图像的格式及容量都有一定限制。本文笔者将以PHP语言为例,和广大网络程序开发爱好者共同探讨动态输出WAP页面的方法和应用。
  输出简单的动态WAP页面
  由于生成WAP页面的过程和生成一般的Web页面非常类似,笔者通过一个最简单的WAP页面的例子来介绍。不过提醒一句:由于需要PHP解释器来解释该程序并输出WAP页面,因此所有类似的程序应以“php”为扩展名哦。
  < ?php
  header(Content-type: text/vnd.wap.wml); //定义输出文档为WML类型
  echo ( );
  echo ( Hello WAP );
  echo ();
  ?>
  该实例可以在WAP手机模拟器中浏览,输出一句经典的“Hello WAP”语句,但是在普通的网络浏览器中是无法识别的,原因很简单,在程序开头声明了该输出文档为WML类型,只有WAP设备能够识别并解释。不过又要提醒一句:常见的HTML语言对规范性要求不严,大多数浏览器能“宽容”地接受其中的编写错误,但是WML的规范相当严格,任何的错误都可能导致无法输出所需的页面。
   实例1 动态生成图像
  WAP使用的图像是一种特殊的黑白图像格式:WBMP。开发者可以使用一些现有的工具将一般图像转换成WBMP格式,然后在WML文档中使用。但是如果在WAP程序中能动态地生成所需图像(如股市的K线图),将会使程序有极其广阔的应用前景。PHP提供了强大的图形绘制功能,下面的实例将将在WAP模拟器中显示一个黑色的矩形框。

阅读全文