Cookie、Session、XForms、文件上传

Cookie

php可以在用户感知不到的情况下支持HTTP cookie,cookie是在客户端浏览器存储的用户来跟踪识别用户身份的机制。在php中可以用setcookie() 或 setrawcookie() 函数设置cookie。cookie是HTTP头的一部分,所以setcookie()函数必须在输出其他信息到浏览器之前调用。

如果 variables_order 中包括“C”,则任何从客户端发送的 cookie 都会被自动被放进$_COOKIE全局数组。如果希望对一个 cookie 变量设置多个值,则需在 cookie 的名称后加 [] 符号。

解释一下variables_order:这是php.inpi配置文件中的一个配置项,用来设置全局变量的解析,他有5个值:EGPCS,分别表示Environment, Get, Post, CookieServer,栗子:如果variables_order=SP,php就会创建全局数组$_SERVER,$_POST。

cookie基本用法

setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )

参数说明:

name:cookie的变量名。
value:变量值。
expire:过期时间。
path:cookie生效的路径,如果设置“/“表示在整个域名都有效,如果设置为”/xyy/“,表示只有在xyy目录以及它的子目录下有效。
domain:设置cookie生效的域名,栗子:如果设置成php.com,那么所有包含php.com的域名都可以使用这个cookie,如:www.100php.com或www.100php.com.cn
secure:如果这个值设置为true,那么只有通过HTTPS连接客户端时才会传递这个cookie。
httponly:如果设为true,客户端浏览器的js脚本将不能获取到这个cookie的值。

Session

session(会话)用来保存用户访问web应用时的数据,举个栗子:女神在逛淘宝的时候,看到各种衣服、化妆品、如果每看见一个喜欢的东西就立刻购买、支付,那样会很麻烦,于是就有了购物车这个东西,女神可以把所有的东西先添加购物车,然后一次性支付。即使女神添加完购物车,不小心把页面关了,再次打开的时候,发现购物车里面的东西还在,这就是session起的作用了,女神添加购物车的时候,实际上是向session中写数据,session中的数据是临时的,当会话结束后session的数据会被销毁,如果想永久的保存session数据,可以放在数据库中。

session的工作机制是这样的:当有新的用户访问web应用时,为这个用户创建唯一的UID,基于这个UID来存储变量,UID保存在cookie中,当客户端禁用了cookie,只能通过URL进行传递了。

session的基本用法

session_start():开启一个会话,如果想返回一个已经存在的会话,需要把会话的ID作为一个参数传进去,并且最好把这个函数放在最开始调用,切在它之前不能有其他输出,否则会报个warning.

session_register(string name):注册一个新的session变量,注册的变量可以用$_SESSION[name]或$HTTP_SESSION_VARS[name]的形式来取值或赋值。

session_unregister(string name) :把注册的变量名删除,和session_unset()用法相同

session_is_registered(string name):检查变量名是否被注册

session_destroy():结束当前会话,清空会话中的数据。

session_name(string name): 读写当前会话名称,传name参数表示设置当前会话名称为name,不传表示获取名称。

session_id(string [id]):读写会话id.

处理XForms

XForms是区别于传统web表单的另外一种form,它和form的区别是,html数据发送格式是application/x-www-form-urlencoded,但是XForm的格式是XML。当使用XForms提交表单时,$HTTP_RAW_POST_DATA中包含了由浏览器产生的XML文件,可以将这个XML文件传递给其他喜欢XML文件的引擎或文档解析器处理。

XForms栗子:

Cookie、Session、XForms、文件上传_第1张图片

这个栗子中method设置为urlencoded-post表示将数据以原始的方式提交到$_POST变量中。

文件上传处理

用POST方法可以上传文本和二进制文件,在php.ini文件中通过这些选项来设置上传文件的一些限制: file_uploads,upload_max_filesize,upload_tmp_dirpost_max_size 以及 max_input_time。

文件上传表单栗子:

Cookie、Session、XForms、文件上传_第2张图片

enctype=multipart/form-data表示接收除了文本之外的其他文件类型,MAX_FILE_SIZE表示上传文件的最大尺寸,单位字节,如果用户上传了超过这个尺寸的文件,会立刻返回错误信息。

上传的文件信息会保存在$_FILES数组里,数组中共有这些内容:

$_FILES['userfile']['name’]:客户端机器文件的原名称。
$_FILES['userfile']['type’]:文件的 MIME 类型,如果浏览器提供的话,如果不提供则为空。栗子:“image/gif”。
$_FILES['userfile']['size’]:已上传文件的大小,单位为字节。
$_FILES['userfile']['tmp_name’]:文件被上传后在服务端储存的临时文件名。
$_FILES['userfile']['error’]:和该文件上传相关的错误代码。

文件被上传后,默认地会被储存到服务端的默认临时目录中,可以在 php.ini 中设置upload_tmp_dir来改变默认路径。

使用文件上传表单需要注意的事:对 MAX_FILE_SIZE 设置的值,不能大于 ini 设置中 upload_max_filesize 选项设置的值,默认值为 2M,而且不能大于post_max_size 设置的值。

如果 max_execution_time 设置的值太小,脚本运行的时间可能会超过该设置。因此,也要保证 max_execution_time 足够的大。max_execution_time 仅仅只影响脚本本身运行的时间。任何其它花费在脚本运行之外的时间,诸如用函数 system() 对系统的调用、sleep() 函数的使用、数据库查询、文件上传等,在计算脚本运行的最大时间时都不包括在内。max_input_time 以秒为单位设定了脚本接收输入的最大时间,包括文件上传。对于较大或多个文件,或者用户的网速较慢时,可能会超过默认的 60 秒。

处理上传的文件

用is_uploaded_file()函数判断文件名是不是通过post表单上传的,参数是文件名,绝对路径或相对路径。

move_uploaded_file ( string $filename , string $destination ),把上传的文件移动到指定目录。

上传一组文件:

在表单中文件名后面加[]即可,栗子:

Cookie、Session、XForms、文件上传_第3张图片

在服务端用$_FILES["pictures”]获取到的是保存多个文件信息的二维数组,通过遍历数组处理每个文件:
 
 
foreach ($_FILES["pictures"]["error"] as $key => $error) {

if ($error == UPLOAD_ERR_OK) {

    $tmp_name = $_FILES["pictures"]["tmp_name"][$key];

    $name = $_FILES["pictures"]["name"][$key];

    move_uploaded_file($tmp_name, "data/$name");
}

}

常见的错误码,就是$_FILES["pictures"]["error”]的值:

UPLOAD_ERR_OK :其值为 0,没有错误发生,文件上传成功。
UPLOAD_ERR_INI_SIZE:其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
UPLOAD_ERR_FORM_SIZE:其值为 2,上传文件的大小超过了 HTML 表单中MAX_FILE_SIZE 选项指定的值。
UPLOAD_ERR_PARTIAL:其值为 3,文件只有部分被上传。
UPLOAD_ERR_NO_FILE:其值为 4,没有文件被上传。
UPLOAD_ERR_NO_TMP_DIR:其值为 6,找不到临时文件夹。
UPLOAD_ERR_CANT_WRITE:其值为 7,文件写入失败。

你可能感兴趣的:(Cookie、Session、XForms、文件上传)