1. 知识点1HTML表单控件

主要的表单控件:文本框、密码框、单选框、多选框、下拉列表、文字域、图片域、隐藏域、提交按钮、重置按钮等都需要温习。

其中最重要的就是多选框,在PHP中命名多选框是比较特殊的,需要用[]来命名,一组多选的idname在命名上都是需要注意的。PHP页面如何接收各种控件的值都需要单独练习。尤其是多选项在接收后是一个数组结构的数据,在存入数据库前需要转化成字符串再入库。

代码示范如下:

文本框:<input type="text" name="username" id="username" />

密码框:<input type="password" name="password" id="password" />

单选项:

<input value="" name="sex" checked="checked" type="radio">

<input value="" name="sex" type="radio">

下拉列表:

<select name="city">

<option value="北京">北京</option>

<option value="上海">上海</option>

<option value="天津">天津</option>

</select>

多选框:

<input name="fonds[]" type="checkbox" value="服装">服装

<input name="fonds[]" type="checkbox" value="电子">电子

<input name="fonds[]" type="checkbox" value="图书">图书

<input name="fonds[]" type="checkbox" value="食品">食品

【提示:需要特别注意的是PHP中对于多选项的命名。】

隐藏域:<input type="hidden" name="id" value="100" />

提示:隐藏域的使用目的是为了隐式传值,所以必须有value值才有意义。

文字域:<textarea name="info" id="info"></textarea>

提交:<input name="submit" type="submit" value="注册">

重置:<input name="reset" type="reset" value="重置">

每种控件一般常用属性都需要写,name属性为了表单传值;id属性主要用于样式和表单脚本验证;Value属性表示控件初始值,视情形而定;size属性主要是定义控件的大小;maxlength属性定义最大允许输入内容的长度。

 

1. 知识点2:正则表达式及其应用

定义:正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。

 

正则表达式常用字符:

 

1) \  将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。 

2) ^  匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,也匹配 '\n' 或 '\r' 之后的位置。 

3) $  匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,也匹配 '\n' 或 '\r' 之前的位置。 

4) *  匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"等价于{0,}。 

5) +  匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"等价于 {1,}。 

6) ?  匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 等价于 {0,1}。 

7) {n}  n 是一个非负整数。匹配确定的 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 

8) {n,}  n 是一个非负整数。至少匹配次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o'o{1,}' 等价于 'o+''o{0,}' 则等价于 'o*'。 

9) {n,m}  m 和 均为非负整数,其中n <= m。最少匹配 次且最多匹配 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 

10) ?  当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo"'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。 

11) .  匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。 

12) (pattern)  匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。 

13) x|y  匹配 或 y。例如,'z|food' 能匹配 "z" 或 "food"'(z|f)ood' 则匹配 "zood" 或 "food"。 

14) [xyz]  字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。 

15) [^xyz]  负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。 

16) [a-z]  字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。 

17) [^a-z]  负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。 

18) \b  匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 

19) \B  匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 

20) \d  匹配一个数字字符。等价于 [0-9]。 

21) \D  匹配一个非数字字符。等价于 [^0-9]。 

22) \n  匹配一个换行符。等价于 \x0a 和 \cJ。 

23) \r  匹配一个回车符。等价于 \x0d 和 \cM。 

24) \s  匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 

25) \S  匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 

26) \t  匹配一个制表符。等价于 \x09 和 \cI。 

27) \v  匹配一个垂直制表符。等价于 \x0b 和 \cK。 

28) \w  匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 

29) \W  匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 

30) \num  匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。 

\n  标识一个八进制转义值或一个向后引用。如果 \n 之前至少 个获取的子表达式,则 为向后引用。否则,如果 为八进制数字 (0-7),则 为一个八进制转义值。

1) \  将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。 

2) ^  匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,也匹配 '\n' 或 '\r' 之后的位置。 

3) $  匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,也匹配 '\n' 或 '\r' 之前的位置。 

4) *  匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"等价于{0,}。 

5) +  匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"等价于 {1,}。 

6) ?  匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 等价于 {0,1}。 

7) {n}  n 是一个非负整数。匹配确定的 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 

8) {n,}  n 是一个非负整数。至少匹配次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o'o{1,}' 等价于 'o+''o{0,}' 则等价于 'o*'。 

9) {n,m}  m 和 均为非负整数,其中n <= m。最少匹配 次且最多匹配 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 

10) ?  当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo"'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。 

11) .  匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。 

12) (pattern)  匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。 

13) x|y  匹配 或 y。例如,'z|food' 能匹配 "z" 或 "food"'(z|f)ood' 则匹配 "zood" 或 "food"。 

14) [xyz]  字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。 

15) [^xyz]  负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。 

16) [a-z]  字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。 

17) [^a-z]  负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。 

18) \b  匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 

19) \B  匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 

20) \d  匹配一个数字字符。等价于 [0-9]。 

21) \D  匹配一个非数字字符。等价于 [^0-9]。 

22) \n  匹配一个换行符。等价于 \x0a 和 \cJ。 

23) \r  匹配一个回车符。等价于 \x0d 和 \cM。 

24) \s  匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 

25) \S  匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 

26) \t  匹配一个制表符。等价于 \x09 和 \cI。 

27) \v  匹配一个垂直制表符。等价于 \x0b 和 \cK。 

28) \w  匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 

29) \W  匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 

30) \num  匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。 

\n  标识一个八进制转义值或一个向后引用。如果 \n 之前至少 个获取的子表达式,则 为向后引用。否则,如果 为八进制数字 (0-7),则 为一个八进制转义值。

n jQuery核心:

length、

size()

n jQuery选择器:

基本选择器(id选择器,类选择器,元素选择器)

后代选择器

子选择器

n jQuery属性:

attr()

removeAttr()

addClass() , removeClass()

html()

val()

n 文档处理:

删除:empty()

n CSS:

css()

 

表单验证的具体做法:

 

验证每个控件使用一个独立的验证函数。在每个表单控件的onblur事件中触发该函数。

 

例如以下代码。该函数用于验证用户帐号是否合法。首先先判断提交的信息是否为空,如果空,则提示,并返回false;然后判断帐号长度是否符合规范,如果不规范,也返回false;其次验证提交信息是否符合帐号的正则表达式,如果不匹配,函数也返回false;最后利用ajax技术,验证该帐号是否在数据库中存在,无论是否存在,都将异步访问页面的返回值显示到本页面中。因为ajax回调函数的返回true或者false不会影响到当前函数,所以需要注意的是此时需要借助一个全局变量flag。也就是根据异步访问的结果来对全局变量flag重新赋值。根据这个全局变量,我们可以得知这个外部函数是否返回false。

 

 

 

示例代码如下:

var flag  =  false;

function checkUsername() {

var input_val  =  $("#username").val();

if(input_val == "") {

$("#lblName").html("登录帐户名不可以为空!");

return false;

} else {

if(input_val.length<5 || username_val.length>15) {

$("#lblName").html("帐户名必须为515位!");

return false;

} else {

var Pattern=/^(bwie|admin)/i;

if(Pattern.test(input_val) == true) {

$("#lblName").html("帐号中不得使用本站保留关键词作为开头,请重新注册!");

return false;

} else {

var loadUrl = "register.php" ;

$.post(loadUrl,{user:input_val},function(msg) {

if(msg.indexOf("true")>=0) {

$("#lblName").html("该帐户未被注册,通过验证!");

flag = true;

} else {

$("#lblName").html("该用帐户已被注册,请重新填写!");

flag = false;

}

});

return flag;

}

}

}

}

 

每个控件验证使用一个独立的验证函数。最后在提交按钮上增加onClick事件。该事件return提交函数checkSubmit()的返回值。代码如下:

 

<input type="submit" value="submit" onClick="return checkSubmit();"/>

 

提交函数checkSubmit()中就是集中对每个控件的验证函数做判断,如果返回false。则提交函数也返回false。为了实现点击提交按钮后,所有的报错信息一次性集中显示,那么可以采用提交函数内使用局部变量flag1的形式。

 

 

 

示例代码如下:

function checkSubmit() {

var flag1 = true;

if(checkUsername() == false) flag1 = false;

//省略

if(checkRandcode() == false) flag1 =  false;

return flag1;

}

1. 知识点4Ajax技术

Ajax技术越来越多应用在网站开发的各个环节,局部刷新的技术使得以前不容易实现的效果很轻松得以实现。先给同学们演示主要门户网站使用Ajax技术的地方,对比普通页面自己体会前者的优点。激发同学们的好奇心后在讲解技术点。

表单验证中使用了Ajax技术,对于用户来说,提示了用户感受,但是也增加程序上的难度。难点在于用户注册帐号除了验证是否格式正确外,未提交前还要判断出该帐号是否在数据库中存在。验证码也是如此,不仅判断格式是否正确外,还要在未提交前判断出输入的验证码与验证码图片是否完全相符。如果注册帐号和验证码输入错误,提交按钮就无法生效。使用了Ajax技术后,注册页面的效果立刻得到提升。

具体讲解内容如下:

n Ajax的概念:ajax是asynchronous javascript and xml的缩写,是javascript、xml、css、DOM等多个技术的组合。这个技术可以实现客户端异步请求操作,也就是在不需要刷新页面的情况下与服务器通信,减少用户等待时间。

n Ajax的工作原理:页面中用户的请求通过ajax引擎与服务器进行通信,服务器将返回的结果提交给客户端页面中的ajax引擎,由这个引擎来决定讲返回的数据插入到页面中指定位置。这样就实现了在不刷新整个页面的情况下,对部分数据进行更新,从而降低了网络流量,增强了客户体验的友好程度。

n Ajax的优缺点:

优点是:减轻了服务器端负担,将一部分以前由服务器负担的工作转移到客户端执行,利用客户端闲置的资源进行处理;在无刷新的情况下更新页面,增加了页面反应速度,使用户体验更友好。缺点是:不利于seo推广优化,因为搜索引擎无法直接访问到ajax请求的内容。必须通过类似网站地图一类的手段来弥补该损失。

n Ajax的核心技术:

Ajax的核心技术是XMLHttpRequest,它是javascript中的一个对象,是microsoft1999年在ie5.0中首推的。因为XMLHttpRequest不是W3C的标准,所以在不同浏览器下对它初始化的方法也不同。IE浏览器初始化XMLHttpRequest:

xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");

或者:

xmlHttp = new ActiveXObject("Mmicrosoft.XMLHTTP");

非IE浏览器初始化XMLHttpRequest:(如:Mozilla,safari)

xmlHttp = new XMLHttpRequest();

备注:在ie7.0及以后的版本也都支持new XMLHttpRequest()来初始化XMLHttpRequest。

n 使用jQuery简化Ajax操作

为避免产生困扰,此处仅仅列出了两种最常用的方法,等熟悉ajax操作后再返回学习其它的ajax写法。

推荐使用以下两种方法,$.get()与$.post()。$.get()与$.post()函数都是三个参数,分别是请求的服务器端地址、要从客户端传递的参数、回调函数。两者的区别主要在于访问的url页面如何接收参数,$_GET/$_POST/$_REQUEST,如果使用$_REQUEST来接收参数,则两者使用无区别。

 

示例代码如下:

function callServer_post() {

var loadUrl = 'translate.php';

$.post(loadUrl,{words: $('#words').val()},function(msg){

$("#result").html(msg);

});

}

//方法二,使用$.get()

function callServer_get(){

var loadUrl = 'translate.php';

$.get(loadUrl,{words: $('#words').val()},function(msg){

$("#result").html(msg);

});

}

 

n 使用Ajax技术的注意事项:如果使用$.get()方法,并且参数是直接写在异步访问的地址中的,那么需要注意以下情况。

 

a) 页面缓存问题:为了避免页面缓存造成的困扰。需要在异步访问的地址中增加随机码。建议利用时间戳来实现。在地址中增加new Date().getTime()。

 

b) 中文传参乱码问题:为了避免get传参时出现字符集不统一问题。需要在参数传递前进行编码,在接收页面无需转码,会自动转换。在javascript中有一个与PHP中urlencode()函数等效的函数encodeURI()。

 

示例代码如下:

function translate() {

var loadUrl = 'translate.php? ' + new Date().getTime() + '&words=' + encodeURI($('#words').val());

$.get(loadUrl,{},function(msg) {

$("#result").html(msg);

});

}

 

1. 知识点5:会话控制

 

Session技术是网站技术中不可或缺的一个重点。主要用户跟踪用户的登录信息,实现跨页面传值。为了讲解会话控制,首先也是给同学们展示效果。如果网站地址被公开,如果没有使用session技术的页面一定会被任何人访问,而根本没有安全性可言。如果使用session,则起到了页面访问权限的问题。为了激起同学们的兴趣,以QQ帐号登录为例子,如果同一个帐号在多地被使用,后者将前者踢下线。如何做到的呢?先让大家思考,然后讲解SESSIONID的概念。

 

具体讲解内容如下:

 

n 会话控制的概念:

 

简单地说会话控制就是跟踪和识别用户信息的机制。会话控制的思想就是能够在网站中跟踪一个变量,通过这个变量,系统能识别出相应的用户信息,根据这个用户信息可以得知用户权限,从而展示给用户适合于其相应权限的页面内容。目前最主要的会话跟踪方式有cookie,session。

 

n Cookie的概念:

 

cookie是一种在远程浏览器端存储数据并以此数据来跟踪和识别用户的机制。

 

cookie可以简单地理解为是用户访问某个网站,web服务器暂时存储在用户硬盘上的一个文本文件,当用户再次访问该网站,浏览器会通过读取客户端cookie文件记录来查看访客的特定信息,从而迅速做出响应,比如在页面中可以不需要输入用户名和密码就直接登录网站等等。当然这么理解的前提是不考虑会话cookie,因为会话cookie不将用户信息储存在硬盘上,而是仅仅存储在内存中,当当前页面关闭而随之消亡。

 

cookie常常被用于三个方面:

 

1. 记录用户访问的部分信息:比如用户访问该页面的次数,上次访问的时间,上次登录的用户名等。

 

2. 在页面间传递变量:当一个页面声明了一个变量,并赋值后,一旦该页面关闭,则该变量的值也随之消失,如果需要该变量传值到下一个页面,可以通过表单、url地址传值外,还可以通过cookie传递。

 

3. 将所查看的internet页存储在cookies临时文件夹中,可以提高以后的浏览速度。

 

n 创建cookie:

 

setcookie(string cookiename , string value , int expire);

 

1.  cookiename是需要设置的cookie的名字,将来需要调用时可以通过$_COOKIE[cookiename]来获取其中的值;

 

2.  expire为cookie的失效时间,是标准的UNIX时间标记,如果不设置失效时间,那么cookie的生命周期就是浏览器会话期间,一旦这个页面关闭了,相应的cookie也就自动消失。这种cookie就是会话cookie,它不会被保存在硬盘上,而是只保存于内存中。

 

例如:setcookie('visitcount' , $count , time()+60);

 

有效时间一般是当前时间戳加需要延长的时间秒数。本例意思是名字是visitcount的cookie的有效时间为60秒。当前时间戳可以通过time()/mktime()来获取。

 

特别备注:cookie是HTTP文标的组成部分,而头标必须在页面任何内容发送之前发送,也就是说必须最先输出,即便是在setcookie()前输出了一个html标记或者echo语句都不可以,甚至连一个空行都导致程序错误。

 

n 读取cookie:通过超级全局数组$_COOKIE来读取浏览器端的cookie的值。

 

例如:欢迎您第 <?php echo $_COOKIE[visitcount] ?> 次访问本页面。

 

n 删除cookie:有两种方法:

 

1.手工删除方法:右击浏览器属性,可以看到删除cookies,执行操作即可将所有cookie文件删除。

 

2.setcookie()方法:跟设置cookie的方法一样,不过此时将cookie的值设置为空,失效时间小于当前时间戳。

 

例如:setcookie('visittime' , '' , 0);

 

setcookie('visittime' , '' , time()-1);

 

n cookie的生命周期:

 

1. 没有设置有效期的cookie:

 

没有设置有效期的cookie也就是会话cookie,该cookie不会被保存成硬盘中的txt文件,而是保存在内存中,一旦当前浏览器窗口关闭,则cookie自动消失,也就是该cookie的生命周期结束。

 

2. 设置了有效期的cookie:设置了有效期的cookie会保存到硬盘COOKIES目录下的txt文件中。只有当到期或者手工删除才会消亡。

 

3. 虽然cookie可以长期保存在客户端浏览器中,但浏览器允许存储最多300个cookie文件,而且每个cookie文件的最大容量为4kb;此外每个域名也最多支持保存20个cookie,如果达到了限制,那么浏览器会自动随机删除cookies。

 

n cookie的更多参数:

 

bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure]]]]] )。

 

setcookie() 参数详解

参数 说明 举例
name Cookie 的名字。 使用 $_COOKIE['cookiename'] 调用名为 cookiename 的 cookie。
value Cookie 的值。此值保存在客户端,不要用来保存敏感数据。 假定 name 是 'cookiename',可以通过 $_COOKIE['cookiename'] 取得其值。
expire Cookie 过期的时间。这是个 Unix 时间戳,即从 Unix 纪元开始的秒数。换而言之,通过time()函数再加上秒数来设定 cookie 的失效期。或者用mktime()来实现。 time()+60*60*24*30 将设定 cookie 30 天后失效。如果未设定,cookie 将会在会话结束后(一般是浏览器关闭)失效。
path Cookie 在服务器端的有效路径。 如果该参数设为 '/' 的话,cookie 就在整个 domain 内有效,如果设为 '/foo/',cookie 就只在 domain 下的 /foo/ 目录及其子目录内有效,例如 /foo/bar/。默认值为设定 cookie 的当前目录。
domain 该 cookie 有效的域名。 要使 cookie 能在如 example.com 域名下的所有子域都有效的话,该参数应该设为 '.example.com'。虽然 . 并不必须的,但加上它会兼容更多的浏览器。如果该参数设为 www.example.com 的话,就只在 www 子域内有效。
secure 指明 cookie 是否仅通过安全的 HTTPS 连接传送。当设成 TRUE 时,cookie 仅在安全的连接中被设置。默认值为 FALSE。 0 或 1

 

n Session的概念:

 

session在web开发中具有非常重要的份量。它可以将用户正确登录后的信息记录到服务器的内存中,当用户以此身份访问网站的管理后台时,无需再次登录即可得到身份确认。而没有正确登录的用户则不分配session空间,即便输入了管理后台的访问地址也不能看到页面内容。通过session确定了用户对页面的操作权限。

 

Session的原理:

 

当用户向服务器端发送了一个开启了session的url请求,服务器会因为该请求开启了session,而为这次请求随机分配一个sessionid。同时服务器端的指定路径下,会记录该sessionid,以及该用户的登录信息(例如用户名和密码)。同时会将这个sessionid传回发送请求的客户端,而这个sessionid会被保存在客户端一个生命周期为0的cookie中。因此session的正常使用要依赖于cookie的开启。

 

重要备注:

 

因为cookie是通过客户端浏览器来保存的,在ie浏览器中,如果浏览器的隐私设置为阻止所有cookie,那么cookie则被禁用,而session也不能正常使用。如果想让setcookie()正常发挥作用,浏览器隐私需要设置为中高或者以下。

 

 

 

n php.ini中关于Session会话控制的配置:

 

Php.ini中有很多关于session的配置,以下几项是必须熟悉的:

 

Ø session.save_handler = files

 

注释:表示session信息是以文件的形式保存在服务器端的某个目录下。

 

 

 

Ø session.save_path = "N;/path"

 

注释:表示session的保存路径,N代表保存为几级目录。Path可以是相对路径,也可以是绝对路径。

 

 

 

Ø session.use_cookies = 1

 

注释:表示session是否依赖于cookie。如果是1则表示依赖,如果是0则表示不依赖。一般情况下都是使用依赖cookie的session。

 

 

 

Ø session.auto_start = 0

 

注释:表示session是否自动开启。0表示不自动开启,1表示自动开启。一般情况下都不设置为自动开启。都是在需要的页面使用session_start()来开启。

 

 

 

以下几项配置可以作为了解,一般不会对默认值做修改:

 

Ø session.cookie_lifetime = 0

 

注释:表示存储sessionid的cookie的生命周期为0。只有生命周期为0的cookie,才会随着浏览器的关闭清除cookie信息,这样会造成服务器端的session信息因为没有sessionid信息而被访问。因为关闭浏览器窗口就代表一次会话结束,于是可以说session信息会随着会话结束而无法访问,这样就保证了session的安全性。

 

 

 

Ø session.gc_probability = 1

 

Ø session.gc_divisor     = 100

 

Ø session.gc_maxlifetime = 1440

 

注释:表示垃圾回收的百分率。1440表示24分钟,表示当超过24分钟没有操作该session,那么该session信息会被当做垃圾而被回收。

 

 

 

Ø session.hash_bits_per_character = 4

 

注释:表示生成的sessionid的长度和字符串的成分构成。

 

 

 

n Session的使用步骤:

 

1. 启动session:使用session_start()函数来启动。

 

2. 注册会话:直接给$_SESSION数组添加元素即可。

 

3. 使用会话:判断session是否为空或者是否已经注册,如果已经存在则像普通数组使用即可。

 

4. 删除会话:A.可以使用unset删除单个session;B.使用$_SESSION=array()的方式,一次注销所有的会话变量;C.使用session_destroy()函数来彻底销毁session。

 

 

 

n Session的综合应用:当用户登录成功后,必须应用Session技术来跟踪登录信息。此外需要同时将验证码图片生成进行复习。因为验证码图片生成过程中利用到了Session技术的跨页面传值的特性。

 

n Session和Cookie的区别:

 

cookie是保存在客户端机器的,对于未设置过期时间的cookie,cookie值会保存在机器的内存中,只要关闭浏览器则cookie自动消失。如果设置了cookie的过期时间,那么浏览器会把cookie以文本文件的形式保存到硬盘中,当再次打开浏览器时cookie值依然有效。

 

session是把用户需要存储的信息保存在服务器端。每个用户的session信息就像是键值对一样存储在服务器端,其中的键就是sessionid,而值就是用户需要存储信息。服务器就是通过sessionid来区分存储的session信息是哪个用户的。

 

Session和Cookie两者最大的区别就是session存储在服务器端,而cookie是在客户端。session安全性更高,而cookie安全性弱。

 

 

 

1. 知识点6:验证码图片生成技术

 

l 使用验证码的作用

 

A. 防止页面刷新;

 

B. 防止灌水,即防止信息被反复提交。

 

l 验证码图片如何生成

 

Ø 激活GD库:GD库在PHP5中默认安装,但是需要通过修php.ini文件来激活。打开php.ini,将”;extension=php_gd2.dll”选项前的分号去除。保存修改php.ini,重新启动apache即可。

 

Ø 验证GD库是否安装成功:写测试页面,其中只写<?php phpinfo(); ?>,通过apache服务器访问该页面。如果能看到GD信息,就说明安装成功。

 

Ø 验证码图片生成思路:首先将该验证码文件的头信息设置成图像格式,然后获取随机码,之后开启session,再将获取到的随机码的值赋值到$_SESSION中,最后使用GD库绘制出该随机码。

 

 

 

示例代码如下:

 

<?php

session_start();

header("content-type:image/png"); //设置头信息为图像格式

for($i=0; $i<4; $i++) {

$randnum .= mt_rand(0,9);

}

$_SESSION['checkcode'] = $randnum;//将随机码赋值到$_SESSION中

$im = imagecreate(45 , 18); //创建一个画布

imagecolorallocate($im , 0 , 0 , 0);//给画布设置背景颜色,使用RGB设置颜色

$fontcolor = imagecolorallocate($im , 255 , 255 , 255);//设置文字颜色

imagestring($im , 5 , 5 , 1 , $randnum ,  $fontcolor);

//在画布上水平书写文字

imagepng($im); //生成png格式的图像

imagedestroy($im); //释放图像资源

?>

 

l 使用jquery实现点击更换验证码:

 

可以点击验证码本身实现更换,也可以点击后面的“看不清换一张”实现验证码更换效果。

 

 

 

示例代码如下:

 

<img id='codepic' src="checkcode.php" onclick="this.src='checkcode.php?' + new Date().getTime();" style='cursor:hand;'>

<span onclick="$('#codepic').attr('src' , 'checkcode.php?' + new Date().getTime());" style='cursor:hand;'>[换一张]</span>

提示:注意new Date().getTime()的用法。思考为什么要使用js来获取当前时间?

 

1. 知识点7:利用OOP实现对数据库操作的封装

OOP设计思路中已经讲过,在此再次进行归纳整理。

l 数据库连接类DbConn.class.php 

该类的主要作用是连接数据库。使用单例模式。

l 载入配置文件类LoadConfig.class.php 

这个类的目的就是将配置文件中的配置信息(包括:数据库服务器ip、用户名、密码、数据库名、字符集以及smarty配置信息)载入到DbConn.class.php类中。这个类中只有一个私有属性 $config,两个static方法setConfig($webconfig)和getConfig()。在需要连接数据库的文件中要首先include配置文件,然后include这个LoadConfig.class.php类。LoadConfig类执行setConfig($webconfig)方法后,配置文件中的配置信息就被顺利地载入。

l 数据表基本CURD操作类BaseSql.class.php 

该类的构造方法中调用DbConn类来获取一个数据库连接的实例。BaseSql类中封装了select方法来实现数据库的select查找,query方法来实现数据库的insertdeleteupdate。这几个方法为了避免子类中重写,可以定义成final

l DAO基类BaseModel.class.php 

虽然BaseSql类能实现对数据库的最基本的CURD操作,但是参数必须是完整的sql语句,使用起来不方便,于是继承BaseSql封装出一个BaseModel该类利用继承于BaseSqlselectquery方法,封装出selectInfoselectCountselectListupdateinsertdelete等方法,这些方法实现了对sql语句的进一步简化。同样这些方法也定义成final,避免被子类重写。

l O/R映射的Model类 :

BaseModel作为所有数据访问对象的基类,虽然能实现对数据库的CURD操作,并且方法的参数也很简洁,但是涉及到多表联合查询等复杂的方法时不方便实现。于是可以利用O/R映射的思想,对于每个表都封装成一个类。这些类继承于BaseModel,所以具有父类的所有方法,当父类的方法无法满足需要,就可以根据需求写自己特有的方法。