PHP脚本的10个技巧(2)


Posted in PHP onOctober 09, 2006

会话用法
PHP 4.0有一个一直为人所期待的特性,这就是PHP的会话(session)支持。相比之下,PHP 3.0的用户则不得不使用第三方的程序库或完全不能具备这项功能。缺乏会话支持能力是PHP最大的缺陷之一,也是它最受人指摘的地方。不过,随着会话支持从早期测试版本的PHP 4.0开始就成为后者的一部分,这个障碍也荡然无存了。

有了会话支持,你就可以在用户访问网络站点期间维持用户特定的变量而无须象现在这样:设置多个cookie、使用隐蔽表单域或在你可能经常要连结的一个数据库内存储信息等。

在一个页面上启动会话就是告诉PHP引擎:你或是要开始一个会话(如果先前没有)或是继续目前的会话:

session_start();

启动一个会话将通过cookie向用户发送一个标识字符串(比如940f8b05a40d5119c030c9c7745aead9);在服务器端则会创建一个与此相匹配的临时文件,在以上例子中,其名称则是这个样子:sess_940f8b05a40d5119c030c9c7745aead9。该文件包含了注册的会话变量及其赋值。

用户访问计数器可谓使用会话的最常见实例:

启动你的PHP模块,保证PHP代码是文件的第一行:没有空白、没有HTML输出等等。这是因为,当会话函数发出一个文件头的时候,如果你在session_start()函数之前发送了空白或者HTML代码,系统即会报错。

<?
// if a session does not yet exist for this user, start one
session_start();

接下来,注册一个名为count的变量。

session_register('count');

注册变量就等于告诉了PHP:只要会话存在,一个名叫count的变量也就同时存在。目前这个变量还没有赋值。不过,如果你对它进行加1运算的话,该值即可被赋值为1:

$count++;

把以上各行代码一起考虑,实际上你已经启动了一个会话(如果先前没有)、为某个用户分配了会话id、注册了名为count的变量并把$count加1以表示用户首次访问页面:

要显示用户在当前会话下访问页面的次数,你只要打印出$count的值即可:

echo "<P>You've been here $count times.</p>";

整个访问计数器代码如下所示:

<?
session_start();
session_register('count');
$count++;
echo "<P>You've been here $count times.</p>";
?>

如果你重载以上脚本,你可以观察到计数值增加了。有意思吧?

你还可以在会话中注册数组。假设你有一个名为$faves的数组:

$faves = array ('chocolate','coffee','beer','linux');

你可以象其他单个变量一样注册该数组:

session_register('faves');

索引数组和索引其他单变量没有什么差别,比如$faves这样。如果你的用户想在Web站点的一个页面上展示自己的爱好,那么你完全可以把他喜欢的东西注册为一个名为$faves会话变量,然后你可以在其他页面上把这些值打印出来:

<?
session_start();
echo "My user likes:
<ul>";

while (list(,$v) = each ($faves)) {
echo "<li>$v"; }

echo "</ul>";
?>

这就是你要得到的:用户爱好的漂亮列表。

会话变量不能被查询字符串所覆盖,这就是说,你不能键入http:///www.yourdomain.com/yourscript.php?count=56 这样的指令为注册会话变量$count分配新值。这一点对安全而言是非常重要的:你只能在服务器端脚本上修改或者删除(未注册的)会话变量。

如果你想完全删除某个会话变量,你可以从系统中取消注册该变量:

session_unregister('count');

彻底删除某个会话,比如按下Logout按钮就是这样的例子,那么你可以写下如下的代码:

session_destroy();

使用会话来存储变量值可以让我们免于编写数据库处理代码的痛苦,这样也就不会过度增加对系统的负载,同时也减少了对专有数据库语法的使用范围,再说,你也不再非得向访问站点的用户发送一大堆cookie了。而现在呢——只需要一个cookie、一个变量就全部搞定了,真是一滴水就映出了全部光辉!实在是不能比这更简单的了。

PHP 相关文章推荐
COM in PHP (winows only)
Oct 09 PHP
php下通过IP获取地理位置的代码(小偷程序)
Jun 09 PHP
PHP对象Object的概念 介绍
Jun 14 PHP
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
Jun 29 PHP
PHP通过API获取手机号码归属地
May 28 PHP
php打造智能化的柱状图程序,用于报表等
Jun 19 PHP
PHP中使用foreach()遍历二维数组的简单实例
Jun 13 PHP
PHP实现原生态图片上传封装类方法
Nov 08 PHP
PHP中的日期时间处理利器实例(Carbon)
Jun 09 PHP
php提交表单时保留多个空格及换行的文本样式的方法
Jun 20 PHP
php解决约瑟夫环算法实例分析
Sep 30 PHP
PHP实现微信提现功能(微信商城)
Nov 21 PHP
PHP脚本的10个技巧(1)
Oct 09 #PHP
图书管理程序(三)
Oct 09 #PHP
一个从别的网站抓取信息的例子(域名查询)
Oct 09 #PHP
一个PHP+MSSQL分页的例子
Oct 09 #PHP
基于文本的留言簿
Oct 09 #PHP
图书管理程序(一)
Oct 09 #PHP
图书管理程序(二)
Oct 09 #PHP
You might like
php过滤危险html代码
2008/08/18 PHP
php中怎么搜索相关联数组键值及获取之
2013/10/17 PHP
Symfony2开发之控制器用法实例分析
2016/02/05 PHP
Symfony2创建基于域名的路由相关示例
2016/11/14 PHP
html下载本地
2006/06/19 Javascript
关于Javascript与iframe的那些事儿
2013/07/04 Javascript
js操作iframe兼容各种主流浏览器示例代码
2013/07/22 Javascript
node.js WEB开发中图片验证码的实现方法
2014/06/03 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
2014/10/21 Javascript
jquery中ajax使用error调试错误的方法
2015/02/08 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
javascript 数组的正态分布排序的问题
2016/07/31 Javascript
巧用jQuery选择器提高写表单效率的方法
2016/08/19 Javascript
jQuery 获取遍历获取table中每一个tr中的第一个td的方法
2016/10/05 Javascript
详解JS中的this、apply、call、bind(经典面试题)
2017/09/19 Javascript
express如何使用session与cookie的方法
2018/01/30 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
[11:27]《一刀刀一天》之DOTA全时刻20:TI4总奖金突破920W TS赛事分析
2014/06/18 DOTA
Python读写Redis数据库操作示例
2014/03/18 Python
python xml解析实例详解
2016/11/14 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
2019/06/17 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
2020/02/17 Python
pygame用blit()实现动画效果的示例代码
2020/05/28 Python
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
计算机专业自荐信
2013/10/14 职场文书
大学应届生的自我评价
2014/03/06 职场文书
学生请假条格式
2014/04/11 职场文书
师恩难忘教学反思
2014/04/27 职场文书
单位委托书怎么写
2014/08/02 职场文书
学生旷课检讨书500字
2014/10/28 职场文书
2015年政务公开工作总结
2015/05/19 职场文书
Python爬虫之爬取二手房信息
2021/04/27 Python
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
2021/08/30 Python
教你利用Nginx 服务搭建子域环境提升二维地图加载性能的步骤
2021/09/25 Servers
了解Kubernetes中的Service和Endpoint
2022/04/01 Servers