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 提供了一种新的面向对象的错误处理方法。
异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。
当异常被触发时,通常会发生:
- 当前代码状态被保存
- 代码执行被切换到预定义的异常处理器函数
- 根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本
- 异常的基本使用
当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 "catch" 代码块。
如果异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么将发生一个严重的错误(致命错误),并且输出 "Uncaught Exception" (未捕获异常)的错误消息。
尝试抛出一个异常,同时不去捕获它:
所以,正确的处理程序应当包括:
- Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
- Throw - 这里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"
- Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象
触发一个异常:
解释:
上面的代码抛出了一个异常,并捕获了它:
- 创建 checkNum() 函数。它检测数字是否大于 1。如果是,则抛出一个异常。
- 在 "try" 代码块中调用 checkNum() 函数。
- checkNum() 函数中的异常被抛出
- "catch" 代码块接收到该异常,并创建一个包含异常信息的对象 ($e)。
- 通过从这个 exception 对象调用 $e->getMessage(),输出来自该异常的错误消息
异常的规则:
- 需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。
- 每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。
- 使用多个 catch 代码块可以捕获不同种类的异常。
- 可以在 try 代码块内的 catch 代码块中再次抛出(re-thrown)异常。
简而言之:如果抛出了异常,就必须捕获它。
过滤器(Filter)
- 什么是 PHP 过滤器?
PHP自带的,用于验证和过滤来自非安全来源的数据,比如用户的输入。 - 什么是外部数据?
来自表单的输入数据
Cookies
服务器变量
数据库查询结果 - 过滤函数
常用过滤函数:
- filter_var() - 通过一个指定的过滤器来过滤单一的变量
- filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
- filter_input - 获取一个输入变量,并对它进行过滤
- filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤
用 filter_var() 函数验证了一个整数:
上面的代码使用了 "FILTER_VALIDATE_INT" 过滤器来过滤变量。由于这个整数是合法的,因此代码的输出是:"Integer is valid"。
假如我们尝试使用一个非整数的变量,则输出是:"Integer is not valid"。
过滤函数:
- 过滤器
有两种过滤器Validating 和 Sanitizing:
- Validating 过滤器:
用于验证用户输入
严格的格式规则(比如 URL 或 E-Mail 验证)
如果成功则返回预期的类型,如果失败则返回 FALSE - Sanitizing 过滤器:
用于允许或禁止字符串中指定的字符
无数据格式规则
始终返回字符串
过滤器: