在许多投票程序中,需要验证投票者是否多次投票,因此就要做一个验证。做验证可以使用cookie,或者session。在这里主要讲怎么用cookie来做验证的问题:
用cookie来做验证,首先就要用到两个函数:
一个是setcookie()和setrawcookie()
setcookie()的函数大致如下:
boolsetcookie( string name [, string value [, int expire [, string path [, string domain [, bool secure]]]]] )
name参数是Cookie 的名字。 value是Cookie 的值。此值保存在客户端,不要用来保存敏感数据。 expire是Cookie 过期的时间。这是个 Unix 时间戳,即从 Unix 纪元开始的秒数。换而言之,通常用time()函数再加上秒数来设定 cookie 的失效期。或者用mktime()来实现。path是Cookie 在服务器端的有效路径。domain是该 cookie 有效的域名。secure是指指明 cookie 是否仅通过安全的 HTTPS 连接传送。当设成TRUE时,cookie 仅在安全的连接中被设置。默认值为FALSE。
setcookie()定义一个和其余的 HTTP 标头一起发送的 cookie。和其它标头一样,cookie 必须在脚本的任何其它输出之前发送(这是协议限制)。这需要将本函数的调用放到任何输出之前,包括<html>和<head>标签以及任何空格。如果在调用setcookie()之前有任何输出,本函数将失败并返回FALSE。如果setcookie()函数成功运行,将返回TRUE。这并不说明用户是否接受了 cookie。
当 cookie 被设置后,便可以在其它页面通过$_COOKIE或$HTTP_COOKIE_VARS数组取得其值。需要注意的是,autoglobals的$_COOKIE形式适用于 PHP4.1.0或更高版本。而$HTTP_COOKIE_VARS则从 PHP 3 起就可以使用。Cookie 的值也会被保存到$_REQUEST数组中。
在投票程序中,大致的判断过程是:
isset($pollee) //cookie是否存在,$pollee(cookie的名字)是否存在
如果没有cookies,则投票,然后写入cookies
用setcookie(),程序如:
setcookie("pollee","voted2",time()+1);//括号里面第一个是cookie名,第二个是cookie的value,第三个是时间限制。
如果有,则弹出一个对话框,提示已经投票,然后返回投票页或者首页。
大致就是上面
但是cookie的缺点就是:
Cookies 不会在设置它的本页生效,要测试一个 cookie 是否被成功的设定,可以在其到期之前通过另外一个页面来访问其值。过期时间是通过参数expire来设置的。可以简单地使用print_r($_COOKIE);来调试现有的 cookies。
Cookie 必须用和设定时的同样的参数才能删除。如果其值一个空字符串,或者是FALSE,并且其它的参数都和前一次调用 setcookie 时相同,那么所指定名称的 cookie 将会在远程客户端被删除。
由于把 cookie 的值设为FALSE会使客户端尝试删除这个 cookie,所以要在 cookie 上保存TRUE或FALSE时不应该直接使用 boolean 值,而应该用0来表示FALSE,用1来表示TRUE
可以把 cookie 的名称设置成一个数组,但是数组 cookie 中的每个元素的值将会被单独保存在用户的系统中。考虑使用explode()函数用多个名称和值设定一个 cookie。不推荐将serialize()用于此目的,因为它可能会导致一个安全漏洞。