PHP编程基础与实例教程练习题参考答案

更新时间:2024-05-02 07:44:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

由于时间仓促,答案中难免存在错误,不妥之处恳请读者批评指正! 第1章答案:

1.答案见教材1.2.3,1.2.4,1.2.5,1.2.6 2.答案见教材1.2.4,1.2.5 3.PHP,JSP,.NET,ASP等 4.答案如下:

打印明天的时间使用下面的程序:

date_default_timezone_set('PRC'); echo date(\ ?>

date ()函数中:

d: 几日,两位数字,若不足则补零;从\至\ D: 星期几,3个英文字母,如:\ F: 月份,英文全名,如:\ h: 12小时制的小时,从\至\ H: 24小时制的小时,从\至\ m: 月份,两位数字,从\至\ M: 月份,3个英文字母;如:\

s: 秒;从\至\

w: 数字型的星期几,从\星期天)\至\星期六)\ Y: 年,四位数字 y: 年,两位数字

z: 一年中的第几天;从\至\

time() 函数返回当前时间的 Unix 时间戳,即:自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。

5. Apache服务器的配置文件名是httpd.conf文件,默认放在C:\\wamp\\bin\\apache\\Apache\\conf目录下。MySQL服务器的配置文件名是my.ini,默认放在C:\\wamp\\bin\\mysql\\mysql目录下,PHP预处理器配置文件名是php.ini,默认放在C:\\wamp\\bin\\apache\\Apache\\bin目录下。 6. 答案见教材1.3.5

//设置中国时区

//打印明天的时间

第2章答案:

1. 答案见教材2.1.1 2. 答案见教材2.1.2 3. 答案见教材2.2.2

布尔型主要用于逻辑判断,整型和浮点型主要用于算术运算,字符串主要用于文字性描述,数组实际上是用于容纳若干变量的容器。当使用面向对象编程思想时,需要使用对象描述事物(属性及方法)。

4.

echo与print共同点:

它们都不是真正的函数,是一种语法结构,因为语句没有返回值,函数可以有返回值(即便没有用)(也有说print是函数,echo不是)。

echo和print 后面都可不用加(), 如: echo 'ok'; print 'ok';

运行速度echo稍快一些,因为echo并不返回值,print返回一个值int(1)。 echo与print区别:

一般用echo,除非三元运算时。$a=5; ($a==5) ? print '5': print 0; echo 后不要跟()。

print只能有一个参数,所以不能不能用\而echo可以。 echo -- 输出一个或者多个字符串

print_r是递归打印,主要用于打印复杂类型变量的值(如 数组,对象) 5. 答案见教材2.3 6. 答案见教材图2.3 7.

class Test{

function get_test($num){ $num=md5(md5($num)); return $num; } }

$test = new Test();

$password = $test->get_test(\echo $password;//输出字符串“123”两次md5加密结果:d9b1d7db4cd6e70935368a1efb10e377 ?>

第3章答案:

选择题: 1:C 2:B

3:A

4:D(说明:PHP变量以一个美元符号为开头,后面跟上任意数量的数字、字母和下划线。 ${“MyVar”}是一个合法的变量名,它使用的是较松散的命名约定。&$something是对$something的引用。然而,变量名不能以数字为开头,$10_somethings是非法的,因此答案是D。) 5:D(说明:这又是一个考验debug能力的题。注意到了吗,在脚本的末尾,echo语句中的?$output变量拼错了!脚本不会输出任何东西,答案是D), 6:D(说明:%运算符表示取模,它返回两个操作数相除的余数。<< 是左移运算符,相当于乘以2的N次方。最后的答案乘以了一个浮点数,改变了它的数据类型。但是,由于小数点后是零,因此输出的结果不包含小数部分。答案是 256)

7:B(说明:全等运算符比较两个操作数的数据类型和值,两者中有一个不同,都会返回False。因此答案是B)

8:AC(说明:A选项中,pow函数计算2的平方,答案是4。C选项中,左移运算符将$a的值左移两位,相当于乘以4) 9:D 10:B 填空题:

逻辑异或(xor)运算符 0 2

程序阅读题

相等相等不相等

truetruetruetruetruefalsetruefalse aaaaaa 41

hotdogok is zero 4

问答题:

1.isset($str)用于测试变量是否设置(或者存在),empty($str)用于测试变量是否为空。 检测变量是否为空使用is_null()和empty()函数。is_null()和empty()函数的区别请参考下面的程序:

$a = 0;

var_dump(empty($a)); //输出:bool(true) echo \

var_dump(is_null($a)); //输出:bool(false)

?>

2. PHP垃圾回收机制是基于引用计数机制的垃圾回收,当一个变量的引用计数变为0时, PHP将在内存中销毁这个变量,此时启动垃圾回收机制。当一个变量被初始化或者赋值给另一个变量时引用计数会加1,当变量或者被赋值的变量被销毁或者被侦测到无用时引用计数会减一,当垃圾收集的进程运行时会释放掉引用计数为0的那些变量会被从内存中释放(垃圾回收期间程序会被中断)。当脚本执行完成时所有资源都会被释放。

3.

按值传递:函数范围内对值的任何改变在函数外部都会被忽略

按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改

区别:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。

传值只是把某一个变量的值传给了另一个变量,而引用则说明两者指向了同一个地方。 4.

if(\ echo \输出“==” }

if(\ echo \没有任何输出 } ?> 5.

$var2 = 7;

$var3 = 8;

$max=$var1>$var2?$var1:$var2; $max=$max>$var3?$max:$var3; echo $max; ?>

第4章答案:

选择题:

1. D(说明:根据条件式的逻辑,要想得到Hello, World!字符串,必须要在第一个if结构中满足else的条件。因此$a必须为False,然后$b也必须为False。最内层的条件语句的实现要求先前的两个变量($a和$b)是False,而$c必须是True) 2.C 3.A 4.E

编程题:

switch($a) { case 'a': } ?>

somefunction(); break;

case 'b': anotherfunction(); break; case 'c':

dosomething(); break;

default: donothing();

第5章答案:

选择题: 1.D 2.B

3.B

4.A(说明:注意,$myarray的键值并没有打上引号。所以,正在访问的键不是myvalue字符串,而是常量myvalue的值。最终访问的是$myarray[10],值是Dog,答案是A。) 5.A(说明:5.通常情况下,foreach 语句是遍历数组的首选。但是,由于foreach语句是在数组的副本上进行操作,而我们需要给数组中每个元素重新赋值,所以在这里foreach就不适用了。尽管也可以用while循环和do?while循环,但由于数组是顺序索引的,最合适的语句还是for语句。因此答案是A。) 6.C

7.E

8.B(说明:foreach操作的是$array的副本,因此对原来的值没有影响)

9.B(说明:只有asort函数能在保留原有索引关系的前提下进行排序。答案是B) 10.A 11.B,D(说明:array_flip()只能把数组中每个元素的键和值进行交换。rsort()和array_reverse()则能把题目中的数组逆向排序为需要的形式(’d’,’c’,’b’,’a’)。答案是B和D。) 12.B 13.D 14.A 15.A 16.A

问答题:

1.中文意思是:三个函数之间有什么差别?你分别在什么情况下会使用上面三个函数? 答案参见教材5.4.7 2.

$arr = array('james', 'tom', 'symfony'); echo join(',',$arr);//方法1 echo \

echo implode(',',$arr);//方法2 ?>

第6章答案:

选择题: A B,D

C

问答题:

1. 答:get 是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息。区别如下:

a、 Get 方法通过 URL 请求来传递用户的数据,将表单内各字段名称与其内容,以成对的字符串连接,置于 action 属性所指程序的 url 后,如http://www.domain.com/test.asp?name=51js&password=51js,数据都会直接显示 在 url 上,就像用户点击一个链接一样;Post 方法通过 HTTP post 机制,将表单内各字段名称与其内容放置在 HTML 表头 (header)内一起传送给服务器端交由 action 属性能所指的程序处理,该程序会通过标准输入(stdin)方式,将表单的数据读出并加以处理

b、 Get 方 式需要使用 $_GET 来取得变量的值;而 Post 方式通过 $_POST 来访问提交的内容

c、 Get 方式传输的数据量非常小,一般限制在 2 KB 左右,但是执行效率却比 Post 方法好;而 Post 方式传递的数据量相对较大,它是等待 服务器来读取数据,不过也有字节限制,这是为了避免对服务器用大量数据进行恶意攻击。可在php.in中 对 post_max_size 进行设置。

建议:除 非你肯定你提交的数据可以一次性提交,否则请尽量用 Post 方法

d、 Get 方式提交数据,会带来安全问题,比如一个登陆页面,通过 Get 方式提交数据时,

用户名和密码将出现在 URL 上,如果页面可以被缓存或者其 他人可以访问客户这台机器,就可以从历史记录获得该用户的帐号和密码,所以表单提交建议使用 Post 方法;Post 方法提交的表单页面常见的问题 是,该页面如果刷新的时候,会弹出一个对话框。 2.答案参见教材6.5.2 3.答案参见教材6.5.4

4.以上传文件只允许为”jpg”图片为例,只需要得到文件名的扩展名必须是”jpg”或者”JPG”,才可进行上传。

获得文件名扩展名的方法如下:

$extend = strtolower(end(explode(\ 说明:这里用到了字符串操作函数explode,数组指针函数end,和字符串操作函数strtolower 然后再使用if判断语句if($extend == “jpg”),条件成立时,再进行上传。

5.POST传输数据容量由php.in中post_max_size的值设置。GET传输数据容量由浏览器决定。 6.

$clientIP = $_SERVER['REMOTE_ADDR']; $serverIP = $_SERVER['SERVER_ADDR']; echo $clientIP; echo \ echo $serverIP; ?>

7.

程序说明:此题关键在于文件上传框不确定,可以使用DOM+JavaScript,产生不确定个数的于文件上传框。步骤如下:

1.创建目录:uploads,所有上传文件置于该目录下。 2.创建upload.html文件,写入如下代码:

3.创建upload.php文件,写入如下代码:

if(empty($_POST)){ exit(\您提交的表单数据超过post_max_size的配置!
\}

$count = count($_FILES['myFile']['name']); for($i=0;$i<$count;$i++){

$myFile = $_FILES['myFile']; $error = $myFile[\switch ($error){

case 0: $fileName = $myFile['name'][$i]; echo \您上传的文件有:\ $fileTemp = $myFile['tmp_name'][$i];

$destination = \

move_uploaded_file($fileTemp,$destination);

break; case 1: echo \上传的某些文件超过了php.ini 中upload_max_filesize选项限制的值!

break;


\

case 2: echo \上传的某些文件超过了FORM表单MAX_FILE_SIZE选项指定的值!

break;


\

} ?>

}

case 3: echo \某些文件只有部分被上传!
\ break; case 4: echo \没有选择上传文件!
\

break;

第7章答案:

选择题: 1.A

2.E 3.C 4.A

5.B

6.E(说明:在较新版本的PHP中,require(或requier_once())和include()(或include_once())只有一个区别——如果包含的文件不存在,前者将产生一个致命错误,同时终止脚本的执行;

而后者只会产生一个警告。因此答案E正确)

7.C(说明:当参数被声明为通过引用传递时,你不能给它赋默认值,此时解释器期望获得一个能在函数内部进行修改的变量。) 8.A(说明:一段脚本并不会在执行到文件末尾时终止,所以当前文件才能被其他脚本包含。至于PHP和Apache崩溃,这两个说法就太恶搞了) 9.

程序阅读题: 1. 501 2. 552 3. 12

问答题: 1.

function($var1,$var2,$var3){

$max=$var1>$var2?$var1:$var2; $max=$max>$var3?$max:$var3;

return $max; } ?>

2.答案请参考第6章最后一道习题。

3.按值传递:函数范围内对值的任何改变在函数外部都会被忽略

按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改

优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。

4.

通过修改php.ini配置文件的选项allow_call_time_pass_reference(默认值为Off)决定是否开启函数调用时强制参数按照引用传递。

5.

可用冒泡法进行排序。冒泡排序的基本概念是:依次比较 相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后, 如此继续,直至比较最后两个数,将小数放前,大数放后,此时第一趟结束,在最后的数必是所有数中的最大数。重复以上过程,仍从第一对数开始比较(因为可能 由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后,第二趟 结束,在倒数第二个数中得到一个新的最大数。如此下去,直至最终完成排序。

function BubbleSort($str) {

for ($i=0;$i

for ($j=count($str)-2;$j>=$i;$j--) {

if($str[$j+1]<$str[$j]) {

$tmp = $str[$j+1];

$str[$j+1]=$str[$j]; $str[$j]=$tmp; } } } return $str;

}

$str = array(3,6,1,5,9,0,4,6,11);

print_r(BubbleSort($str)); ?>

6.说明:这里使用了字符串处理函数ucwords()和explode()函数。

function convString($string){ $array = explode('_', $string); $str = \

for($k=0;$k

$str = $str.ucwords($array[$k]);

} return $str; }

echo convString(\

?>

7. 说明:这里使用了字符串处理函数explode()函数。

function getRelativePath($a, $b) { $returnPath = array(dirname($b)); }

$arrA = explode('/', $a);

$arrB = explode('/', $returnPath[0]);

for ($n = 1, $len = count($arrB); $n < $len; $n++) { if ($arrA[$n] != $arrB[$n]) {

}

break;

}

if ($len - $n > 0) { $returnPath = array_merge($returnPath, array_fill(1, $len - $n, '..')); }

$returnPath = array_merge($returnPath, array_slice($arrA, $n)); return implode('/', $returnPath);

$a = '/a/b/c/d/e.php'; $b = '/a/b/12/34/c.php';

echo getRelativePath($a, $b); ?>

第8章答案:

1.E 2.B 3.C 4.C

5.E 6.C

7.B,C(说明:在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。)

8.C(说明:本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID 非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。) 填空题: 1.事务

2.where 3.insert

4.auto_increment

5. 左连接表A和表B意味着取表A的全部记录按指定的连接条件与表B中满足连接条件的记录进行连接,若表B中没有满足连接条件的记录,则表A中相应字段填入NULL。 问答题:

1.答案参见图8-21(说明,父子关系是相对的) 2.答案参见8.1.2

3.满足唯一性约束的字段可以为NULL。 4.MEMORY,MyISAM,InnoDB 5. 答案参见8.3.3

6. Varchar是变长,节省存储空间,char是固定长度。查找效率要char型快,因为varchar是非定长,必须先查找长度,然后进行数据的提取, 比char定长类型多了一个步骤,所以效率低一些。 7.忽略

8.说明:这里使用了MySQL的now()函数和DATE_FORMAT()函数。

INSERT INTO User('Name','Tel','Content','Date') VALUES('小王','13254748547','高中','2007-05-06') UPDATE User SET Date=DATE_FORMAT(NOW(),'%Y-%m-%d') WHERE Name='张三' DELETE FROM User WHERE Name='李四'

9.

SELECT username,count(*) as num FROM `members` group by username order by count(*) desc limit 10

数据库设计题:

该题只需设计ER图,ER图如下:

readerreader_no:表示借阅证号码max_book:表示该借阅证最多借几本书I:表示整型reader_idNOreader_noA11max_bookIreader_idRelationship_1borrowborrow_idborrow_timereturn_timedeadlineNODTDTDTborrow_time:表示借阅时间return_time:表示归还时间deadline:表示期限(截止时间)DT:表示datetime日期时间类型borrow_idRelationship_2bookbook_idNOisbnA50nameA100isbn:表示书的isbn号name:表示书的名字book_idRelationship_3categorycategory_idNOnameA100category_idname:表示书的种类名称 第9章答案:

选择题:

1.B,D(说明:用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。) 2.A

3.C

4.A(说明:mysql_fetch_field函数从结果集中取得列信息并作为对象返回) 5.C

填空题:

过滤特殊字符。 addslashes 问答题: 1.答案参见9.1.6

2.

在index.php文件中写入如下代码:

function GenerateMenu($id=0,$str=\

$result=mysql_query(\ while($row=mysql_fetch_array($result)){ }

echo $str.$row[\

GenerateMenu($row[\

mysql_free_result($result);

}

$link=mysql_connect(\mysql_select_db(\GenerateMenu(); mysql_close($link); ?>

3.

数据库的这个分类表可以设计大概如下,类举例如下: categoryID categoryName categoryParentID 1 电脑数码 0 2 3 4

娱乐休闲 电脑常识 电影电视

0 1 2

5 主机 3

categoryParentID为0表示为第一级分类,categoryParentID为1表示为id =1的子分类,也就是说电脑常识是电脑数码的子目录,其它也类似。。。

数据表结构如下:

CREATE TABLE `category` (

`categoryID` smallint(5) unsigned NOT NULL auto_increment, `categoryParentID` smallint(5) unsigned NOT NULL default '0', `categoryName` varchar(50) NOT NULL default '', PRIMARY KEY (`categoryID`)

) ENGINE=MyISAM DEFAULT CHARSET=gbk;

INSERT INTO `category` ( `categoryParentID`, `categoryName`) VALUES (0, '一级类别'), (1, '二级类别'), (1, '二级类别'),

(1, '二级类别'), (2, '三级类别'), (2, '333332'), (2, '234234'), (3, 'aqqqqqd'), (4, '哈哈'), (5, '66333666');

*/

//指定分类id变量$category_id,然后返回该分类的所有子类 //$default_category为默认的选中的分类

function Get_Category($category_id = 0,$level = 0, $default_category = 0){ global $DB; $sql = \ categoryID DESC\

$result = $DB->query( $sql );

=>

while ($rows = $DB->fetch_array($result)){ $category_array[$rows[categoryParentID]][$rows[categoryID]] = array('id' $rows[categoryID], 'parent' => $rows[categoryParentID], 'name' => $rows[categoryName]); }

if (!isset($category_array[$category_id])){

return \

}

foreach($category_array[$category_id] AS $key => $category){

if ($category['id'] == $default_category){

echo \}else{

echo \}if ($level > 0){

echo \}else{

echo \ }

Get_Category($key, $level + 1, $default_category); }

unset($category_array[$category_id]);

}

function Category_array($category_id = 0,$level=0){ global $DB; $sql = \ categoryID DESC\

$result = $DB->query($sql);

while ($rows = $DB->fetch_array($result)){

$category_array[$rows['categoryParentID']][$rows['categoryID']] = $rows; }

foreach($category_array AS $key=>$val){

if ($key == $category_id){ foreach ($val AS $k=> $v){

$options[$k] = array('id' => $v['categoryID'], 'name' => $v['categoryName'],

'level' => $level, 'ParentID'=>$v['categoryParentID']); }

}

unset($category_array[$category_id]); return $options;

}

}

$children = Category_array($k, $level+1); if (count($children) > 0){ }

$options = $options + $children;

class cate{

}

function getFlush($category_id = 0,$level = 0, $default_category = 0){ ob_start(); function Get_Category($category_id = 0,$level = 0, $default_category = 0){ echo $category_id; $arr = array( '0' => array(

'1' => array('id' => 1, 'parent' => 0, 'name' => '1111'), '2' => array('id' => 2, 'parent' => 0, 'name' => '2222'), '4' => array('id' => 4, 'parent' => 0, 'name' => '4444') ),

'1' => array(

'3' => array('id' => 3, 'parent' => 1, 'name' => '333333'), '5' => array('id' => 5, 'parent' => 1, 'name' => '555555') ),

'3' => array(

'6' => array('id' => 6, 'parent' => 3, 'name' => '66666'), '7' => array('id' => 7, 'parent' => 3, 'name' => '77777') ),

'4' => array(

'8' => array('id' => 8, 'parent' => 4, 'name' => '8888'), '9' => array('id' => 9, 'parent' => 4, 'name' => '9999') )

);

if (!isset($arr[$category_id])){ return \}

foreach($arr[$category_id] AS $key => $cate){ if ($cate['id'] == $default_category){

$txt = \}else{ $txt = \

}

if ($level > 0){

$txt1 = \}else{ }

$txt1 = \

$val = $txt.$txt1;

echo $val;

self::Get_Category($key, $level + 1, $default_category); }

}

}

self::Get_Category($category_id ,$level, $default_category); $out = ob_get_contents(); ob_end_clean(); return $out;

$id =$_GET['id']; echo \ $c = new cate(); //$c->Get_Category(); $ttt=$c->getFlush($id,'0','3'); echo $ttt;

echo \ ?>

然后在浏览器地址栏中输入:http://localhost/index.php?id=1

第10章答案:

任务1答案: create table message (

id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, title varchar(100), content varchar(225), category_id int, hits int )

任务2答案:

select a.id, a.title, a.hits, if(ifnull(b.id,false),count(*),0) as replay from message a left join comment b on a.id=b.id group by a.id order by replay desc 任务3答案: function categoryList() {

$result=mysql_query(\ or die(\ print(\ while($rowArray=mysql_fetch_array($result)) {

print(\

value='\ }

print(\}

第11章答案:

选择题:

C B

B(说明:浏览器不允许来自某个域名的HTTP事务更改另一个域名下的cookie,否则这将造成严重的的安全问题。) D B

B,D(说明:B和D是最有可能出问题并应该深入调查的地方。由于浏览器访问其他网站都正常,所以不可能是浏览器程序出了问题。杀毒软件通常不会选择性的只阻止安全的cookie(不过有可能会阻止所有的cookie)。你首先应当检查浏览器是否被设置为阻止所有cookie,这是最有可能导致该问题的原因。同时,错误的时区设置也可能是根源——给cookie设置有效期时用得是GMT时间。可能会出现cookie在写入时就立刻过期,从而无法被脚本接收的情况。)

B(说明:session.gc_maxlifetime设置的是用户最后一次请求到session被回收之间的时间间隔。尽管数据文件并没有被真正删除,不过一旦session被回收,你将无法对此session进行访问。巧合的是,session.gc_maxlifetime的默认设置正好是1440秒,但这个数字是可以被系统管理员调整的。所以答案应该是B。) 问答题:

1.header函数和setcookie函数

2. 状态401代表未被授权,如果返回“找不到文件”的提示,则可用header(\3.答案创建教材11.4.2,11.3.2,11.4.1. 4.Cookie的内容如下:

Set-Cookie:PHPSESSID= btek48cklarn1m73eg2qkcsu12; path = PATH;

domain= DOMAIN_NAME;

禁用Cookie后,Session还可以使用,请参考11.4.6中实验3中的示例程序。

5.

设置Session的生存时间包括设置服务器端Session的生存时间和浏览器端的生存时间。 方法1:php.ini配置文件中有一组如下Session的配置选项,实现Session的设置。其中session.gc_maxlifetime = 1440:设置Session文件在服务器端的储存时间,如果超过这个时间,那么Session文件会自动删除。默认为1 440s(24min),表示1 440s无操作就会自动销毁该Session文件。session.cookie_lifetime = 0:表示浏览器一旦关闭Session ID立即失效(推荐使用)。 方法2:使用下面的程序设置 $savePath = \ $lifeTime = 小时 * 秒; session_save_path($savePath); session_set_cookie_params($lifeTime);

session_start();

方法3:使用函数setcookie()或session_set_cookie_params($lifeTime)设置

6.解决HTTP无状态本质,可以从以下几个方面入手。

(1)利用form表单的隐藏域hidden,在表单数据提交时传递参数,这种方法需要和form表单一起使用。

(2)利用超链接通过URL查询字符串传递参数。

(3)使用header()函数重定向功能或JavaScript重定向功能,通过URL查询字符串传递参数。

(4)使用Cookie将浏览器用户的个人资料存放在浏览器端主机中,其他PHP程序通过读取浏览器端主机中的Cookie信息实现页面间的参数传递。

(5)使用Session将浏览器用户的个人资料存放于WEB服务器中,其他PHP程序通过读取服务器端主机中的Session信息实现页面间的参数传递。

7.

通过了解 SESSION 的工作原理,可以发现,在默认情况下,各个服务器会各自分别对同一个客户端产生SESSION ID,如对于同一个用户浏览器,A 服务器产生的 SESSION ID 是 30de1e9de3192ba6ce2992d27a1b6a0a,而B服务器生成的则是c72665af28a8b14c0fe11afe3b59b51b。另外,PHP 的 SESSION 数据都是分别保存在本服务器的文件系统中。确定了问题所在之后,就可以着手进行解决了。想要共享 SESSION 数据,那就必须实现两个目标:

一个是各个服务器对同一个客户端产生的 SESSION ID 必须相同,并且可通过同一个 COOKIE 进行传递,也就是说各个服务器必须可以读取同一个名为 PHPSESSID 的 COOKIE;

另一个是 SESSION 数据的存储方式/位置必须保证各个服务器都能够访问到。 简单地说就是多服务器共享客户端的 SESSION ID,同时还必须共享服务器端的 SESSION数据。 第一个目标的实现其实很简单,只需要对 COOKIE 的域(domain)进行特殊地设置(将域名设置为父子关系)即可,默认情况下,COOKIE 的域是当前服务器的域名/IP 地址,而域不同的话,各个服务器所设置的 COOKIE 是不能相互访问的。cookie可以跨越子域名。比如我们在xiaofeicn.com下面注册个个cookie,那么可以在bbs.xiaofeicn.com上读取到该cookie。 第二个目标的实现方法是所有的WEB服务器的SESSION存放在一个文件服务器(或者数据库服务器)上。例如:采用一台Mysql服务器做共享服务器,把所有的session的数据保存到Mysql服务器上,所有Web服务器都来这台Mysql服务器来获取Session数据。

第12章答案:

选择题:

C(说明:从 PHP4.2.0开始,除非已经给定了一个伪随机整数列,否则不再需要用rand()函数初始化随机数生成器。此外,即使随机数生成器没有被事先播种,脚本仍然会生成49个伪随机字符。尽管$array变量是字符串,但可以用访问数组的方式进行访问——使用数字索引访问某个位置上的字符。最后,for循环将从1开始执行到50,也就是执行了49次。) B

A

B,D(说明:本题考验你对HTML编码的认识以及代码查错能力。变量$s在被函数htmlentities()处理过后,结果返回给了变量?$ss,而$s自己并没有被改变。因此答案是B和D。) B(说明:虽然你可以用implode函数把数组转化成字符串,然后存在数组里,但却无法保证日后一定能用serialize()把这个字符串还原成数组。浏览器对单个cookie有容量限制,因此在cookie里存储数组不是个好主意。但事情也并非永远是这样,你仍然可以存储一些比

较小的数组。) B D A D D D

B

B,D,E(注意D选项a为常量,当然该常量并没有定义,此时该常量的值为常量名) A,D

C

B,D(说明:pack 函数能对二进制数据进行复杂的格式化,包括将字符串中的字符转化成十六进制表示。bin2hex 函数也有同样的转化功能。注意,printf()能将整数转化成十六进制数,但无法转化字符串。) B

填空题:

nl2br

str_pad 函数(说明:它可以把字符串填充到指定长度)

mb_convert_encoding($str, 'GBK', ' UTF-8')或者 iconv(' UTF-8', 'GBK', $str) explode,implode 对空格的转义不同

strip_tages(注释:第二个空有歧义,该书第二版删除第二个空) substr($a,0,1)和$a{0}

跟起始标志的一样,且结束标志前也要一个换行,后面加上分号。 问答题:

方法1参见教材第7章问答题 方法2:

function changeStyle(&$str) { $arrStr=explode('_',$str);

foreach($arrStr as $key=>$value){ $arrStr[$key]=strtoupper(substr($value,0,1)).substr($value,1); }

return implode('',$arrStr);

}

$s = \echo changeStyle ($s); ?>

方法3:

function changeStyle(& $str){

$str = str_replace (\$str = ucwords ($str);

$str = str_replace (\

return $str;

}

$s = \echo changeStyle ($s); ?>

function reverse($str){ $len = mb_strlen(\

$new_string = \

for ($i=$len;$i>=0;$i--){

$new_string .= mb_substr($str,$i,1,'gbk');

}

return $new_string;

}

$str = \你好,世界!\

echo reverse($str); ?> 3.

使用mb_substr()或mb_strcut()函数可以解决从中文字符串中取子串时可能产生的乱码问题。 4.

方法1:

function getExt($url){ $arr = parse_url($url);

$file = basename($arr['path']); $ext = explode(\ return $ext[1]; } ?>

方法2:

function getExt($url) { $url = basename($url); $pos1 = strpos($url,\ $pos2 = strpos($url,\

if(strstr($url,\

return substr($url,$pos1 + 1,$pos2 - $pos1 - 1); } else {

return substr($url,$pos1); } } ?>

5.

方法1.

get_ext1($file_name), get_ext2($file_name) function get_ext1($file_name){ return strrchr($file_name, '.'); }

方法2.

function get_ext2($file_name){

return substr($file_name, strrpos($file_name, '.')); }

方法3.

function get_ext3($file_name){

return array_pop(explode('.', $file_name)); }

方法4.

function get_ext4($file_name){ $p = pathinfo($file_name); return $p['extension']; }

方法5.

function get_ext5($file_name){

return strrev(substr(strrev($file_name), 0, strpos(strrev($file_name), '.'))); }

第13章答案:

1.

#menu ul li a:link,#menu ul li a:visited{ color:#FF0000; font-size:14pt }

2.

history.go(1)

3.

在FCKeditor中自定义表情图片的步骤是什么?答案参见教材13.2.3中的9,10,11 在FCKeditor中自定义字体大小的方法是什么?答案参见教材13.2.3中的3 在FORM表单中如何使用在线编辑器FCKeditor?答案参见教材13.2.4 4.

答案参见教材13.4.4 5.

答案参见教材13.4.5

6.

JavaScript表单弹出对话框的函数是alert函数,获得输入焦点的函数是focus函数 7.

JavaScript的重定向函数是什么?答案参见教材11.1.2

怎样引入一个外部JS文件?

方法是:

Top