第十一章:Cookie 与 Session
1:Cookie—— Web服务器暂时储存在用户硬盘的一个文本文件,并随后被Web浏览器读取。文本文件格式:用户名@网站地址[数字].txt。像IE的储存目录是:C:\Users\atang\AppData\Local\Microsoft\Windows\Temporary Internet Files。如:Cookie:atang@ad-plus
1)创建Cookie—— bool setcookie(string name [,string value [,int expire [, string path [,string domain [, int secure]]]]])
注意:Cookie 是HTTP 头标的组成部分,而头标必须在页面其他内容之前发生,它必须最先输出。若在setcookie()函数前输出一个HTML标记或echo语句,甚至一个空行都会导致程序出错
2)读取Cookie —— $_COOKIE[]
<?php if(!isset($_COOKIE["cookiename"])){ setcookie("cookiename", date("y-m-d H:i:s")); echo "欢迎你第一次访问网站!"; }else{ setcookie("cookiename", date("y-m-d H:i:s"), time()+60);//设置失效时间 echo "您上次访问网站的时间是:".$_COOKIE["cookiename"]; } ?>
注:如果未设置Cookie的到期时间,关闭浏览器时会自动删除Cookie数据
3)删除Cookie—— 删除Cookie只需要将 setcookie() 函数中的第二个参数设置为空值, 将第3个参数Cookie的过期时间设置为小于系统当前时间即可。如:
setcookie("name", "", time()-1); //time()函数返回以秒表示的当前时间戳。把过期时间设置为0,也可以直接删除Cookie
2:Session—— 计算机术语中,session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统所经过的时间。
工作原理:当启动一个session会话时,会生成一个随机且唯一的session_id,也就是session的文件名,此时session_id存储在服务器的内存中,当关闭页面时此id会自动注销,重新登录此页面,会再次生成一个随机且唯一的id
创建一个会话需要通过以下步骤:启动会话->注册会话->使用会话->删除会话
1)启动会话:两种方式,一种是使用session_start()函数,另一种是使用session_register()函数为会话登录一个变量来隐含地启动会话
注意:通常,session_start()函数在页面开始位置调用,然后会话变量会被登录到数据$_SESSION
语法:bool session_start(void);
注意:使用session_start()函数之前浏览器不能有任何输出,否则会产出错误
session_register() 函数用来为会话登录一个变量来隐含地启动会话,但要求设置php.ini文件的选项,将register_globals设置为on
注意:使用session_register()函数时,不需要调用session_start()函数,php会在注册变量之后隐含地调用session_start()函数
2)注册会话:会话变量被启动后,全部保存在数组$_SESSION中。通过$_SESSION创建一个会话变量很容易,只要直接给该数组添加一个元素即可。如:
session_start();
$_SESSION["admin"] = null;
3)使用会话:首先要判断会话变量是否有一个会话ID存在,如果不存在,就创建一个,并且使其能够通过全局数组$_SESSION进行访问。如果已经存在,则将这个已注册的会话变量载入以供用户使用。如:
if (!empty ($_SESSION['session_name'])) $myvalue = $_SESSION['session_name']; //将会话变量赋给变量$myvalue
4)删除会话
a:删除单个会话——删除会话变量,同数组操作一样,直接注销$_SESSION数组的某个元素即可。如:
unset($_SESSION['user']);
注意:使用unset() 函数时,要注意$_SESSION数组中某元素不能省略,即不可以一次注销整个数组,这样会禁止整个会话功能,如 unset($_SESSION)函数会将全局变量$_SESSION销毁,而且没有办法将其恢复,用户也不能再注册$_SESSION变量,如要删除多个或全部会话,可采用下面的办法:
b:删除多个会话——如想要一次注销所有的会话变量,可以讲一个空的数组赋值给$_SESSION:
$_SESSION = array();
c:结束当前会话——如果整个会话已经结束,首先应该注销所有的会话变量,然后使用session_destroy() 函数清除结束当前的会话,并清空会话中的所有资源,彻底销毁session:
session_destroy();
3:session设置时间
1)客户端没有禁止Cookie:
a:使用session_set_cookie_params()设置Session的失效时间,此函数是Session结合Cookie设置失效时间,如要让Session 1分钟后失效:
$time = 1 * 60; // 失效时间 session_set_cookie_params($time); // 使用函数 session_start(); //初始化Session $_SESSION[username] = "mr";
注意:session_set_cookie_params() 必须在 session_start() 之前调用
b:使用setcookie()函数可对Session设置失效时间,如让Session在1分钟后失效:
session_start(); $time = 1 * 60; //给出session失效时间 $setcookie(session_name(),session_id(),time()+$time, "/"); //使用setcookie 手动设置session失效时间 $_SESSION['user'] = "MR";
说明:session_name 是 Session 的名称,session_id 是判断客户端用户的标识,因为session_id 是随机产生的唯一名称,所以Session是相对安全的。失效时间和Cookie的失效时间一样,最后一个参数为可选,是防止Cookie的路径
2)客户端禁止Cookie——当客户端禁用Cookie时,Session页面间传递会失效。解决此问题有4种方法:
a:在登录之前提醒用户必须打开Cookie,这是很多论坛的做法
b:设置php.ini 文件中的 session.use_trans_sid = 1, 或者编译时打开 -enable-trans-sid 选项,让PHP自动跨页面传递session_id。
c:通过GET方法,隐藏表单传递session_id
d:使用文件或者数据库存储session_id,在页面间传递中手动调用。这是最重要的一种,在开发企业网站时,如果遇到session文件使服务器速度变慢,就可以使用
第三种情况使用get方式传输,这种情况不可以使用Cookie设置保存时间,关键代码如下:
<form id="form1" name="form1" method="post" action="common.php?<?=session_name();?> = <?sesion_id(); ?>"> //接收页面头部详细代码: <?php $sess_name = session_name(); //取得Session名称 $sess_id = $_GET[$sess_name]; //取得session_id GET 方式 session_id($sess_id); //关键步骤 session_start(); $_SESSION['admin'] = 'mhesoft'; ?>
Session原理为:请求该页面之后会产生一个session_id(本质是个cookie),如果这个时候禁止了Cookie就无法传递session_id,在请求下一个页面时将会重新产生一个session_id,这样就造成了Session在页面间传递失效
注销用户的代码:
session_start(); //初始化Session unset($_SESSION['user']); //删除用户名会话变量 unset($_SESSION['pwd']); //删除密码会话变量 session_destroy(); // 删除当前所有的会话变量 header("location:index.php"); //跳转到登录页
4:Session的高级应用
1)session 临时文件——在服务器中,如果将所有用户的Session都保存到临时目录中,会降低服务器的安全性和效率,打开服务器存储的站点会非常慢。
使用php函数 session_save_path() 存储 Session 临时文件,可缓解因临时文件的存储导致服务器效率降低和站点打开缓慢的问题:
$path = './tmp/'; // 设置session 存储路径 session_save_path($path); session_start(); $_SESSION[username] = true; //注意:session_save_path() 函数应该再session_start()函数之前调用
2)session缓存——session 的缓存是将网页中的内容临时存储到IE客户端的Temporary Internet Files 文件夹下,并且可以设置缓存的时间。当第一次浏览网页后,网页的部分内容在规定的时间内就被临时存储在客户端的临时文件夹中,这样在下次访问这个页面时,就可以直接读取缓存中的内容,从而提高网站浏览效率
string session_cache_limiter( [string cache_limiter])
参数cache_limiter为public或private。同时session缓存并不是指在服务器端而是客户端缓存,在服务中没有显示
缓存时间的设置,使用的是session_cache_expire() 函数,语法如下:
int session_cache_expire( [int new_cache_expire] )
参数 cache_expire 是session 缓存的时间数字,单位是分钟
注意:这两个session 缓存函数必须在 session_start() 调用之前使用,否则出错
session_cache_limiter('private'); $cache_limit = session_cache_limiter(); //开启客户端缓存 session_cache_expire(30); $cache_expire = session_cache_expire(); //设定客户端缓存时间 session_start();
3)session 数据库存储—— session_set_save_handler() 函数。此函数的参数为6个函数
bool session_set_save_handler ( string open, string close, string read, string write, string destroy, string gc)
a:封装session_open() 函数,连接数据库
function _session_open($save_path, $session_name) { global $handle; $handle = mysql_connect('localhost', 'root', 'root') or die ('数据库连接失败'); //连接MySql数据库 mysql_select_db('db_database', $handle) or die('数据库中没有此库名'); //找到数据库 return (true); }
说明:$save_path和session_name 两个参数并没有用到,在这里可以将其去掉。建议输入,养成好的习惯
b:封装session_close() 函数,关闭数据库连接
function _session_close() { global $handle; mysql_close($handle); return true; } //说明:在这个参数中不需要任何参数,所以不论是session存储到数据库还是文件中,只需要返回true即可。但如果是MySql数据库,最好将数据库关闭
c:封装session_read() 函数,在函数中设定当前时间的UNIX 时间戳, 根据$key 值查找session名称及内容:
function _session_read($key) { global $handle; //全局变量$handle 连接数据库 $time = time(); //设定当前时间 $sql = "select session_data from tb_session where session_key = '$key' and session_time > $time "; $result = mysql_query($sql, $handle); $row = mysql_fetch_array($result); if ($row){ return $row['sesion_data']; //返回session名称及内容 }else{ return false } } /*说明:存储在数据库中的session_expiry 是unix时间戳 */
d:封装session_write()函数, 函数中设定session失效时间,查找到session名称及内容,如果查询结果为空,则将页面中session 根据 session_id、session_name、失效时间插入到数据库中;如果不为空,则根据$key修改数据库中session存储信息,返回执行结果:
function _session_write($key, $data) { global handle; $time = 60*60; //设置失效时间 $lapse_time = time() + $time; // 得到UNIX时间戳 $sql = "select session_data from tb_session where session_key = '$key' and session_time > $lapse_time "; $result = mysql_query($sql, $handle); if (mysql_num_rows($result) == 0){//没有结果 $sql = "insert into tb_session values('$key','$data',$lapse_time)"; $result = mysql_query($sql, $handle); }else{ $sql = "update tb_session set session_key = '$key', session_data = '$data', session_time = $lapse_time where session_key = '$key' "; $result = mysql_query($sql, $handle); } return $result; }
e:封装session_destroy() 函数,根据$key 值将数据库中Session 删除:
function _session_destroy($key) { global $handle; $sql = "delete from tb_session where session_key = '$key' "; $result = mysql_query($sql, $handle); return $result; }
f:封装session_gc() 函数,根据给出的失效时间删除过期session:
function _session_gc($expiry_time) { global $handle; $lexpiry_time = time();// 将$expiry_time 赋值为当前时间戳 $sql = "delete from tb_session where expiry_time < $expiry_time"; $result = mysql_query($sql, $handle); return $result; }
以上为session_set_save_handler() 函数的6个参数(函数)。通过它实现session存储数据库:
session_set_save_handler('_session_open', '_session_close', '_session_read', '_session_write', '_session_destroy', '_session_gc'); session_start(); //下面为我们定义的session $_SESSION['user'] = 'mr'; $_SESSION['pwd'] = 'mrsoft';
小结:session和cookie最大的区别是: session 是将 session 的信息保存在服务器上,并通过一个Session ID 来传递客户端的信息,同时服务器接收到Session ID 后,根据这个ID来提供相关的Session 信息资源;Cookie是将所有的信息以文本文件的形式保存在客户端,并由浏览器进行管理和维护。session更加安全和更容易控制。
第十二章:图形图像处理技术
1:在PHP中加载GD库—— GD库是一个开放的动态创建图像,源代码公开的函数库。GD库用于对图像的处理,在PHP5中默认安装。但要激活GD库,必须修改php.ini文件,将该文件中的 ";extension=php_gd2.dll" 注释取消掉,重启apache即可。成功加载GD2函数库后,可以通过phpinfo() 函数来获取GD2函数库的安装信息,验证GD库是否安装成功:
<?php echo phpinfo(); ?>
在浏览器中输入:127.0.0.1/phpinfo.php。
说明:如果使用集成化的安装包来配置php开发环境,就不必担心这个问题,因为在集成化安装包中,默认GD2函数已经被加载。另外Linux和windows系统下都可以使用GD库,函数也完全一致,但是图形的坐标会发生偏移,如果两个系统互相移植,必须重新查看界面
2:Jpgraph的安装于配置——强大的绘图组件,能根据用户的需要绘制任意图形。是一个完全使用php语言编写的类库。
1)将压缩包下的全部文件解压到一个文件夹中,如F:\AppServ\www\jpgraph
2)打开PHP的安装目录,编辑php.ini文件并修改其中的include_path 参数,在其后增加前面的文件夹名,如 include_path = ";F:\AppServ\www\jpgraph"
3)重新启动apache服务器生效
Jpgraph的配置
1)jpg-config.inc.php 文件的配置需修改以下两项:
a:支持中文的配置: DEFINE('CHINESE_TTF_FONT', 'bkai00mp.ttf');
b:默认图片格式的配置:根据当前php环境中支持的图片格式来设置默认的生成图片的格式。Jpgraph默认图片格式的配置可以通过修改DEFINE_GFORMAT的设置来完成。默认值auto变身Jgraph将依次按照PNG、GIF和JPEG的顺序来检索系统所支持的图片格式
DEFINE("DEFAULT_GFORMAT","auto");
注:如果用户使用的是Jpgraph2.3版本,那么不需要重新进行配置
注意:PHP最新版本,这两个库已经默认安装和开启,不需要进行另外配置!
3:图形图像的典型应用
1)创建一个简单的图像——使用GD2函数库可以实现各种图形图像的处理。创建画布是使用GD2函数库来创建图像的第一步,无论创建什么样的图像,首先都需要创建一个画布,其他操作都将在这个画布上完成。在GD2函数库中创建画布,可以通过imagecreate()函数实现
//使用imagecreate()函数创建一个宽200像素、高60像素的画布,并且设置画布 //背景颜色RGB值为(255,66。159),最后输出一个gif格式的图像: $im = imagecreate(200,60);//创建一个画布 $white = imagecolorallocate($im, 255,66,159);设置画布的背景色为粉色 imagegif($im); //输出图像
2)使用GD2函数在照片上添加文字——php中的GD库支持中文,但必须要以UTF-8格式的参数来进行传递,如果使用imageString()函数直接绘制中文字符串就会显示乱码
/*使用imageTTFText()函数将文字“长白山天池”以TTF(True Type Fonts)字体输出到图像中 */ header("content-type:image/jpeg");//通过header()函数定义输出图像类型 //通过imagecreatefromjpeg()函数载入照片 $im = imagecreatefromjpeg("images/photo.jpg"); //通过imagecolorallocate()设置输出字体颜色 $textcolor = imagecolorallocate($im, 56,73,136) //定义输出的中文字符串所使用的字体 $fnt = "c:/wimdows/fonts/simhei.ttf"; //通过iconv()函数对输出的中文字符串的编码格式进行转换 $motto = iconv("gb2312", "utf-8", "长白山天池"); //通过imageTTFText()函数向照片中添加文字 imageTTFText($im, 220,0,480,340,$textcolor, $fnt, $motto); //创建图像,并释放资源 imagejpeg($im); imagedestroy($im);
3)使用图像处理技术生产验证码
session_start(); // 初始化session变量 header("content-type:image/png"); //设置创建图像的格式 $image_width = 70; $image_height = 18; srand(microtime()*100000); // 设置随机数种子 //循环输出一个 4 位的随机数 for($i=0; $i<4, $++){ //dechex()函数把十进制转换为十六进制 $new_number .= dechex(rand(0,15)); } //将获取的随机数验证码写入到session变量中 $_SESSION[check_checks] = $new_number; //创建一个画布 $num_image = imagecreate($image_width, $image_height); //设置画布颜色 imagecolorallocate($num_image, 255,255,255); //循环读取session变量中的验证码 for ($i=0; $i<strlen($_SESSION[check_checks]); $i++){ //设置随即的字体 $font = mt_rand(3,5); //设置随即字符所在位置的X和Y坐标 $x = mt_rand(1,8) + $image_width * $i / 4; $y = mt_rand(1, $image_height / 4); //设置字符的颜色 $color = imagecolorallocate($num_image, mt_rand(0,100), mt_rand(0,150), mt_rand(0,200)); //水平输出字符 $imagestring($num_image, $font, $x, $y, $_SESSION[check_checks][$i], $color); } //生成PNG格式的图像,并释放图像资源 imagepng($num_image); imagedestroy($num_image);
/*创建一个用户登录的表单,并调用checks.php文件,在表单页面中输出图像的内容,提交表单信息 */ session_start(); //初始化session if ( $_POST["submit"] != ""){ $checks = $_POST["checks"]; //获取验证码文本框的值 if ($checks == ""){ echo "<script>alert('验证码不能为空');window.location.href='index.php';</script>"; } //如果用户输入验证码的值与随机生成的验证码值相等 if ($checks == $_SESSION[check_checks]){ echo "<script>alert('用户登录成功');window.location.href='index.php';</script> "; }else{ echo "<script>alert('你输入的验证码不正确');window.location.href='index.php';</script> "; } }
4)使用柱形图统计图书月销售量
5)使用折线图统计图书月销售量
6)使用3D饼形图统计各类商品的年销售额比率