php投票cookie限制,PHP利用cookie做的投票程序
发布日期:2021-06-24 13:06:02 浏览次数:2 分类:技术文章

本文共 4055 字,大约阅读时间需要 13 分钟。

\n

在开始具体的程序设计之前,我们先学习一下几个下面需要用到的重要概念和函数:

\n

首先是cookie,我们需要用他来防止同一台机器进行重复投票。

\n

cookie原义在美语中是小甜饼的意思,当然我们现在不是要吃饼,在这cookie指的是一个有许多限制的ASCII文件。它是由服务器发给用户用于记录着用户在浏览过程中的一些信息。Cookies的文件大小被限制在4K以内。 cookie的用途是非常多的,比如你到过的一些网站有记录你来过次数,那就多半是用了cookie。 在这里我们用他来记录访问者是否已经投过票。

\n

在PHP里我们可以非常方便的用setcookie函数来使用cookie,cookie实际上是HTTP协议中header的一部分。因此setcookie函数必须在没有任何其它信息输出到浏览器之前调用。说简单点就是要在标志前用这个函数啦……。下面是setcookie的用法示例:

\n

Setcookie:送出 Cookie 资讯到浏览器。

语法:

int setcookie(string name, string value, int expire, string path, string domain, int secure);

传回值: 整数

函式种类: 网路系统

内容说明:

本函式会跟着标头 Header 送出一段小资讯字串到浏览器。使用本函式要在送出 HTML 资料前,实际上 cookie 也算标头的一部份。本函式的参数除了第一个 name 之外,都是可以省略的。参数 name 表示 cookie 的名称;value 表示这个 cookie 的值,这个参数为空字串则表示取消浏览器中该 cookie 的资料;expire 表示该 cookie 的有效时间;path 为该 cookie 的相关路径;domain 表示 cookie 的网站;secure 则需在 https 的安全传输时才有效。 expire时间的格式如下:

Wdy, DD-Mon-YYYY HH:MM:SS GMT

GMT表示格林尼治标准时间

\n

使用范例:

status = 0;

if (isset(myTstCky) && (myTstCky == “ChocChip”))

status = 1;

if (!isset(CCHK)) {

setcookie(“myTstCky”, “ChocChip”);

header(“Location: PHP_SELF?CCHK=1″);

exit;

}

?>

Cookie Check

Cookie Check Status:

printf (‘%s

;’,

status ? “00FF00″ : “FF0000″,

status ? “PASSED!” : “FAILED!”);

?>

\n

怎么样?大家对cookie的用法是不是有所了解呢?在这里告诉大家一个关于expire日期的小技巧,如果你想让cookie的expire日期为从当前算起的第三天。那么你可以使用time()函数,这个函数将返回一个以秒为单位的当前时间(注意哟!这个时间是包括了年月日的),那么如果你想把expire日期定为第三天,那么就是 time()+60*60*24*3。

\n

最后我们来看看PHP的档案处理,PHP中用于档案处理的函数有大概几十个,在我们这一节里,使用了其中的五个函数fopen(); fclose(); flock();fexists();fwrite(); 其中我想重点说一下flock();其它的大家就去自己查手册吧。

\n

为什么要重点说flock()?因为这是一个对于网络编程非常重要的功能,我举个例子,两个人同时投票,而且选的都是选项A,假设他们同时打开数据文件,这时A的选票是2,然后两个进程都在原有的基础上加1,接着一个写入了数据,另外一个也跟着写完了写入,大家想这时会出现什么情况?A的选票是多少?正确结果应该是4,但实际上却会是3。为什么会这样?这就是因为网络的多人环境的特点啦,所以我们在投票前一定要先用flock()函数把文件锁住,投完后再打开文件让其它的进程进行操作,这样才能防止出现上面的那类错误。下面是flock函数的用法说明。

\n

flock :锁住档案。

语法: boolean flock(int fp, int operation);

传回值: 布林值

函式种类: 档案存取

内容说明: 本函式用来锁住档案,使别的行程无法存取。传入的参数 fp 为档案的指标。参数 operation 的值为下列的数字之一:

1 、表示设定锁住档案可以允许别的行程读取;

2 、表示只有该行程可以写入档案;

3 、表示读写均锁住;

4 、不锁住区块 (block)。

而本函式无论在 UNIX 或是 Windows 系列中的锁住效果都相近。执行成功则传回 true 值,否则传回 false 值。

\n

好了,基础的东西已经学完,让我们来进行实战吧!大家先下这个范例程序。然后可以在自己的平台上先试试看。相信这样会得到一点感性认识。以下是我整理的投票程序的完整代码,在本机测试通过。

记得打开你浏览器的cookie功能啊!【IE 工具->选项->隐私->高级 接收第一方cookie】

//********************************************************************************

// Author:lucas Date:2007.11.14 Version:1.0

\n

//********************************************************************************

\n

//title变量设定本html档中的title标记,也就是在浏览器标题栏里出现的标题

title=’读者类型调查表’;

\n

//设定调查内容。这里用了一个数组,注意用”"号把内容括起来

option= array(“学生”,”工人”,”农民”,”知识分子”,”资本家”,”流氓”);

\n

//设定调查结果保存到哪个文件中去

countfile = “sum.txt”;

\n

//设定同一机器可以再次投票的时间:3天

limitdate = time()+60*60*24*3;

\n

/* 下面这部分就是cookie */

\n

//检测是否已经有cookie设置

if (isset(_COOKIE[\'vote\']) && _COOKIE[\'vote\']==”Ready”)

status = 1;

else

status = 0;

\n

//为了避免人家还没有投票,程序就把cookie发出去

if (_POST[\'ready\']==”true”){

setcookie(“vote”,”Ready”,limitdate);

}

\n

?>

\n

<?php echo title ?>

\n

//读出原来的选票结果,赋给变量result

if (file_exists (countfile)){

result = file(countfile);

}

elect = _POST[\'elect\'];

suggest = _POST[\'suggest\'];

\n

/*下面是主程序 用switch做了三个分支,Case 1、查看结果;Case 2、提交选择;Case 3、生成表单*/

switch (elect) {

/* 查看结果,实际就是把上面用file()函数读出来的变量显示出来*/

case “查看结果”:

echo “

for(i=0;i

echo “

”.””.option[i].””;

echo “

”.”
%E2%80%991.gif%E2%80%99

echo “result[i]*10″;

echo “‘ height=’8′>

”;

echo “

”.” “.result[i].””;

}

echo “

”;

break;

\n

/*把选择结果写入到文件中去,注意要用flock把文件锁住!虽然对投票程序来说这个问题不是特别突出*/

case “投票提交”:

if (status == 1){

echo “你已经投过票了!”;

}elseif(suggest == 0){

echo “you havn’t choice”;

}else{

if(fp=fopen(countfile,”w”)){

if(flock(fp,3)){

for (i=0; i< count (option); i++){

if (suggest == i+1){

result[i]=result[i]+1;

}else

result[i]=result[i] + 0;

fwrite(fp,result[i].”\\n”);

}

echo “”;

echo “”;

}else

echo “投票失败”;

}else

echo “投票失败”;

fclose(fp);

}

break;

\n

/*显示投票的表单*/

default:

echo “

”;

sum = count(option);

for (i=0; i

echo “

echo i+1;

if (i==0) echo ” CHECKED”;

echo “>”.option[i].”

”;

}

echo “”;

echo “

”;

echo “”;

echo “”;

echo “

”;

}

\n

?>

\n

这样一个简单的php的投票应用就完成了,说它简单是因为这个程序只完成了投票应用的几个最重要的功能,还有一些细节问题没有去处理。比如文件写失败之后的处理,用户关闭cookie功能的应付办法等等 ^_^

\n

来源:CSDN\n

转载地址:https://blog.csdn.net/weixin_32946543/article/details/115661691 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:php去掉所有,php如何去掉所有标签
下一篇:php ice 性能,ZeroICE+PHP整合

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月20日 10时45分31秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

AR涂涂乐丨9. 视频展示及涂涂乐源文件 2019-04-28
Unity-BattleStar丨1. Unity新建游戏场景,游戏对象颜色为灰色、对齐、对称 2019-04-28
Unity-BattleStar丨2. Unity光照系统、光照探头、反射探头、Lighting Mode 2019-04-28
Unity-BattleStar丨3. UI中心点Pivot、锚点 2019-04-28
Unity-BattleStar丨4. UI系统 2019-04-28
Unity-BattleStar丨5. 给BattleStar游戏添加UI 2019-04-28
Unity动画丨一、创建普通动画 2019-04-28
Unity动画丨二、什么是按钮动画?什么是2D精灵动画?如果你想知道,我现在就带你研究! 2019-04-28
Unity动画丨三、导入模型解决材质贴图丢失问题、导入大小比例设置 2019-04-28
Unity动画丨四、动画导入的三种模式:Legacy、Generic 与 Humanoid 2019-04-28
认真CS丨增量时间—Time.deltaTime & Time.fixedDeltaTime 2019-04-28
Unity动画丨五、分割、播放动画、控制模型位移 2019-04-28
认真CS丨Input.GetAxisRaw与Input.GetAxis 2019-04-28
Unity动画丨六、Humanoid和Generic的区别、导入方式(骨骼映射、Avatar创建) 2019-04-28
Unity动画丨七、Humanoid—loop match、Bake Into Pose、Based Upon、offset、Mirror 2019-04-28
Unity动画丨八、动画重定向 2019-04-28
Unity动画丨1、通过 StringToHash ,控制人物前进、奔跑 2019-04-28
认真CS丨Animator.StringToHash:字符串到哈希 & 哈希代码 2019-04-28
Unity动画丨2. 角色左右转向、Blend Tree混合树、批量注释 2019-04-28
Unity动画丨3. Blend Tree下角色左右转向 &amp; Computer Positions 2019-04-28