PHP高级教程(二)

Cookies

  • 什么是 Cookie?
    cookie 常用于识别用户。cookie 是服务器留在用户计算机中的小文件。每当相同的计算机通过浏览器请求页面时,它同时会发送 相同的cookie。通过 PHP,服务端能够创建并读取 cookie 的值。
  • 如何创建 cookie?
    setcookie() 函数用于设置 cookie。
    注意:setcookie() 函数必须位于 标签之前。
    setcookie(name, value, expire, path, domain);
    创建名为 "user" 值为 "Alex Porter"的 cookie。规定了此 cookie 在一小时后过期。

    注意:在发送 cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码(为防止 URL 编码,请使用 setrawcookie() 取而代之)。所以存在浏览器的cookie,有的是被url编码后的形式。
  • 如何读取 Cookie 的值?
    PHP 的 $_COOKIE 变量用于读取 cookie 的值。
    打印名为user的cookie的值,打印所有cookie。

    isset()函数可确认是否已设置cookie
  • 如何删除 cookie?
    服务端要删除浏览器的cookie,设置cookie的过期日期变更为过去的时间点。

Sessions

PHP session 变量用于存储有关用户会话的信息,或更改用户会话的设置。Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用。
Session 的工作机制是:为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,亦或通过 URL 进行传导。服务端中保存着以PHPSESSID的值命名的文件中存有对应浏览器/用户的session。

  • 开始 PHP Session
    在把用户信息存储到 PHP session 中之前,首先必须启动会话。
    即在使用session前,必须先session_start()。
    注意:session_start() 函数必须位于 标签之前

    上面的代码会向服务器注册用户的会话,以便您可以开始保存用户信息,同时会为用户会话分配一个 UID。
  • 存储 Session 变量
    存储,读取和修改 session 变量的正确方法是使用 PHP $_SESSION 变量

应用session做的访问计数器

  • 终结 Session
    如果希望删除某些 session 数据,可以使用 unset() 或 session_destroy() 函数。
    unset() 函数用于释放指定的 session 变量:

    通过 session_destroy() 函数彻底终结 session:
    session_destroy() 将重置 session,将失去所有已存储的 session 数据。

错误处理

默认的错误处理很简单。一条消息会被发送到浏览器,这条消息带有文件名、行号以及一条描述错误的消息。
类似这样

不安全的错误处理会暴露很多敏感信息,比如网站的绝对目录
以下是三种错误处理方法:

  • 使用 die() 函数
    当用fopen函数打开一个不存在的文件时,会爆出类似错误:

    为了避免用户获得上面的信息,在访问文件之前检测该文件是否存在

    如果文件不存在,用户只会获得这样的信息:

    同时,这种错误处理会终止脚本运行,这会显得有点不合适。
  • 创建自定义错误处理器
    创建一个专用函数,可以在 PHP 中发生错误时调用该函数。
    该函数必须有能力处理至少两个参数 (error level 和 error message),但是可以接受最多五个参数(可选的:file, line-number 以及 error context):


    创建一个处理错误的函数:

    处理错误的函数有了,现在需要把他设置成错误处理函数,让php认识他。

    通过

    使我们的自定义函数来处理所有错误,可以添加第二个参数来规定处理错误的级别。
    最后的实例:

    输出:

主动触发错误
某些时候我们想主动触发错误,比如某个变量当用户输入大于1时触发错误
可以使用trigger_error()来完成

会爆出

通过添加的第二个参数,能够规定所触发的错误级别
再结合自定义错误处理函数,就是以下例子:
如果 "test" 变量大于 "1",则发生 E_USER_WARNING 错误。如果发生了 E_USER_WARNING,我们将使用我们的自定义错误处理程序并结束脚本

输出:

  • 错误记录
    默认地,根据在 php.ini 中的 error_log 配置,PHP 向服务器的错误记录系统或文件发送错误记录。通过使用 error_log() 函数,可以向指定的文件或远程目的地发送错误记录。

异常处理

异常(Exception)用于在指定的错误发生时改变脚本的正常流程。

  • 什么是异常?
    PHP 5 提供了一种新的面向对象的错误处理方法。
    异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。
    当异常被触发时,通常会发生:
  1. 当前代码状态被保存
  2. 代码执行被切换到预定义的异常处理器函数
  3. 根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本
  • 异常的基本使用
    当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 "catch" 代码块。
    如果异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么将发生一个严重的错误(致命错误),并且输出 "Uncaught Exception" (未捕获异常)的错误消息。
    尝试抛出一个异常,同时不去捕获它:

    所以,正确的处理程序应当包括:
  1. Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
  2. Throw - 这里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"
  3. Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象

触发一个异常:

解释:
上面的代码抛出了一个异常,并捕获了它:

  1. 创建 checkNum() 函数。它检测数字是否大于 1。如果是,则抛出一个异常。
  2. 在 "try" 代码块中调用 checkNum() 函数。
  3. checkNum() 函数中的异常被抛出
  4. "catch" 代码块接收到该异常,并创建一个包含异常信息的对象 ($e)。
  5. 通过从这个 exception 对象调用 $e->getMessage(),输出来自该异常的错误消息

异常的规则:

  • 需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。
  • 每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。
  • 使用多个 catch 代码块可以捕获不同种类的异常。
  • 可以在 try 代码块内的 catch 代码块中再次抛出(re-thrown)异常。

简而言之:如果抛出了异常,就必须捕获它。

过滤器(Filter)

  • 什么是 PHP 过滤器?
    PHP自带的,用于验证和过滤来自非安全来源的数据,比如用户的输入。
  • 什么是外部数据?
    来自表单的输入数据
    Cookies
    服务器变量
    数据库查询结果
  • 过滤函数
    常用过滤函数:
  1. filter_var() - 通过一个指定的过滤器来过滤单一的变量
  2. filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
  3. filter_input - 获取一个输入变量,并对它进行过滤
  4. filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤

用 filter_var() 函数验证了一个整数:

上面的代码使用了 "FILTER_VALIDATE_INT" 过滤器来过滤变量。由于这个整数是合法的,因此代码的输出是:"Integer is valid"。
假如我们尝试使用一个非整数的变量,则输出是:"Integer is not valid"。

过滤函数:

  • 过滤器
    有两种过滤器Validating 和 Sanitizing:
  1. Validating 过滤器:
    用于验证用户输入
    严格的格式规则(比如 URL 或 E-Mail 验证)
    如果成功则返回预期的类型,如果失败则返回 FALSE
  2. Sanitizing 过滤器:
    用于允许或禁止字符串中指定的字符
    无数据格式规则
    始终返回字符串

过滤器:

posted @ 2020-06-23 15:38  雨九九  阅读(200)  评论(0编辑  收藏  举报