版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章1.答:参考“1.1.2Web工作原理”节。2.答:参考“1.2.4常用的PHP开发工具”节。3.答:参考“1.3.2LAMP环境搭建”节。4.答:参考“1.3.1WAMP环境搭建”节。5.答:参考“1.4第一个PHP程序”节。第2章1.答:参考程序如下。<?php $num=1; $num=$num+1; $num+=1; $num++; echo$num;?>2.答:<?php$x=3;$y=4;echo"Test1result:".($x==$y)."<br/>";echo"Test2result:".($x>$y)."<br/>";echo"Test3result:".($x<=$y)."<br/>";echo"Test4result:".($x!=$y)."<br/>";?>3.答:可以用很多方法编写这个脚本。下面这个脚本是使用一个for循环来统计数字个数的,然后用?:运算符(三目运算符)和switch语句来判断每个数是偶数、奇数还是素数:<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Strict//EN""/TR/xhtml1/DTD/xhtml1-strict.dtd"><htmlxmlns="/1999/xhtml"xml:lang="en"lang="en"><head><title>TestingtheNumbers1-10</title><linkrel="stylesheet"type="text/css"href="common.css"/></head><body><h1>TestingtheNumbers1-10</h1><tableborder="1"><tr><th>Number</th><th>OddorEven?</th><th>Prime?</th></tr><?phpfor($i=1;$i<=10;$i++){$oddEven=($i%2==0)?"Even":"Odd";switch($i){case2:case3:case5:case7:$prime="Yes";break;default:$prime="No";break;}?><tr><td><?phpecho$i?></td><td><?phpecho$oddEven?></td><td><?phpecho$prime?></td></tr><?php}?></table></body></html>4.答:有非递归方式和递归方式两种实现方法:非递归写法:functionfbnq($n){//传入数列中数字的个数if($n<=0){return0;}$array[1]=$array[2]=1;//设第一个值和第二个值为1for($i=3;$i<=$n;$i++){//从第三个值开始$array[$i]=$array[$i-1]+$array[$i-2];//后面的值都是当前值的前一个值加上前两个值的和}return$array;}递归方法:functionfbnq($n){if($n<=0)return0;if($n==1||$n==2)return1;returnfbnq($n-1)+fbnq($n-2);}第3章1.答:参考程序如下。<?php$str="admin||46cc468df60c961d8da2326337c7aa58||0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,";$pos=strpos($str,"||");?>2.答:iconv库在某些操作系统上可能运行不正确,需要安装GNU扩展库以保证它的正常运行。mb_substr函数的兼容性更好;iconv函数会先将当前字符串转换为相应的编码再进行截取,而mb函数则是直接根据指定的编码进行截取(提供安全的多字节截取),所以mb函数的截取效率更高。因此,mb_substr函数进行中文字符串的截取为最合适的选择。<html><head><metacharset='utf-8'><title>截取中文字符串</title></head><body><?php$str='123脚本之家456欢迎大家的光临';echosubstr($str,0,4);echo'<br>';echoiconv_substr($str,0,4,'utf-8');echo'<br>';echomb_substr($str,0,4,'utf-8');?></body></html>3.答:<?php $string="Warning:SystemwillshutdowninNNminutes!"; $pos=strpos($string,"NN"); print(substr_replace($string,"15",$pos,2)."\n"); sleep(10*60); print(substr_replace($string,"5",$pos,2)."\n");?>4.答:php中可以通过strtolower和strtoupper两个函数将字符串中的每个英文字符全部转换成小写或者大写。<?php$string="LearnPHPstringfunctionsat";$lower=strtolower($string);$upper=strtoupper($string);print("$lower\n");print("$upper\n");print("\n");?>5.实现把两个字符串进行分割合并,例如str1=aaaa,str2=bbbb,合并后生成abababab。/***MergestwostringsinawaythatapatternlikeABABABwillbe*theresult.**@paramstring$str1StringA*@paramstring$str2StringB*@returnstringMergedstring*/functionMergeBetween($str1,$str2){//Splitbothstrings$str1=str_split($str1,1);$str2=str_split($str2,1);//Swapvariablesifstring1islargerthanstring2if(count($str1)>=count($str2))list($str1,$str2)=array($str2,$str1);//Appendtheshorterstringtothelongerstringfor($x=0;$x<count($str1);$x++)$str2[$x].=$str1[$x];returnimplode('',$str2);}//范例演示:printMergeBetween('abcdef','__')."\n";printMergeBetween('__','abcdef')."\n";printMergeBetween('bb','aa')."\n";printMergeBetween('aa','bb')."\n";printMergeBetween('a','b')."\n";/*Output:a_b_cdefa_b_cdefbabaababab*/第4章1.答:虽然本习题的脚本相对比较简单,但是它包含了几个重要的概念:<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Strict//EN""/TR/xhtml1/DTD/xhtml1-strict.dtd"><htmlxmlns="/1999/xhtml"xml:lang="en"lang="en"><head><title>AddingAuthorNames</title><linkrel="stylesheet"type="text/css"href="common.css"/></head><body><h1>AddingAuthorNames</h1><?php$books=array(array("title"=>"TheHobbit","authorId"=>2,"pubYear"=>1937),array("title"=>"TheGrapesofWrath","authorId"=>0,"pubYear"=>1939),array("title"=>"ATaleofTwoCities","authorId"=>3,"pubYear"=>1859),array("title"=>"ParadiseLost","authorId"=>4,"pubYear"=>1667),array("title"=>"AnimalFarm","authorId"=>5,"pubYear"=>1945),array("title"=>"TheTrial","authorId"=>1,"pubYear"=>1925),);foreach($booksas&$book){$book["authorName"]=$authors[$book["authorId"]];}echo"<pre>";print_r($books);echo"</pre>";?></body></html>首先,这个脚本输出了一个XHTML页眉,然后定义了题目中指定的两个数组。程序的主要执行过程从后面的foreach循环开始:foreach($booksas&$book){$book["authorName"]=$authors[$book["authorId"]];}这个循环逐个访问$books数组中六个元素的每一个,并通过引用的方式把每个元素赋给了$book变量。为此,在foreach循环语句中,在$book变量前面多了一个&符号。这里必须采用引用赋值,因为在循环中需要修改这个变量的值。假如少了这个&符号,则程序只会对每个元素的副本进行操作,而$books数组中的内容并没有发生变化。循环体内的语句从$book变量的当前关联数组中读取“authorId”元素的值:$book["authorId"]然后根据它的值从索引数组$authors中读取相应的作者名字:$authors[$book["authorId"]] 最后,把作者的名字赋给$book关联数组中的一个新元素“authorName”:$book["authorName"]=$authors[$book["authorId"]];当循环结束时,用print_r()函数输出生成的数组。其结果如下:Array([0]=>Array([title]=>TheHobbit[authorId]=>2[pubYear]=>1937[authorName]=>Tolkien)[1]=>Array([title]=>TheGrapesofWrath[authorId]=>0[pubYear]=>1939[authorName]=>Steinbeck)[2]=>Array([title]=>ATaleofTwoCities[authorId]=>3[pubYear]=>1859[authorName]=>Dickens)[3]=>Array([title]=>ParadiseLost[authorId]=>4[pubYear]=>1667[authorName]=>Milton)[4]=>Array([title]=>AnimalFarm[authorId]=>5[pubYear]=>1945[authorName]=>Orwell)[5]=>Array([title]=>TheTrial[authorId]=>1[pubYear]=>1925[authorName]=>Kafka))2.答:在本习题中,重要的是要让读者认识到,地雷场采用的是一个二维的网格,因此需要用一个二维数组表示它。下面是其中一个解法:<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Strict//EN""/TR/xhtml1/DTD/xhtml1-strict.dtd"><htmlxmlns="/1999/xhtml"xml:lang="en"lang="en"><head><title>CreatingaMinefield</title><linkrel="stylesheet"type="text/css"href="common.css"/></head><body><h1>CreatingaMinefield</h1><?php$fieldSize=20;$numMines=10;$minefield=array();//Initializetheminefieldfor($x=0;$x<$fieldSize;$x++){$minefield[$x]=array();for($y=0;$y<$fieldSize;$y++){$minefield[$x][$y]=false;}}//Addtheminesfor($i=1;$i<=$numMines;$i++){do{$mineX=rand(0,19);$mineY=rand(0,19);}while($minefield[$mineX][$mineY]);$minefield[$mineX][$mineY]=true;}//Displaytheminefieldecho"<pre>";for($y=0;$y<$fieldSize;$y++){for($x=0;$x<$fieldSize;$x++){echo($minefield[$x][$y])?"*":".";}echo"\n";}echo"</pre>";?></body></html>首先,这个脚本输出一个页眉,并定义了几个配置变量,$fieldSize表示地雷场的边长,$numMines表示埋在地雷场中的地雷个数。接着脚本创建了一个名为$minefield的数组,并循环访问这个数组的全部20个元素。对于每个元素,脚本又创建了一个嵌套数组,并将它放在了这个元素中,然后循环访问嵌套数组的前20个元素,并把它们的值设置为false,表示一个空格(这个初始化过程并非必需的,因为PHP会根据需要实时地创建数组,但是最好先把地雷场设置为默认值,这样我们就可以确定地雷场中埋有什么东西)。地雷场初始化后,脚本需要给它添加地雷。为此脚本创建了一个循环,从1开始循环到地雷的个数($numMines)。在这个循环中,脚本用随机函数生成新地雷的随机位置x和y,并且用一个循环判断这个位置,保证新位置还没有放置地雷,如果已放置了地雷,则在do...while循环中继续生成一个随机位置,直到找到一个没有地雷的位置为止。然后把相应的元素设置为true。这样就建立了一个地雷场。当全部10个地雷都已放置好后,接下去就用循环语句输出这个二维数组,输出每个元素。输出每一行后,脚本会输出一个换行符(\n),从而开始输出另一行。把整个栅格插入到<pre>...</pre>标签中,可以保证栅格在页面中正确对齐:....................*.................................................................*.........*................................................*.................................................................*..............................................*..........*..*...............................................................................*........................................*......第5章1.答:很容易设计一个正则表达式,从一个WebURL地址中读取域名,因为URL地址总是使用一个统一的语法。读者可以用很多方法创建这样一个表达式。下面是其中一种方法:|(http(s)?\://)?(www.)?([a-zA-Z0-9\-\.]+)|这个表达式可以理解为:(1)如果http或https出现在URL中,则http或https后面必须跟一个冒号和两个斜杠。(2)如果URL中有“www.”,则必须与它相匹配。(3)匹配其他字符,直到遇到一个不是字母、数字、连字符或句点的字符为止。由于这个正则表达式包含子模式,因此得到的域名部分如下:$url="/hello/there.html";echo"Domainname:".$matches[4];//Displays"Domainname:"2.答:为了修改find_links.php脚本,使得它还可以显示每个超链接的文本,只需要修改正则表达式,插入一个匹配链接文本的子模式即可:/<a\s*href=['\"](.+?)['\"].*?>(.*?)<\/a>/I然后用一个表格显示匹配结果。下面是修改后的find_links.php脚本(修改过的行用高亮显示)。<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Strict//EN""/TR/xhtml1/DTD/xhtml1-strict.dtd"><htmlxmlns="/1999/xhtml"xml:lang="en"lang="en"><head><title>FindLinkedURLsinaWebPage</title><linkrel="stylesheet"type="text/css"href="common.css"/></head><body><h1>FindLinkedURLsinaWebPage</h1><?phpdisplayForm();if(isset($_POST["submitted"])){processForm();}functiondisplayForm(){?><h2>EnteraURLtoscan:</h2><formaction=""method="post"style="width:30em;"><div><inputtype="hidden"name="submitted"value="1"/><labelfor="url">URL:</label><inputtype="text"name="url"id="url"value=""/><label></label><inputtype="submit"name="submitButton"value="FindLinks"/></div></form><?php}functionprocessForm(){$url=$_POST["url"];if(!preg_match('|^http(s)?://|’,$url))$url="http://$url";$html=file_get_contents($url);echo'<divstyle="clear:both;"></div>';echo"<h2>LinkedURLsfoundat".htmlspecialchars($url).":</h2>";echo"<table><tr><th>URL</th><th>Linktext</th>";for($i=0;$i<count($matches[1]);$i++){echo"<tr><td>".htmlspecialchars($matches[1][$i])."</td>";echo"<td>".htmlspecialchars($matches[2][$i])."</td></tr>";}echo"</table>";}?></body></html>第6章1.答:参考“6.1表单”一节。2.答:两个页面即可实现,html页面写一个ajax,参考程序如下:<script>vark=$("#kk").val();//获取用户输入的查找内容$.ajax({type:'get',url:'xx.php',data:'keyword='+i,success:function(data){vardata1=eval("("+data+")");if(data1){$('#main').html(data1);//显示结果}},});</script>xx.php:if($_GET){$key=isset($_GET['keyword'])?$_GET['keyword']:'';if($key){//连接数据库通过关键词查找相关内容..$content//结果返回:echojson_encode($content);exit();}else{echojson_encode('');exit();}}答:参考“【例6-2】用户注册页面”。答:参考“7.2HTTP的使用”。第7章1.答:时间戳是一个整数,表示自1970年1月1日午夜(UTC时间)至今间隔时间的秒数。大多数计算机都是以Unix时间戳(简称时间戳)格式保存日期和时间的。例如,格林尼治标准时间为“2007年2月14日16时48分12秒”,用UNIX时间戳表示为1171471692,因为从1970年1月1日午夜到2007年2月14日16:48:12之间是1171471692秒。2.参考程序如下。用PHP的time()函数可以读取这个时钟的值,这个函数将会返回当前日期和时间的时间戳:echotime();//输出类似"1229509316"的时间戳3.参考答案:mktime()函数可以根据多达6个的时间/日期参数返回一个时间戳,语法格式如下:intmktime([int$hour=date("H")[,int$minute=date("i")[,int$second=date("s")[,int$month=date("n")[,int$day=date("j")[,int$year=date("Y")[,int$is_dst=-1]]]]]]])其中参数说明如下:$hour:时(0~23)$minute:分(0~59)$second:秒(0~59)$month:月(1~12)$day:日(1~31)$year:年(1901~2038)例如,下面这条语句可以显示2022年1月1日下午1:30:00的时间戳:echomktime(13,30,00,1,1,2022);4.答:date()函数可以把一个时间戳转换为一个日期字符串。语法格式如下:stringdate(string$format[,int$timestamp])例如,可以把一种日期和时间格式转换成如下所示的容易理解的字符串:$d=strtotime("March28,20229:42am");echodate("\Tdate()可以把提供的时间戳转换为服务器的时区,如果想要保留UTC时区,需要使用gmdate()函数。示例如下:date_default_timezone_set("America/Indiana/Indianapolis");$d=strtotime("March28,20229:42am");echodate("Fj,Yg:iA",$d)."<br/>"; //输出"March28,20229:42AM"echogmdate("Fj,Yg:iA",$d)."<br/>"; //输出"March28,20222:42PM"\h\ejS\o\\fF,Y,\a\\tg:iA",$d);//输出"Th28thofMarch,2022,at9:42AM"5.答:DateTime对象还可以用于日期的比较和计算等。例如,下面的代码创建了一个DateTime对象,它表示洛杉矶时区的2022年2月13日这个日期,然后从这个日期减去3个月,最后显示结果:$dtz=newDateTimeZone("America/Los_Angeles");$dt=newDateTime("13-Feb-2022",$dtz);$dt->modify("-3months");echo$dt->format(DateTime::RFC2822);//输出"Mon,13Nov202100:00:00-0800"第8章1.答:(1)数据库连接配置页面:connectvars.php:<?php//数据库的位置define('DB_HOST','');//用户名define('DB_USER','root');//口令define('DB_PASSWORD','123456');//数据库名define('DB_NAME','test');?>(2)登录页面:logIn.php:<?php//插入连接数据库的相关信息require_once'connectvars.php';//开启一个会话session_start();$error_msg="";//如果用户未登录,即未设置$_SESSION['user_id']时,执行以下代码if(!isset($_SESSION['user_id'])){if(isset($_POST['submit'])){//用户提交登录表单时执行如下代码$dbc=mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME);$user_username=mysqli_real_escape_string($dbc,trim($_POST['username']));$user_password=mysqli_real_escape_string($dbc,trim($_POST['password']));if(!empty($user_username)&&!empty($user_password)){//MySql中的SHA()函数用于对字符串进行单向加密$query="SELECTuser_id,usernameFROMmismatch_userWHEREusername='$user_username'AND"."password=SHA('$user_password')";$data=mysqli_query($dbc,$query);//用用户名和密码进行查询,若查到的记录正好为一条,则设置SESSION和COOKIE,同时进行页面重定向if(mysqli_num_rows($data)==1){$row=mysqli_fetch_array($data);$_SESSION['user_id']=$row['user_id'];$_SESSION['username']=$row['username'];setcookie('user_id',$row['user_id'],time()+(60*60*24*30));setcookie('username',$row['username'],time()+(60*60*24*30));$home_url='loged.php';header('Location:'.$home_url);}else{//若查到的记录不对,则设置错误信息$error_msg='Sorry,youmustenteravalidusernameandpasswordtologin.';}}else{$error_msg='Sorry,youmustenteravalidusernameandpasswordtologin.';}}}else{//如果用户已经登录,则直接跳转到已经登录页面$home_url='loged.php';header('Location:'.$home_url);}?><html><head><title>Mismatch-LogIn</title><linkrel="stylesheet"type="text/css"href="style.css"/></head><body><h3>Msimatch-LogIn</h3><!--通过$_SESSION['user_id']进行判断,如果用户未登录,则显示登录表单,让用户输入用户名和密码--><?phpif(!isset($_SESSION['user_id'])){echo'<pclass="error">'.$error_msg.'</p>';?><!--$_SERVER['PHP_SELF']代表用户提交表单时,调用自身php文件--><formmethod="post"action="<?phpecho$_SERVER['PHP_SELF'];?>"><fieldset><legend>LogIn</legend><labelfor="username">Username:</label><inputtype="text"id="username"name="username"value="<?phpif(!empty($user_username))echo$user_username;?>"/><br/><labelfor="password">Password:</label><inputtype="password"id="password"name="password"/></fieldset><inputtype="submit"value="LogIn"name="submit"/></form><?php}?></body></html>2.答:参考程序如下。<?php/*@PHP在线人数统计程序Howtouseit:<scriptsrc="online.php"></script>note:一般独立在线人数统计程序都是统计在线的IP数,而这并不准确例如局域网的访问者,比如公司,学校机房和网吧,虽然内网IP不同,但是外网IP都是一样如果同一个局域网的无论多少人人访问你的网站则只被认为是一个人这个小巧的程序解决了此问题,它以电脑为单为,每台电脑便算一个访问者当然因为使用的是COOKIE,如果你在同一台电脑上使用两种不同核心的浏览器访问那就别当别论了*/$filename='online.txt';//数据文件,如果没有新建$cookiename='VGOTCN_OnLineCount';//cookie名称$onlinetime=600;//在线有效时间,单位:秒(即600等于10分钟)@$online=file($filename);//数据文件,如果没有新建$nowtime=time();$nowonline=array();/*@得到仍然有效的数据*/if(!empty($online)){foreach($onlineas$line){$row=explode('|',$line);$sesstime=trim($row[1]);if(($nowtime-$sesstime)<=$onlinetime){//如果仍在有效时间内,则数据继续保存,否则被放弃不再统计$nowonline[$row[0]]=$sesstime;//获取在线列表到数组,会话ID为键名,最后通信时间为键值}}}/*@创建访问者通信状态使用cookie通信COOKIE将在关闭浏览器时失效,但如果不关闭浏览器,此COOKIE将一直有效,直到程序设置的在线时间超时*/if(isset($_COOKIE[$cookiename])){//如果有COOKIE即并非初次访问则不添加人数并更新通信时间$uid=$_COOKIE[$cookiename];}else{//如果没有COOKIE即是初次访问$vid=0;//初始化访问者IDdo{//给用户一个新ID$vid++;$uid='U'.$vid;}while(array_key_exists($uid,$nowonline));setcookie($cookiename,$uid);}$nowonline[$uid]=$nowtime;//更新现在的时间状态/*@统计现在在线人数*/$total_online=count($nowonline);/*@写入数据*/if($fp=@fopen($filename,'w')){if(flock($fp,LOCK_EX)){rewind($fp);foreach($nowonlineas$fuid=>$ftime){$fline=$fuid.'|'.$ftime."\n";@fputs($fp,$fline);}flock($fp,LOCK_UN);fclose($fp);第9章1.答:Student(学生表):createtableSTUDENT(snoVARCHAR2(3)notnull,snameVARCHAR2(8)notnull,ssexVARCHAR2(2)notnull,sbirthdayDATE,classVARCHAR2(5))tablespaceUSERSpctfree10initrans1maxtrans255;--AddcommentstothetablecommentontableSTUDENTis‘学生表‘;--AddcommentstothecolumnscommentoncolumnSTUDENT.snois‘学号(主键)‘;commentoncolumnSTUDENT.snameis‘学生姓名‘;commentoncolumnSTUDENT.ssexis‘学生性别‘;commentoncolumnSTUDENT.sbirthdayis‘学生出生年月‘;commentoncolumnSTUDENT.classis‘学生所在班级‘;Course(课程表):createtableCOURSE(cnoVARCHAR2(5)notnull,cnameVARCHAR2(10)notnull,tnoVARCHAR2(3)notnull)tablespaceUSERSpctfree10initrans1maxtrans255;--AddcommentstothetablecommentontableCOURSEis‘课程表‘;--AddcommentstothecolumnscommentoncolumnCOURSE.cnois‘课程号(主键)‘;commentoncolumnCOURSE.cnameis‘课程名称‘;commentoncolumnCOURSE.tnois‘教工编号(外键)‘;Score(成绩表):createtableSCORE(snoVARCHAR2(3)notnull,cnoVARCHAR2(5)notnull,degreeNUMBER(4,1))tablespaceUSERSpctfree10initrans1maxtrans255;--AddcommentstothetablecommentontableSCOREis‘成绩表‘;--AddcommentstothecolumnscommentoncolumnSCORE.snois‘学号(外键)‘;commentoncolumnSCORE.cnois‘课程号(外键)‘;commentoncolumnSCORE.degreeis‘成绩‘;Teacher(教师表):createtableTEACHER(tnoVARCHAR2(3)notnull,tnameVARCHAR2(4)notnull,tsexVARCHAR2(2)notnull,tbirthdayDATE,profVARCHAR2(6),departVARCHAR2(10)notnull)tablespaceUSERSpctfree10initrans1maxtrans255;--AddcommentstothetablecommentontableTEACHERis‘教师表‘;--AddcommentstothecolumnscommentoncolumnTEACHER.tnois‘教工编号(主键)‘;commentoncolumnTEACHER.tnameis‘教工姓名‘;commentoncolumnTEACHER.tsexis‘教工性别‘;commentoncolumnTEACHER.tbirthdayis‘教工出生年月‘;commentoncolumnTEACHER.profis‘职称‘;commentoncolumnTEACHER.departis‘教工所在部门‘;2.答:略。第10章1.答:参考“10.2.1连接MySQL服务器”一节。2.答:参考“10.2.4mysql_fetch_array()函数”一节。3.答:参考“10.2.5mysql_fetch_object()函数”一节。4.答:参考“10.2.6mysql_fetch_row()函数”一节。5.答:参考“10.2.7mysql_num_rows()函数”一节。6.答:参考“10.3.4修改数据操作”一节,使用UPDATE语句进行操作。7.答:使用DELETE语句和WHERE子句进行操作。8.答:参考“10.2.9关闭连接”。第11章1.答:参考程序如下。//计算出c.php相对于e.php的相对路径应该是../../c/d/e/f/g/h/$a='/a/b/c/d/e/f/g/h/e.php';$b='/a/b/1/2/c.php';//c.php相对于e.phpechogetpathinfo($a,$b);//e.php相对于c.php//echogetpathinfo($b,$b);/***方法一*@param$path1*@param$path2*@returnstring*/functiongetpathinfo($path1,$path2){$a2array=explode('/',dirname($path1));$b2array=explode('/',dirname($path2));$pathinfo='';for($i=1;$i<=count($b2array)-1;$i++){//如果两个路径长度不同下标if(!isset($a2array[$i])){$a2array[$i]='';}elseif(!isset($a2array[$i])){$b2array[$i]='';}$pathinfo.=$a2array[$i]==$b2array[$i]?'../':$b2array[$i].'/';}return$pathinfo;}2.答:先打开此文件用fopen函数:<?php$file_path=fopen("file1.txt","a");读取该文件的内容用fread函数,$content=fread($file_path,filesize("file1.txt"));写入6行字符串用fwrite函数,因为同样的内容,所以考虑用for循环:for($i=0;$i<6;$i++){fwrite($file_path,"\r\n"."Iloveyou"."\r\n");}因为要拷贝到e盘根目录用copy函数:$file_path2="e:/file2.txt";copy("file1.txt",$file_path2);3.答:<html><head><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/><title>php版文件查找(filesearch)</title></head><body><formaction=""method="post"><p>文件查找(注:区分大小写)</p><p>路径:<inputtype="text"name="path"/></p><p>查找:<inputtype="text"name="key"/></p><p><inputtype="submit"name="sub"value="开始"/></p></form></body></html><?php/**注:区分大小写*by://*/if(!empty($_POST['path'])&&!empty($_POST['key'])){echo"在路径".$_POST['path']."/中查找".$_POST['key']."的结果为:<hr/>";$file_num=$dir_num=0;$r_file_num=$r_dir_num=0;$findFile=$_POST['key'];functiondelDirAndFile($dirName){if($handle=@opendir("$dirName")){while(false!==($item=readdir($handle))){if($item!="."&&$item!=".."){if(is_dir("$dirName/$item")){delDirAndFile("$dirName/$item");}else{$GLOBALS['file_num']++;if(strstr($item,$GLOBALS['findFile'])){echo"<span><b>$dirName/$item</b></span><br/>\n";$GLOBALS['r_file_num']++;}}}}closedir($handle);$GLOBALS['dir_num']++;if(strstr($dirName,$GLOBALS['findFile'])){$loop=explode($GLOBALS['findFile'],$dirName);$countArr=count($loop)-1;if(empty($loop[$countArr])){echo"<spanstyle='color:#297C79;'><b>$dirName</b></span><br/>\n";$GLOBALS['r_dir_num']++;}}}else{die("没有此路径!");}}delDirAndFile($_POST['path']);echo"<hr/>本次共搜索到".$file_num."个文件,文件夹".$dir_num."个<br/>";echo"<hr/>符合结果的共".$r_file_num."个文件,文件夹".$r_dir_num."个<br/>";}?>4.答:<?php//递归函数实现遍历指定文件下的目录与文件数量functiontotal($dirname,&$dirnum,&$filenum){$dir=opendir($dirname);echoreaddir($dir)."<br>";//读取当前目录文件echoreaddir($dir)."<br>";//读取上级目录文件while($filename=readdir($dir)){//要判断的是$dirname下的路径是否是目录$newfile=$dirname."/".$filename;//is_dir()函数判断的是当前脚本的路径是不是目录if(is_dir($newfile)){//通过递归函数再遍历其子目录下的目录或文件total($newfile,$dirnum,$filenum);$dirnum++;}else{$filenum++;}}closedir($dir);}$dirnum=0;$filenum=0;total("E:/AppServ/www/phpMyAdmin",$dirnum,$filenum);echo"目录总数:".$dirnum."<br>";echo"文件总数:".$filenum."<br>";//遍历指定文件目录与文件数量结束?>5.答:<?php/*复制xCopy函数用法:*xCopy("feiy","feiy2",1):拷贝feiy下的文件到feiy2,包括子目录*xCopy("feiy","feiy2",0):拷贝feiy下的文件到feiy2,不包括子目录*参数说明:*$source:源目录名*$destination:目的目录名*$child:复制时,是不是包含的子目录*/functionxCopy($source,$destination,$child){if(!file_exists($destination)){if(!mkdir(rtrim($destination,'/'),0777)){//$err->add($_LANG['cannt_mk_dir']);returnfalse;}@chmod($destination,0777);}if(!is_dir($source)){return0;}if(!is_dir($destination)){mkdir($destination,0777);}$handle=dir($source);while($entry=$handle->read()){if(($entry!=".")&&($entry!="..")){if(is_dir($source."/".$entry)){if($child)xCopy($source."/".$entry,$destination."/".$entry,$child);}else{copy($source."/".$entry,$destination."/".$entry);}}}return1;}/*删除deldir函数用法:*deldidr("feiy"):删除feiy,包括子目录*参数说明:*$dir:要删除的目录名*/functiondeldir($dir){if(!file_exists($dir)){returntrue;}else{@chmod($dir,0777);}$dh=opendir($dir);while($file=readdir($dh)){if($file!="."&&$file!=".."){$fullpath=$dir."/".$file;if(!is_dir($fullpath)){unlink($fullpath);}else{deldir($fullpath);}}}closedir($dh);if(rmdir($dir)){returntrue;}else{returnfalse;}}?>第12章1.答:成功完成这个习题的关键是要记住图像的左上角是(0,0)。这意味着,必须将宽度和高度各减去1才能够得到右下角的位置。下面是绘制这个矩形黑色边框的代码:<?php$myImage=imagecreatefromjpeg("hook.jpg");$black=imagecolorallocate($myImage,0,0,0);$width=imagesx($myImage);$height=imagesy($myImage);imagerectangle($myImage,0,0,$width-1,$height-1,$black);header("Content-type:image/jpeg");imagejpeg($myImage);imagedestroy($myImage);?>如果读者的脚本与这个脚本相似,就会得到一个如图1所示的图像,图像的边界清楚可见。图12.答:显然有两种方法可以用来图形化显示磁盘空间。最快和最容易的方法是创建一个简单的水平比例图:一个由两部分颜色组成的矩形,一个代表已用空间的颜色,另一个代表可用空间的颜色。它能够清楚地表明磁盘的使用情况。它的代码如下。最好把图像的宽度和高度存储在脚本变量中,这样,当我们需要改变图像的大小时,只需要在脚本的开头进行修改即可,脚本会自动更新图像的大小:<?php$iWidth=500;$iHeight=50;创建这个图像,并给它分配黑白两种颜色。由于先分配的是白色,因此它是图像的背景色,黑色是图像的边框色:$myImage=imagecreate($iWidth,$iHeight);$white=imagecolorallocate($myImage,255,255,255);$black=imagecolorallocate($myImage,0,0,0);在这个解答中,红色和绿色分别表示已用空间和可用空间,读者也可以选择其他颜色:$red=imagecolorallocate($myImage,255,0,0);$green=imagecolorallocate($myImage,0,255,0);用两个函数分别读取磁盘的总空间和可用空间。然后以字节为单位返回这两个值。它们的实际大小并不重要,关键是要计算它们之间的比例,这样才能画出矩形图:$diskTotal=disk_total_space("/");$diskFree=disk_free_space("/");然后在图像的周围绘制一个像素大小的边框:imagerectangle($myImage,0,0,$iWidth-1,$iHeight-1,$black);$threshold变量用来表示x轴上的某个位置,这个位置表示图中已用空间与可用空间之间的分界位置。由于在这类图像中,一般已用空间通常会出现在左侧,因此首先需要计算已用空间,即总空间减去可用空间。将得到的差再除以总空间,得到一个0到1之间的值,再把这个值乘上图像的宽度,就可以得到这个分界位置。注意,图像的宽度要减去2,因为图像的边框占用了两个像素。然后还要再加上$threshold的值,因为第一个像素是从0开始的:$threshold=intval((($diskTotal-$diskFree)/$diskTotal)*($iWidth-2))+1;例如,假如磁盘的空间为400字节,已用空间为200字节,则200除以400得到0.5。如果图像的宽度为500像素,则把0.5乘上498(宽度减去边框2),得到249。然后再加1,得到250。因此,x像素的位置正好是图像的中间位置。用红色矩形从左到右填充图像,直到分界点位置,表示已用空间:imagefilledrectangle($myImage,1,1,$threshold,($iHeight-2),$red);然后用一个绿色矩形表示可用空间:imagefilledrectangle($myImage,($threshold+1),1,($iWidth-2),$iHeight-2,$green);最后,按通常的方式结束此脚本:header("Content-type:image/png");imagepng($myImage);imagedestroy($myImage);?图2是这个脚本的结果。图2这个习题的另一种解答是用把磁盘空间画成一个饼图。下面是绘制过程。这种方法不需要计算分界点位置,但是要计算度数。计算方法与前面相似,只是乘上的不是图像的宽度,而是360度,这是一个圆的度数。<?php$iWidth=200;$iHeight=200;$myImage=imagecreate($iWidth,$iHeight);$white=imagecolorallocate($myImage,255,255,255);$red=imagecolorallocate($myImage,255,0,0);$green=imagecolorallocate($myImage,0,255,0);$diskTotal=disk_total_space("/");$diskFree=disk_free_space("/");$usedDegrees=intval((($diskTotal-$diskFree)/$diskTotal)*360);imagefilledarc()函数的作用与imagearc()函数的作用一样,只是它需要另外几个参数来说明扇形的填充方式。PHP的常量IMG_ARC_EDGED表示把扇形的两个端点连接到扇形的中心,并用指定的颜色进行填充。然后从0度到刚才计算得到的度数$usedDegrees之间画一个扇形:2,0,$usedDegrees,$red,IMG_ARC_EDGED);为了画一个扇形表示可用空间,我们只需要从第一个扇形的结束位置($usedDegrees)到360度之间画一个扇形即可:$usedDegrees,360,$green,IMG_ARC_EDGED);然后按一般的方法结束脚本:header("Content-type:image/png");imagepng($myImage);imagedestroy($myImage);?图3是这个脚本的结果。图3第13章1.答:为了在Calculator类中存储两个值,需要定义两个属性,并添加一个构造函数。当调用程序创建一个Calculator对象时,把通过构造函数传递过来的参数存储到这两个属性中。接着就是四个简单的方法,对这两个值进行相应的计算,并返回结果:<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Strict//EN""/TR/xhtml1/DTD/xhtml1-strict.dtd"><htmlxmlns="/1999/xhtml"xml:lang="en"lang="en"><head><title>AsimpleCalculatorclass</title><linkrel="stylesheet"type="text/css"href="common.css"/></head><body><h2>AsimpleCalculatorclass</h2><?phpclassCalculator{private$_val1,$_val2;publicfunction__construct($val1,$val2){$this->_val1=$val1;$this->_val2=$val2; }publicfunctionadd(){return$this->_val1+$this->_val2;}publicfunctionsubtract(){return$this->_val1-$
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年安全防火培训内容感想落地方案
- 2026年工厂新工安全培训内容实操要点
- 员工进行安全培训内容2026年底层逻辑
- 2026年广东餐饮安全培训内容实操要点
- 鹤壁市浚县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 2026年安全培训内容和收获重点
- 2026年系统方法生产安全知识培训内容
- 衡水市冀州市2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 贵阳市小河区2025-2026学年第二学期五年级语文第六单元测试卷(部编版含答案)
- 赣州市石城县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 中国石油大学(华东)辅导员考试真题2022
- 空压机搬迁安装施工安全技术措施方案
- 熔化焊与热切割基础知识
- 我国企业的产业整合与收购兼并
- 玻璃幕墙安全专项施工方案专家论证本
- 【公开课】花鼓戏
- 高聚物合成工艺学
- 《集成电路原理与设计》重点内容总结
- 2022年天津注册会计师《审计》考试题库汇总(含典型题和真题)
- 600MW火电厂集控主机运行规程
- 功率场效应晶体管绝缘栅双极型晶体管课件
评论
0/150
提交评论