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);
?>

posted @ 2018-01-03 15:00  ustc_rjgc2017  阅读(151)  评论(0编辑  收藏  举报