PHP基本整理3
会话控制(cookie和session)
简介
Cookie是存储在客户端浏览器中的数据,我们通过Cookie来追踪与存储用户数据。一般情况下,Cookie通过HTTP headers从服务器端返回到客户端。session是将用户的会话数据存储在服务端,没有大小限制,通过一个session_id进行用户识别,PHP默认情况下session id是通过cookie来保存的,因此从某种程度上来说,seesion依赖于cookie。但这不是绝对的,session id也可以通过参数来实现,只要能将session id传递到服务端进行识别的机制都可以使用session。
PHP通过setcookie函数进行Cookie的设置,任何从浏览器发回的Cookie,PHP都会自动的将他存储在$_COOKIE的全局变量之中,因此我们可以通过$_COOKIE['key']的形式来读取某个Cookie值。
Cookie经常用来: 存储用户的登陆信息,购物车等,且在使用会话Session时通常使用Cookie来存储会话id来识别用户,Cookie具备有效期,有效期结束之后,会自动从客户端删除。
设置Cookie
PHP中设置Cookie的最常用方法是使用setcookie函数:
setcookie(name,value,expire,path,domain);
- name:Cookie名,可以通过$_COOKIE['name']进行访问
- value:Cookie的值
- expire:过期时间,默认为零,表示浏览器关闭即失效
- path:如果路径设置为'/',则整个网站都有效。如果设置成'/path',那么就只在/path及其子路径/path/demo等下有效,根目录下就都不到cookie的值
- domain:默认整个域名都有效
示例代码:
$value = 'test';
setcookie("TestCookie",$value);
setcookie("TestCookie",$value,time()+3600);
setcookie("TestCookie", $value, time()+3600, "/path/", "imooc.com"); //设置路径与域
tip:如果是删除cookie,只需要把expire设置成当前时间之前,cookie就自动失效了,这样设计是为了简化http头。
setcookie("TestCookie",'',time()-1);
占坑:php设置cookie还有用setrawcookie和header直接设置两种方法
使用session
- 首先执行session_start方法开启session,然后用全局变量$_SESSION进行session的读写
session_start();
$_SESSION['test'] = time();
var_dump($_SESSION);
- session会自动对要设置的值进行encode和decode,因此session可以支持任意数据类型,数组和对象都是可以的。
session_start();
$_SESSION['ary']=array('name'=>'jobs');
$_SESSION['OBJ']=new stdClass();
var_dump($_SESSION);
- 删除session的方法是unset函数,删除后session就会从$_SESSION中去除,无法再访问。如果调用session_destroy,会删除掉所有数据,但是session_id仍然存在,而且这种删除是下次访问的时候$_SESSION才为空,如果要立即删除$_SESSION,就使用unset。
session_start();
$_SESSION['name']='jobs';
$_SESSION['time']=time();
unset($_SESSION['name']);
session_destroy();
tip:可以用session存储多种类型的数据,故用session存储用户登陆信息,购物车数据等很好。和cookie对比的话,cookie需要进行格式化和加密存储,session存储在服务器端很安全。还有,cookie只支持字符串类型。
看一个实例做个简单了解,加密解密函数不太懂,将就看一下。
<?php
session_start();
//假设用户登录成功获得了以下用户数据
$userinfo = array(
'uid' => 10000,
'name' => 'spark',
'email' => 'spark@imooc.com',
'sex' => 'man',
'age' => '18'
);
header("content-type:text/html; charset=utf-8");
/* 将用户信息保存到session中 */
$_SESSION['uid'] = $userinfo['uid'];
$_SESSION['name'] = $userinfo['name'];
$_SESSION['userinfo'] = $userinfo;
//* 将用户数据保存到cookie中的一个简单方法 */
$secureKey = 'imooc'; //加密密钥
$str = serialize($userinfo); //将用户信息序列化
//用户信息加密前
$str = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($secureKey), $str, MCRYPT_MODE_ECB));
//用户信息加密后
//将加密后的用户数据存储到cookie中
setcookie('userinfo', $str);
//当需要使用时进行解密
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($secureKey), base64_decode($str), MCRYPT_MODE_ECB);
$uinfo = unserialize($str);
echo "解密后的用户信息:<br>";
print_r($uinfo);
(码一下,读一遍手册之后再来自行补充)
PHP异常处理
PHP支持异常处理,异常处理是面向对象一个重要特性,PHP代码中的异常通过throw抛出,异常抛出之后,后面的代码将不会再被执行。异常抛出被用于在遇到未知错误,或者不符合预先设定的条件时,通知客户程序,以便进行其他相关处理,不至于使程序直接报错中断。
异常处理类
PHP有较多异常处理类,其中Exception是所有异常处理的基类。Exception具有几个基本属性和方法:
- message 异常消息内容
- code 异常代码
- file 抛出异常的文件名
- line 抛出异常在该文件的行数
常用方法有:
- getTrace 获取异常追踪信息
- getTraceAsString 获取异常追踪信息的字符串
- getMessage 获取出错信息
也可以自己继承Exception来建立自定义异常处理类
看一下代码示例就理解了:
//自定义的异常类,继承了PHP的异常基类Exception
class MyException extends Exception {
function getInfo() {
return '自定义错误信息';
}
}
try {
//使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
throw new MyException('error');//这里规定如何触发异常。注意:每一个 "throw" 必须对应至少一个 "catch",当然可以对应多个"catch"
} catch(Exception $e) {//"catch" 代码块会捕获异常,并创建一个包含异常信息的对象
echo $e->getInfo();//获取自定义的异常信息
echo $e->getMessage();//获取继承自基类的getMessage信息
}
tip:码一下,未完待续
数据库操作
安装插件的话主流数据库基本都支持。LAMP用的是MySQL和PHP嘛,所以PHP和MySQL是好基友,简单了解一下PHP操作MySQL
直接码函数就行了,大部分操作插入删除什么的得会一些基本的MySQL的语句,可以回顾一下MySQL的整理.
<?php
/*
* header();
* 这一行规定html的编码方式
*/
header("Content-type:text/html;charset=utf-8");
/*******
* mysqli_connect
* 作用:建立数据库的连接
* 参数:ip地址,数据库用户名,密码
* 返回值:1.连接成功时返回mysql链接标识符
* 2.连接失败返回false
*******/
if($con=mysqli_connect('localhost','root','')){
echo 'success 成功'.'<br>';
}
else{
echo 'fail'.'<br>';
}
/******
* mysqli_select_db()
* 作用:选择数据库
* 参数:mysql链接标识符,数据库名
* 返回值:1.成功返回true
* 2.返回失败false
******/
if(mysqli_select_db($con,'test'))
{
echo 'yes<br>ok';
}
else{
echo 'no';
}
/*******
* mysqli_query()
* 作用:执行sql命令
* 参数:mysql链接标识符,sql命令
* 规定传输数据的类型
* 返回值:1.insert情况下,成功true
* 2.insert情况下,失败false
* 3.select情况下,执行成功返回资源标识符,即返回的信息地址
*******/
mysqli_query($con,'set names utf8');
mysqli_query($con,$sql);
$query = mysqli_query($con,'select * from test');
mysqli_fetch_row($con,$query);
//读取一行,以数组形式返回出来,前一条读到最后了的话,再次执行返回空
//返回的是一个以为索引数组,每一个下标与数据库里的字段排序相对应
//全读出的写法,用个while
while($row=mysqli_fetch_row($query))
{
print_r($row);
}
/********
*mysqli_error
* 作用:返回上一个MySQ操作产生的文本错误信息
* 参数:(可选mysql标识符)
* 返回值:文本错误信息
********/
echo mysqli_error();
/********
* mysqli_close();
* 作用:关闭数据库
* 参数:
********/
mysqli_close($con);
?>