1. PHP的COOKIE
cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。
PHP在http协议的头信息里发送cookie, 因此 setcookie() 函数必须在其它信息被输出到浏览器前调用,这和对 header() 函数的限制类似。
1.1 设置cookie:
可以用 setcookie() 或 setrawcookie() 函数来设置 cookie。也可以通过向客户端直接发送http头来设置.
1.1.1 使用setcookie()函数设置cookie:
bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure [, bool httponly]]]]]] )
name: cookie变量名
value: cookie变量的值
expire: 有效期结束的时间,
path: 有效目录,
domain: 有效域名,顶级域唯一
secure: 如果值为1,则cookie只能在https连接上有效,如果为默认值0,则http和https都可以.
例子:
<?php
$value = 'something from somewhere';
setcookie("TestCookie", $value); /* 简单cookie设置 */
setcookie("TestCookie", $value, time()+3600); /* 有效期1个小时 */
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* 有效目录 /~rasmus,有效域名example.com及其所有子域名 */
?>
设置多个cookie变量: setcookie(‘var[a]‘,’value’);用数组来表示变量,但他的下标不用引号.这样就可以用$_COOKIE[‘var’][‘a’]来读取该COOKIE变量.
1.1.2. 使用header() 设置cookie;
最近搞这个自动取消置顶的东西,非常之烦
一开始方案是采取读出两次数据 ,一组是置顶不过期数据,一组是所有数据。然后进行数组匹配,第二个数组中不在第一个数组的数据累加到第一个数组后头。当文章数目仅仅就10来篇的时候也就罢了,倘若上百篇,这么大的二维数组循环匹配太消耗资源。
想了想,还是放弃了这种方式,实在不可取。最终去在mysql手册中找了控制流程函数IF,终于解决了这个问题。
函数表达式:IF(expr1,expr2,expr3)
如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。
举个例子就很好理解
mysql > SELECT IF(1>2,'yes ','no');
> 'yes'
数据库表结构设计:
id: int(11)
title: varchar(255)
istop: tinyint(1) //这个是是否置顶:1表示置顶;0表示非置顶
topdeadline: int(10) //置顶截止时间,时间戳格式..
…… //更多的字段
PHP中操作Mysql:
//这里有额外的要求,当置顶截止时间为空时,代表永久置顶。
$timestamp = mktime(); //获取当前时间戳
//置顶为1时,截止时间大于当前时间或者 截止时间为0,定义一个字段为top为其赋值
$sql = "SELECT id, title,
IF(istop=1 AND (topdeadline>" . $timestamp . " OR topdeadline=0), 1, 0) AS top,1
FROM article ORDER BY id DESC";