由于时间仓促答案中难免存在错误不妥之处恳请读者批评指正!第1章答案.docx
由于时间仓促,答案中难免存在错误,不妥之处恳请读者批评指正!第1章答案:1 .答案见教材1.2.3,1.2.4,1.2.5,1.2.62 .答案见教材1.2.4,1.2.53 .PHP,JSP,.NET,ASP等4 .答案如下:打印明天的时间使用下面的程序:<?phpdate-default-timezone-set(,PRC,);设置中国时区echodate("YmdH:i:s",time()+24*3600);打印明天的时间?>date()函数中:d:几日,两位数字,若不足则补零;从“01”至“31”D:星期几,3个英文字母,如:"Fri”F:月份,英文全名,如:"January"h:12小时制的小时,从“01“至“12”H:24小时制的小时,从“00“至“23”m:月份,两位数字,从“01“至“12”M:月份,3个英文字母;如:"Jan*'s:秒;从“00“至“59”w:数字型的星期几,从“0(星期天)“至“6(星期六)”Y:年,四位数字y:年,两位数字z:一年中的第几天;从T至“366”time()函数返回当前时间的Unix时间戳,即:自从Unix纪元(格林威治时间1970年1月1日00:00:00)到当前时间的秒数。5 .Apache服务器的配置文件名是文件,默认放在C:wampbinapacheApacheconf目录下。MySQL服务器的配置文件名是my.ini,默认放在CAWamPbinmysqlmysql目录下,PHP预处理器配置文件名是,默认放在C:wampbinapacheApachebin目录下。6 .答案见教材135第2章答案:1 .答案见教材2.1.12 .答案见教材2.1.23 .答案见教材2.2.2布尔型主要用于逻辑判断,整型和浮点型主要用于算术运算,字符串主要用于文字性描述,数组实际上是用于容纳若干变量的容器。当使用面向对象编程思想时,需要使用对象描述事物(属性及方法)。4 .echo与Print共同点:它们都不是真正的函数,是一种语法结构,因为语句没有返回值,函数可以有返回值(即便没有用)(也有说Print是函数,echo不是)。echo和print后面都可不用加(),如:echo,ok'print'ok"运行速度echo稍快一些,因为echo并不返回值,Print返回一个值int(l)。echo与print区别:一般用echo,除非三元运算时0$a=5;($a=5)?print'5,:print0;echo后不要跟()。print只能有一个参数,所以不能不能用"而echo可以。echo-输出一个或者多个字符串Printj是递归打印,主要用于打印复杂类型变量的值(如数组,对象)5 .答案见教材2.36 .答案见教材图2.37 .<?phpclassTest(functionget_test($num)($num=md5(md5($num);return$num;)$test=newTest();Spassword=$test->get_test("123");echo$PaSSWord;输出字符串“123”两次md5加密结果:d9b1d7db4cd6ea1efb10e377?>第3章答案:选择题:1:C2:B3:A4:D(说明:PHP变量以一个美元符号为开头,后面跟上任意数量的数字、字母和下划线。$“MyVar”是一个合法的变量名,它使用的是较松散的命名约定。&$Something是对$Something的引用。然而,变量名不能以数字为开头,$1(LSOmethingS是非法的,因此答案是D。)5:D(说明:这又是一个考验debug能力的题。注意到了吗,在脚本的末尾,echo语句中的?$oUtPUt变量拼错了!脚本不会输出任何东西,答案是D),6:D(说明:运算符表示取模,它返回两个操作数相除的余数。«是左移运算符,相当于乘以2的N次方。最后的答案乘以了一个浮点数,改变了它的数据类型。但是,由于小数点后是零,因此输出的结果不包含小数部分。答案是256)7:B(说明:全等运算符比较两个操作数的数据类型和值,两者中有一个不同,都会返回False.1因此答案是B)8:AC(说明:A选项中,PoW函数计算2的平方,答案是4。C选项中,左移运算符将$a的值左移两位,相当于乘以4)9:D10:B填空题:逻辑异或(Xor)运算符02程序阅读题相等相等不相等IruetruetruetruetruefalSetruefalseaaaaaa41hotdogokiszero4问答题:1.iSSet($Str)用于测试变量是否设置(或者存在),empty*Str)用于测试变量是否为空。检测变量是否为空使用is_null()和empty。函数。is_null()和empty()函数的区别请参考下面的程序:<?php$a=0;var_dump(empty($a);输出:bool(true)echo"<br>VaJdUmP(is_null($a);输出:bool(false)?>2. PHP垃圾回收机制是基于引用计数机制的垃圾回收,当一个变量的引用计数变为。时,PHP将在内存中销毁这个变量,此时启动垃圾回收机制。当一个变量被初始化或者赋值给另一个变量时引用计数会加1,当变量或者被赋值的变量被销毁或者被侦测到无用时引用计数会减一,当垃圾收集的进程运行时会释放掉引用计数为0的那些变量会被从内存中释放(垃圾回收期间程序会被中断)。当脚本执行完成时所有资源都会被释放。3.按值传递:函数范围内对值的任何改变在函数外部都会被忽略按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改区别:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要更制值,对于性能提高很有好处。传值只是把某一个变量的值传给了另一个变量,而引用则说明两者指向了同一个地方。4.<?phpif('0"=0)echo输出“=")if('0"=0)echo”="没有任何输出)?>5.<?php$varl=1;$var2=7;$var3=8;$max=$varl>$var2?$varl:$var2;$max=$max>$var3?$max:$var3;echo$max;?>第4章答案:选择题:1.D(说明:根据条件式的逻辑,要想得到HenO,World!字符串,必须要在第一个if结构中满足else的条件。因此$a必须为FalSe,然后$b也必须为False。最内层的条件语句的实现要求先前的两个变量($和$1)是False,而$(?必须是TrUe)2.C3.A4.E编程题:<?phpSwitch(Sa)(case'a':somefunction();break;case,b,:anotherfunction();break;case'c':dosomething();break;default:donothing();)?>第5章答案:选择题:1.D2.B3.B4 .A(说明:注意,$myarray的键值并没有打上引号。所以,正在访问的键不是myvalue字符串,而是常量myvalue的值。最终访问的是$myarray10,值是Dog,答案是A。)5 .A(说明:5.通常情况下,foreach语句是遍历数组的首选。但是,由于foreach语句是在数组的副本上进行操作,而我们需要给数组中每个元素重新赋值,所以在这里foreach就不适用了。尽管也可以用While循环和doWhile循环,但由于数组是顺序索引的,最合适的语句还是for语句。因此答案是AQ6 .C7 .E8.B(说明:foreach操作的是$21*田丫的副本,因此对原来的值没有影响)9.B(说明:只有asort函数能在保留原有索引关系的前提下进行排序。答案是B)10.A1.8, ,D(说明:array_flip()只能把数组中每个元素的键和值进行交换。rsort()和array_reverse()则能把题目中的数组逆向排序为需要的形式(d','c','b','a')。答案是B和DQ12.B13.D14. A15. A16. A问答题:1 .中文意思是:三个函数之间有什么差别?你分别在什么情况下会使用上面三个函数?答案参见教材5.4.72 .<?php$arr=array(james,tom','symfony');echojoin(?,$arr);方法1echo"<br>echoimplode(',$air);方法2?>第6章答案:选择题:AB,DC问答题:1 .答:get是发送请求HTTP协议通过UH参数传递进行接收,而PoSt是实体数据,可以通过表单提交大量信息。区别如下:a、Get方法通过URL请求来传递用户的数据,将表单内各字段名称与其内容,以成对的字符串连接,置于action属性所指程序的url后,如,数据都会直接显示在url上,就像用户点击一个链接一样;Post方法通过HTTPpost机制,将表单内各字段名称与其内容放置在HTML表头(header)内一起传送给服务器端交由action属性能所指的程序处理,该程序会通过标准输入(SMin)方式,将表单的数据读出并加以处理b、Get方式需要使用$_GET来取得变量的值;而Post方式通过$_PoST来访问提交的内容c、Get方式传输的数据量非常小,一般限制在2KB左右,但是执行效率却比Post方法好;而Post方式传递的数据量相对较大,它是等待服务器来读取数据,不过也有字节限制,这是为了避免对服务器用大量数据进行恶意攻击。可在中对post_maX_size进行设置。建议:除非你肯定你提交的数据可以一次性提交,否则请尽量用Post方法d、Get方式提交数据,会带来安全问题,比如一个登陆页面,通过Get方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问客户这台机器,就可以从历史记录获得该用户的帐号和密码,所以表单提交建议使用Post方法;Post方法提交的表单页面常见的问题是,该页面如果刷新的时候,会弹出一个对话框。2 .答案参见教材6.5.23 .答案参见教材6.5.44 .以上传文件只允许为“jpg”图片为例,只需要得到文件名的扩展名必须是“jpg"或者“JPG”,才可进行上传。获得文件名扩展名的方法如下:Sextend=strtolower(end(explode(".,SmyPictureName);说明:这里用到了字符串操作函数explode,数组指针函数end,和字符串操作函数StrtoIOWer然后再使用if判断语句if($exlend="jpg"),条件成立时,再进行上传。5 .POST传输数据容量由中post_max_size的值设置。GET传输数据容量由浏览器决定。6 .<?phpSclientIP=$_SERVERrREMOTE_ADDR;SserverIP=$_SERVERrSERVER_ADDR;echoSclientlP;echo"<br>echoSserverlP;?>7 .程序说明:此题关键在于文件上传框不确定,可以使用DOM+JavaScript,产生不确定个数的于文件上传框。步骤如下:1 .创建目录:uploads,所有上传文件置于该目录下。2 .创建文件,写入如下代码:<frmaction="*'method="post"name="fbrm"enctype="multipartfbrm-data"><!-每个文件上传框限制上传文件的大小为IOK字节<inputtype="hidden"name="MAX_FILE_SIZE"value=,10240',><divid="upload,><div><inputtype="bullon"value="添力口附件"onclick="createUploader()”><br><inputtype="submit"value="上传”><frm><script>functioncreateUploader()vardiv=ementById(,upload,1);varUploader=eElement("inpu);="file"="myFiie"dChild(uploader);varbr=eElement(',br);dChild(br);)<script>3 .创建文件,写入如下代码:<?phpif(empty($_POST)exit("您提交的表单数据超过post_max_size的配置!<br>");)Scount=count($_FILES'tnyFile''name'J);for($i=0;$i<$count;$i+)SmyFile=$_FILESrmyFiIe'$error=SmyFilel"error,Si;switch(Serror)caseO:SfileName=$myFile'name'$i;echo”您上传的文件有:FfileName."<br>"SfileTemp=$myFile,tmp-name,JSi;Sdestination="uploads/".SfileName;move_uploaded_file($fileTemp,$destination);break;case 1:echo"上传的某些文件超过了中UPlOaeLmaX_filesize选项限制的值!<br>"break;case 2:echo”上传的某些文件超过了FORM表单MAX_FILE_SIZE选项指定的值!<br>"break;case 3:echo”某些文件只有部分被上传!<br/>”;break;case 4:echo”没有选择上传文件!<br>"break;)?>第7章答案:选择题:1 .A2 .E3 .C4 .A5.B6 .E(说明:在较新版本的PHP中,require(或requier_once()和include()(或include-once()只有一个区别一一如果包含的文件不存在,前者将产生一个致命错误,同时终止脚本的执行;而后者只会产生一个警告。因此答案E正确)7 .C(说明:当参数被声明为通过引用传递时,你不能给它赋默认值,此时解释器期望获得一个能在函数内部进行修改的变量。)8 .A(说明:一段脚本并不会在执行到文件末尾时终止,所以当前文件才能被其他脚本包含。至于PHP和APaChe崩溃,这两个说法就太恶搞了)9 .程序阅读题:1.5012. 5523. 12问答题:1.<?phpfunction($varl,$var2,$var3)$max=$varl>$var2?$varl:$var2;$max=$max>$var3?$max:$var3;return$max;)?>2. 答案请参考第6章最后一道习题。3. 按值传递:函数范围内对值的任何改变在函数外部都会被忽略按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改优缺点:按值传递时,PhP必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要笈制值,对于性能提高很有好处。4.通过修改配置文件的选项allow_call_time_pass_reference(默认值为Off)决定是否开启函数调用时强制参数按照引用传递。5.可用冒泡法进行排序。冒泡排序的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后,此时第一趟结束,在最后的数必是所有数中的最大数。重更以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第I个数不再小于第2个数),将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中得到一个新的最大数。如此下去,直至最终完成排序。<?phpfunctionBubbleSort(Sstr)(for($i=0;$i<count($str);$i+)(for($j=count($str)-2;$j>=$i;$j-)(if($str$j+l<$str$j)($tmp=$str$j+l;$str$j+l=$str$j;$str$j=$tmp;)return$str;)$str=array(3,6,1,5,9,0,4,6,11);print_r(BubbleSort(Sstr);?>6 .说明:这里使用了字符串处理函数UCWordSo和explode。函数。<?phpfunctionConvString(Sstring)Sarray=explode。,$string);$str=""fbr($k=0;$k<count($array);$k+)$str=$ds($array$k);)return$str;)echoconvString(',make-byJd");?>7 .说明:这里使用了字符串处理函数explode。函数。<?phpfunctiongetRelativePath($a,$b)SreturnPath=array(dirname(Sb);$arrA=explode('7,$a);$arrB=explode('/,SreturnPath(OJ);for($n=I,$len=count(SarrB);$n<$len;$n+)if($arrA$n!=$arrB$n)break;)1if($len-$n>0)SreturnPath=array_merge(SreturnPath,array_fill(l,$len-$n,)SreturnPath=array_merge(SreturnPath,array_slice($arrA,$n);returnimplode(7SreturnPath);)$a=7abcde.php'$b=7ab1234c.php,;echogetRelativePath($a,$b);?>第8章答案:1.E2.B3 .C4 .C5 .E6 .C7 .B,C(说明:在标准SQL中,如果出现GRoUPBY,结果集中所有的字段都必须是聚集值,或者是GROUPBY结构本身的一部分。某些DBMS比如MySQL允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。)8 .C(说明:本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLEl中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。)填空题:1 .事务2 .where3.insert4.auto_increment5.左连接表A和表B意味着取表A的全部记录按指定的连接条件与表B中满足连接条件的记录进行连接,若表B中没有满足连接条件的记录,则表A中相应字段填入NULL。问答题:1 .答案参见图8-21(说明,父子关系是相对的)2 .答案参见&I.23 .满足唯一性约束的字段可以为NULLo4 .MEM0RY,MyISAM,InnoDB5 .答案参见&3.36 .Varchar是变长,节省存储空间,char是固定长度。查找效率要char型快,因为VarChar是非定长,必须先查找长度,然后进行数据的提取,比Char定长类型多了一个步骤,所以效率低一些。7 .忽略8 .说明:这里使用了MySQL的now()函数和DATE_FORMAT()函数。INSERTINTOUser(,Name',Tel,Content,Date,)VALUESc小王高中','2007-05-06')UPDATEUserSETDate=DVE-FORMAT(NOW()%Y-%m-%d')WHEREName='张三'DELETEFROMUserWHEREName='李四'9 .SELECTusername,count(*)asnumFROM'members'groupbyusernameorderbycount(*)desclimit10数据库设计题:该题只需设计ER图,ER图如下:第9章答案:选择题:1.8, D(说明:用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含1D=0+OR+1这样的参数时,实际的查询为DELETEFROMMYTABLEWHEREID=OOR1,数据库将删除表中所有的记录。)2 .A3 .C4 .A(说明:mysql_fetch_field函数从结果集中取得列信息并作为对象返回)5 .C填空题:过滤特殊字符。addslashes问答题:1. 答案参见9.1.62.在文件中写入如下代码:<?phpfunctionGenerateMenu($id=O,$str="")$result=mysql_query("selectmainmenu,url,submenufrommenuwheremainmenu=$id");while($row=mysql_fetch_array($result)echoSstr.Srow',ur,."<br>GenerateMenu($row"submenu",$Str.");mysql_free_result($result);$link=mysql_connect("localhost","root","");mysql_select_db("phpinterview");GenerateMenuO;mysql_close($link);?>3.数据库的这个分类表可以设计大概如下,类举例如下:categoryIDCategoryNameCategoryParentlD1电脑数码O2娱乐休闲O3电脑常识14电影电视25主机3CategoryParentlD为0表示为第一级分类,CategoryParentID为1表示为id=I的子分类,也就是说电脑常识是电脑数码的子目录,其它也类似。<?php/*数据表结构如下:Createtable'category'('categoryID'smallint(5)unsignedNOTNULLauto_increment,'CategoryParentID'smallint(5)unsignedNOTNULLdefault,0,'CategoryName'varchar(50)NOTNULLdefault",PRIMARYKEY('categoryID')ENGINE=MyISAMDEFAULTCHARSET=gbk;INSERTINTO'category'('CategoryParentlD','categoryName')VALUES(0,'一级类别'),(IJ二级类别)(IJ二级类别)(IJ二级类别)(2J三级类别)(2,'333332'),(2,'234234'),(3,aqd'),(4,哈哈)(5,”);*/指定分类id变量$Category_id,然后返回该分类的所有子类/$default_category为默认的选中的分类<?phpfunctionGet_Category($category_id=0,$IeVel=0,$default_category=0)global$DB;$sql=mSELECT*FROMcategoryORDERBYcategoryIDDESC"Sresult=$DB->query($sql);while($rows=$DB->fetch_array($result)(Scategory_array$rowscategoryParentlD$rowscategoryID=array('id'=>SrowslcategoryID,'parent'=>$rowscategoryParentlDj,'name'=>SrowscategoryName);1if(!isset(Scategory_arrayScategory_idJ)return"")fbreach($category_array$category_idAS$key=>Scategory)(if($category'id'J=$default_category)echo"<optionselectedValUe=".$CategOry'id'."")elseecho"<optionvalue=".$category'id,J."H;)if($level>0)echo,'>,'.str_repeat(n,$level).".Scategory'name'.<'<option>n")elseecho">,'.$Categoryrname'."<OPtion>n")Get_Category($key,Slevel+1,$default_category);)unset($category_array$category_id);)functionCategory_array($category_id=O,Slevel=O)global$DB;$sql="SELECT*FROMcategoryORDERBYCategoryIDDESC"Sresult=$DB->query($sql);while($rows=$DB->fetch_array($result)$category_array$rows,categoryParentID'SrowsfcategoryID'=$rows;1foreach($category_arrayAS$key=>$val)if($key=$category_id)foreach($valAS$k=>$v)$options$k=array(,id,=>SvfcategoryID','name'=>$VrCategOryNamel'level'=>$level,'ParentID->Sv'categoryParentlD,);Schildren=Category_array($k,Slevel+1);if(Count(Schildren)>0)Soptions=Soptions+Schildren;unset($category_arrayScategoryJdJ);returnSoptions;)classcatefunctionGet_Category($category_id=O,$IeVel=O,Sdefault_category=0)(echo$category_id;$arr=array('0'=>array(,=>array(,id'=>1,'parent'=>0,'name'=>'111),2'=>array(,id'=>2,'parent'=>0,name,=>,2222,),'4'=>array('id'=>4,parent'=>0,name,=>'4444'),'=>array('3,=>array(,id'=>3,'parent'=>1,name,=>'333333'),5,=>array(,id'=>5,'parent*=>I,'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_idAS$key=>$cate)if(Scate'id,J=SdefauIt_category)($txt="<optionselectedValUe=".$Caterid)else$txt=',<optionvalue=',.Scate'id,."")if($level>0)$txtl=,'>.str_repeat(',-'$level).,.Scatefname'.',<option>n,')else$txtl=">'*.$cate'name'J."<option>n;)$val=$txt.$txtl;echo$val;self:Get_Category($key,Slevel+1,$default_category);functiongetFlush($category_id=0,$level=0,Sdefault_category=0)ob_start();self:Get_Category($category_id,$level,$default_category);$out=ob_get_contents();ob_end_clean();return$out;)$id=$_GET'id'echo"<select>$c=newcate();/$c->Get_Category();Sttt=Sc->getFlush(Sid,'O','3,);echo$ttt;echo"<select>?>然后在浏览器地址栏中输入:http:/localhost/?id=1第10章答案:任务1答案:createtablemessage(idINTNOTNULLAUTO.INCREMENTPRIMARYKEY,titlevarchar(100contentvarchar(225),category_idint,hitsint)任务2答案:selecta.id,a.title,a.hits,if(ifnull(b.id,false),count(*),0)asreplayfrommessagealeftjoincommentbona.id=b.idgroupbya.idorderbyreplaydesc任务3答案:functioncategoryList()($result=mysql_query("selectcategory_id,categroy_namefromcategory'*)ordie("Invalidquery:".mysql_error();print(,'<selectname='category,value=">"n");while($rowArray=mysql_fetch_array($result)(print("<optionVaIUe="'.$roWArrayrCategory_id'."'>".$roWArrayrCategroyjame'LyoPtiOn>"n");)print(,<select>");第11章答案:选择题:CBB(说明:浏览器不允许来自某个域名的HTTP事务更改另一个域名下的COOkie,否则这将造成严重的的安全问题。)DBB,D(说明:B和D是最有可能出问题并应该深入调查的地方。由于浏览器访问其他网站都正常,所以不可能是浏览器程序出了问题。杀毒软件通常不会选择性的只阻止安全的cookie(不过有可能会阻止所有的cookie)o你首先应当检查浏览器是否被设置为阻止所有cookie,这是最有可能导致该问题的原因。同时,错误的时区设置也可能是根源一一给cookie设置有效期时用得是GMT时间。可能会出现COokie在写入时就立刻过期,从而无法被脚本接收的情况。)B(说明:_maxlifetime设置的是用户最后一次请求到SeSSiOn被回收之间的时间间隔。尽管数据文件并没有被真正删除,不过一旦SeSSiOn被回收,你将无法对此SeSSiOn进行访问。巧合的是,_maxlifetime的默认设置正好是1440秒,但这个数字是可以被系统管理员调整的。所以答案应该是B。)问答题:1 .header函数和setcookie函数2 .状态401代表未被授权,如果返回“找不到文件”的提示,则可用header("Location:”);3 .答案创建教材11.4.2,11.3.2,ll.4.1.4 .Cookie的内容如下:Set-Cookie:PHPSESS1D=btek48cklam1m73eg2qkcsu12;path=PATH;domain=D0MAIN_NAME;禁用Cookie后,Session还可以使用,请参考11.4.6中实验3中的示例程序。5 .设置Session的生存时间包括设置服务器端Session的生存时间和浏览器端的生存时间。方法1:配置文件中有一组如下Session的配置选项,实现SeSSion的设置。其中_maxlifetime=1440:设置SeSSiOn文件在服务器端的储