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

本文共 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整合

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年03月30日 16时47分06秒

关于作者

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

推荐文章

【英语学习】【Level 07】U06 First Time L2 A good food experience 2019-04-28
【英语学习】【Level 07】U06 First Time L3 Subway everyday 2019-04-28
【英语学习】【Level 07】U06 First Time L4 Lost in Shanghai 2019-04-28
【英语学习】【Level 07】U06 First Time L5 A Different City 2019-04-28
【英语学习】【Level 07】U06 First Time L6 Not your typical experience 2019-04-28
【英语学习】【Level 07】U07 Stories of my Life L1 Going to the Countryside 2019-04-28
【英语学习】【Level 07】U07 Stories of my Life L2 I actually did it! 2019-04-28
【英语学习】【Level 07】U07 Stories of my Life L3 Campus memories 2019-04-28
【英语学习】【Level 07】U07 Stories of my Life L4 Not my best moment 2019-04-28
【英语学习】【Level 07】U07 Stories of my Life L5 I shouldn't have said that 2019-04-28
【英语学习】【Level 07】U07 Stories of my Life L6 An experience worth remembering 2019-04-28
【英语学习】【Level 07】U08 Old Stories L1 The old times 2019-04-28
【英语学习】【Level 07】U08 Old Stories L2 A good read 2019-04-28
【英语学习】【Level 07】U08 Old Stories L3 Lights, camera, action! 2019-04-28
【英语学习】【Level 07】U08 Old Stories L4 Today's headline 2019-04-28
【英语学习】【Level 07】U08 Old Stories L5 Fulfilling a life goal 2019-04-28
【英语学习】【Level 07】U08 Old Stories L6 Looking back 2019-04-28
【英语学习】【Level 08】U01 Let's Read L1 All the world's a stage 2019-04-28
【英语学习】【Level 08】U01 Let's Read L2 Of fairies and princesses 2019-04-28
【英语学习】【Level 08】U01 Let's Read L3 The classics are always in 2019-04-28