PHP編程基礎與實例教程第二版練習題參考答案_第1頁
PHP編程基礎與實例教程第二版練習題參考答案_第2頁
PHP編程基礎與實例教程第二版練習題參考答案_第3頁
PHP編程基礎與實例教程第二版練習題參考答案_第4頁
PHP編程基礎與實例教程第二版練習題參考答案_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

由于時間倉促,答案中難免存在錯誤,不妥之處懇請讀者批評指正!第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');//設置中國時區(qū)echodate("Y/m/dH:i:s",time()+24*3600);//打印明天的時間>date()函數(shù)中:d:幾日,兩位數(shù)字,若不足則補零;從"01"至"31"D:星期幾,3個英文字母,如:"Fri"F:月份,英文全名,如:"January"h:12小時制的小時,從"01"至"12"H:24小時制的小時,從"00"至"23"m:月份,兩位數(shù)字,從"01"至"12"M:月份,3個英文字母;如:"Jan"s:秒;從"00"至"59"w:數(shù)字型的星期幾,從"0(星期天)"至"6(星期六)"Y:年,四位數(shù)字y:年,兩位數(shù)字z:一年中的第幾天;從"1"至"366"time()函數(shù)返回當前時間的Unix時間戳,即:自從Unix紀元(格林威治時間1970年1月1日00:00:00)到當前時間的秒數(shù)。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.12.答案見教材2.1.23.答案見教材2.2.2布爾型主要用于邏輯判斷,整型和浮點型主要用于算術(shù)運算,字符串主要用于文字性描述,數(shù)組實際上是用于容納若干變量的容器。當使用面向?qū)ο缶幊趟枷霑r,需要使用對象描述事物(屬性及方法)。4.echo與print共同點:它們都不是真正的函數(shù),是一種語法結(jié)構(gòu),因為語句沒有返回值,函數(shù)可以有返回值(即便沒有用)(也有說print是函數(shù),echo不是)。echo和print后面都可不用加(),如:echo'ok';print'ok';運行速度echo稍快一些,因為echo并不返回值,print返回一個值int(1)。echo與print區(qū)別:一般用echo,除非三元運算時。$a=5;($a==5)?print'5':print0;echo后不要跟()。print只能有一個參數(shù),所以不能不能用",",而echo可以。echo--輸出一個或者多個字符串print_r是遞歸打印,主要用于打印復雜類型變量的值(如數(shù)組,對象)5.答案見教材2.36.答案見教材圖2.37.<?phpclassTest{functionget_test($num){$num=md5(md5($num));return$num;}}$test=newTest();$password=$test->get_test("123");echo$password;//輸出字符串“123”兩次md5加密結(jié)果:d9b1d7db4cd6e70935368a1efb10e377>第3章答案:選擇題:1:C2:B3:A4:D(說明:PHP變量以一個美元符號為開頭,后面跟上任意數(shù)量的數(shù)字、字母和下劃線。${“MyVar”}是一個合法的變量名,它使用的是較松散的命名約定。&$something是對$something的引用。然而,變量名不能以數(shù)字為開頭,$10_somethings是非法的,因此答案是D。)5:D(說明:這又是一個考驗debug能力的題。注意到了嗎,在腳本的末尾,echo語句中的?$output變量拼錯了!腳本不會輸出任何東西,答案是D),6:D(說明:%運算符表示取模,它返回兩個操作數(shù)相除的余數(shù)。<<是左移運算符,相當于乘以2的N次方。最后的答案乘以了一個浮點數(shù),改變了它的數(shù)據(jù)類型。但是,由于小數(shù)點后是零,因此輸出的結(jié)果不包含小數(shù)部分。答案是256)7:B(說明:全等運算符比較兩個操作數(shù)的數(shù)據(jù)類型和值,兩者中有一個不同,都會返回False。因此答案是B)8:AC(說明:A選項中,pow函數(shù)計算2的平方,答案是4。C選項中,左移運算符將$a的值左移兩位,相當于乘以4)9:D10:B填空題:邏輯異或(xor)運算符02程序閱讀題相等相等不相等truetruetruetruetruefalsetruefalseaaaaaa41hotdogokiszero4問答題:1.isset($str)用于測試變量是否設置(或者存在),empty($str)用于測試變量是否為空。檢測變量是否為空使用is_null()和empty()函數(shù)。is_null()和empty()函數(shù)的區(qū)別請參考下面的程序:<?php$a=0;var_dump(empty($a));//輸出:bool(true)echo"<br/>";var_dump(is_null($a));//輸出:bool(false)>2.PHP垃圾回收機制是基于引用計數(shù)機制的垃圾回收,當一個變量的引用計數(shù)變?yōu)?時,PHP將在內(nèi)存中銷毀這個變量,此時啟動垃圾回收機制。當一個變量被初始化或者賦值給另一個變量時引用計數(shù)會加1,當變量或者被賦值的變量被銷毀或者被偵測到無用時引用計數(shù)會減一,當垃圾收集的進程運行時會釋放掉引用計數(shù)為0的那些變量會被從內(nèi)存中釋放(垃圾回收期間程序會被中斷)。當腳本執(zhí)行完成時所有資源都會被釋放。3.按值傳遞:函數(shù)范圍內(nèi)對值的任何改變在函數(shù)外部都會被忽略按引用傳遞:函數(shù)范圍內(nèi)對值的任何改變在函數(shù)外部也能反映出這些修改區(qū)別:按值傳遞時,php必須復制值。特別是對于大型的字符串和對象來說,這將會是一個代價很大的操作。按引用傳遞則不需要復制值,對于性能提高很有好處。傳值只是把某一個變量的值傳給了另一個變量,而引用則說明兩者指向了同一個地方。4.<?phpif("0"==0){echo"==";//輸出“==”}if("0"===0){echo"===";//沒有任何輸出}>5.<?php$var1=1;$var2=7;$var3=8;$max=$var1>$var2?$var1:$var2;$max=$max>$var3?$max:$var3;echo$max;>第4章答案:選擇題:1.D(說明:根據(jù)條件式的邏輯,要想得到Hello,World!字符串,必須要在第一個if結(jié)構(gòu)中滿足else的條件。因此$a必須為False,然后$b也必須為False。最內(nèi)層的條件語句的實現(xiàn)要求先前的兩個變量($a和$b)是False,而$c必須是True)2.C3.A4.E編程題:<?phpswitch($a){case'a':somefunction();break;case'b':anotherfunction();break;case'c':dosomething();break;default:donothing();}>第5章答案:選擇題:1.D2.B3.B4.A(說明:注意,$myarray的鍵值并沒有打上引號。所以,正在訪問的鍵不是myvalue字符串,而是常量myvalue的值。最終訪問的是$myarray[10],值是Dog,答案是A。)5.A(說明:5.通常情況下,foreach語句是遍歷數(shù)組的首選。但是,由于foreach語句是在數(shù)組的副本上進行操作,而我們需要給數(shù)組中每個元素重新賦值,所以在這里foreach就不適用了。盡管也可以用while循環(huán)和do…while循環(huán),但由于數(shù)組是順序索引的,最合適的語句還是for語句。因此答案是A。)6.C7.E8.B(說明:foreach操作的是$array的副本,因此對原來的值沒有影響)9.B(說明:只有asort函數(shù)能在保留原有索引關(guān)系的前提下進行排序。答案是B)10.A11.B,D(說明:array_flip()只能把數(shù)組中每個元素的鍵和值進行交換。rsort()和array_reverse()則能把題目中的數(shù)組逆向排序為需要的形式(’d’,’c’,’b’,’a’)。答案是B和D。)12.B13.D14.A15.A16.A問答題:1.sort(),asort()以及ksort()三個函數(shù)之間有什么區(qū)別?在什么情況下會使用他們?答案參見教材5.4.72.<?php$arr=array('james','tom','symfony');echojoin(',',$arr);//方法1echo"<br/>";echoimplode(',',$arr);//方法2>編程題:第一題:說明:當$ip是合法IP地址時,程序運行結(jié)果是1。當$ip不是合法IP地址時,程序運行結(jié)果是空字符串。<?php$ip="11";$flag=false;//將標記flag初始化為false$ips=explode(".",$ip);//使用“.”分割字符串,將分割后的字符串放到數(shù)組中$count=count($ips);//獲取數(shù)組的長度if($count!=4){//如果數(shù)組的長度不是4,說明是非法IP地址,退出程序exit($flag);}for($i=0;$i<$count;$i++){//IP地址的每一位必須是數(shù)字、并且在0--255區(qū)間取值if(is_numeric($ips[$i])&&$ips[$i]>=0&&$ips[$i]<=255){$flag=true;}else{//如果某一位不是數(shù)字,或者沒有在在0--255區(qū)間取值,說明是非法IP地址,退出for循環(huán)$flag=false;break;}}exit($flag);>第二題:可用冒泡法進行排序。冒泡排序的基本概念是:依次比較相鄰的兩個數(shù),將小數(shù)放在前面,大數(shù)放在后面。即首先比較第1個和第2個數(shù),將小數(shù)放前,大數(shù)放后。然后比較第2個數(shù)和第3個數(shù),將小數(shù)放前,大數(shù)放后,如此繼續(xù),直至比較最后兩個數(shù),將小數(shù)放前,大數(shù)放后,此時第一趟結(jié)束,在最后的數(shù)必是所有數(shù)中的最大數(shù)。重復以上過程,仍從第一對數(shù)開始比較(因為可能由于第2個數(shù)和第3個數(shù)的交換,使得第1個數(shù)不再小于第2個數(shù)),將小數(shù)放前,大數(shù)放后,一直比較到最大數(shù)前的一對相鄰數(shù),將小數(shù)放前,大數(shù)放后,第二趟結(jié)束,在倒數(shù)第二個數(shù)中得到一個新的最大數(shù)。如此下去,直至最終完成排序。<?php$str=array(3,6,1,5,9,0,4,6,11);for($i=0;$i<count($str);$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;}}}print_r($str);?>第三題:說明:這里使用了字符串處理函數(shù)ucwords()。<?php$string="make_by_id";$str="";$array=explode('_',$string);for($k=0;$k<count($array);$k++){$str=$str.ucwords($array[$k]);}echo$str;>第6章答案:選擇題:AB,DC問答題:1.答:get是發(fā)送請求HTTP協(xié)議通過url參數(shù)傳遞進行接收,而post是實體數(shù)據(jù),可以通過表單提交大量信息。區(qū)別如下:a、Get方法通過URL請求來傳遞用戶的數(shù)據(jù),將表單內(nèi)各字段名稱與其內(nèi)容,以成對的字符串連接,置于action屬性所指程序的url后,如/test.asp?name=51js&password=51js,數(shù)據(jù)都會直接顯示在url上,就像用戶點擊一個鏈接一樣;Post方法通過HTTPpost機制,將表單內(nèi)各字段名稱與其內(nèi)容放置在HTML表頭(header)內(nèi)一起傳送給服務器端交由action屬性能所指的程序處理,該程序會通過標準輸入(stdin)方式,將表單的數(shù)據(jù)讀出并加以處理b、Get方式需要使用$_GET來取得變量的值;而Post方式通過$_POST來訪問提交的內(nèi)容c、Get方式傳輸?shù)臄?shù)據(jù)量非常小,一般限制在2KB左右,但是執(zhí)行效率卻比Post方法好;而Post方式傳遞的數(shù)據(jù)量相對較大,它是等待服務器來讀取數(shù)據(jù),不過也有字節(jié)限制,這是為了避免對服務器用大量數(shù)據(jù)進行惡意攻擊??稍趐hp.in中對post_max_size進行設置。建議:除非你肯定你提交的數(shù)據(jù)可以一次性提交,否則請盡量用Post方法d、Get方式提交數(shù)據(jù),會帶來安全問題,比如一個登陸頁面,通過Get方式提交數(shù)據(jù)時,用戶名和密碼將出現(xiàn)在URL上,如果頁面可以被緩存或者其他人可以訪問客戶這臺機器,就可以從歷史記錄獲得該用戶的帳號和密碼,所以表單提交建議使用Post方法;Post方法提交的表單頁面常見的問題是,該頁面如果刷新的時候,會彈出一個對話框。2.答案參見教材6.5.23.答案參見教材6.5.44.以上傳文件只允許為”jpg”圖片為例,只需要得到文件名的擴展名必須是”jpg”或者”JPG”,才可進行上傳。獲得文件名擴展名的方法如下:$extend=strtolower(end(explode(".",$myPictureName)));說明:這里用到了字符串操作函數(shù)explode,數(shù)組指針函數(shù)end,和字符串操作函數(shù)strtolower然后再使用if判斷語句if($extend==“jpg”),條件成立時,再進行上傳。5.POST傳輸數(shù)據(jù)容量由php.in中post_max_size的值設置。GET傳輸數(shù)據(jù)容量由瀏覽器決定。6.<?php$clientIP=$_SERVER['REMOTE_ADDR'];$serverIP=$_SERVER['SERVER_ADDR'];echo$clientIP;echo"<br/>";echo$serverIP;>三、編程題1.編寫支持換皮膚的PHP程序。程序說明,此題關(guān)鍵在于:?如何設置頁面背景圖片?如何使用相對路徑訪問圖片資源?如何使用條件運算符初始化下拉選擇框的選中狀態(tài)1.準備JPG皮膚圖片,分別將其命名為1.jpg、2.jpg、3.jpg、4.jpg。2.創(chuàng)建目錄images,將所有皮膚圖片文件置于該目錄下。3.創(chuàng)建skin.php文件,寫入如下代碼:<?phpif(isset($_GET["source"])){$source=$_GET["source"];}else{$source="images/1.jpg";}><bodybackground="<?phpecho$source?>"><form><selectname="source"><optionvalue="images/1.jpg"<?phpecho$source=="images/1.jpg"?"selected":"";?>>皮膚1</option><optionvalue="images/2.jpg"<?phpecho$source=="images/2.jpg"?"selected":"";?>>皮膚2</option><optionvalue="images/3.jpg"<?phpecho$source=="images/3.jpg"?"selected":"";?>>皮膚3</option><optionvalue="images/4.jpg"<?phpecho$source=="images/4.jpg"?"selected":"";?>>皮膚4</option></select><inputtype="submit"value="修改皮膚"></form>2.編寫支持多文件上傳的FORM表單程序以及PHP程序。程序說明:此題關(guān)鍵在于文件上傳框不確定,可以使用DOM+JavaScript,產(chǎn)生不確定個數(shù)的于文件上傳框。步驟如下:1.創(chuàng)建目錄:uploads,所有上傳文件置于該目錄下。2.創(chuàng)建upload.html文件,寫入如下代碼:<formaction="upload.php"method="post"name="form"enctype="multipart/form-data"><!--每個文件上傳框限制上傳文件的大小為10K字節(jié)--><inputtype="hidden"name="MAX_FILE_SIZE"value="10240"><divid="upload"></div><inputtype="button"value="添加附件"onclick="createUploader()"><br><inputtype="submit"value="上傳"></form><script>functioncreateUploader(){vardiv=document.getElementById("upload");;varuploader=document.createElement("input");uploader.type="file";="myFile[]";div.appendChild(uploader);varbr=document.createElement("br");div.appendChild(br);}</script>3.創(chuàng)建upload.php文件,寫入如下代碼:<?phpif(empty($_POST)){exit("您提交的表單數(shù)據(jù)超過post_max_size的配置!<br/>");}$count=count($_FILES['myFile']['name']);for($i=0;$i<$count;$i++){$myFile=$_FILES['myFile'];$error=$myFile["error"][$i];switch($error){case0:$fileName=$myFile['name'][$i];echo"您上傳的文件有:".$fileName."<br/>";$fileTemp=$myFile['tmp_name'][$i];$destination="uploads/".$fileName;move_uploaded_file($fileTemp,$destination);break;case1:echo"上傳的某些文件超過了php.ini中upload_max_filesize選項限制的值!<br/>";break;case2:echo"上傳的某些文件超過了FORM表單MAX_FILE_SIZE選項指定的值!<br/>";break;case3:echo"某些文件只有部分被上傳!<br/>";break;case4:echo"沒有選擇上傳文件!<br/>";break;}}>第7章答案:選擇題:1.A2.E3.C4.A5.B6.E(說明:在較新版本的PHP中,require(或requier_once())和include()(或include_once())只有一個區(qū)別——如果包含的文件不存在,前者將產(chǎn)生一個致命錯誤,同時終止腳本的執(zhí)行;而后者只會產(chǎn)生一個警告。因此答案E正確)7.C(說明:當參數(shù)被聲明為通過引用傳遞時,你不能給它賦默認值,此時解釋器期望獲得一個能在函數(shù)內(nèi)部進行修改的變量。)8.A(說明:一段腳本并不會在執(zhí)行到文件末尾時終止,所以當前文件才能被其他腳本包含。至于PHP和Apache崩潰,這兩個說法就太惡搞了)9.程序閱讀題:1.5012.5523.12問答題:1.按值傳遞:函數(shù)范圍內(nèi)對值的任何改變在函數(shù)外部都會被忽略按引用傳遞:函數(shù)范圍內(nèi)對值的任何改變在函數(shù)外部也能反映出這些修改優(yōu)缺點:按值傳遞時,php必須復制值。特別是對于大型的字符串和對象來說,這將會是一個代價很大的操作。按引用傳遞則不需要復制值,對于性能提高很有好處。2.通過修改php.ini配置文件的選項allow_call_time_pass_reference(默認值為Off)決定是否開啟函數(shù)調(diào)用時強制參數(shù)按照引用傳遞。編程題:1.<?phpfunction($var1,$var2,$var3){$max=$var1>$var2?$var1:$var2;$max=$max>$var3?$max:$var3;return$max;}>2.答案請參考第6章編程題的答案。3.答案請參考第5章編程題的答案。<?phpfunctionBubbleSort($str){for($i=0;$i<count($str);$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));?>4.答案請參考第5章編程題的答案。<?phpfunctionconvString($string){$array=explode('_',$string);$str="";for($k=0;$k<count($array);$k++){$str=$str.ucwords($array[$k]);}return$str;}echoconvString("make_by_id");>5.答案請參考第4章編程題的答案。第8章答案:1.E2.B3.C4.C5.E6.C7.B,C(說明:在標準SQL中,如果出現(xiàn)GROUPBY,結(jié)果集中所有的字段都必須是聚集值,或者是GROUPBY結(jié)構(gòu)本身的一部分。某些DBMS——比如MySQL——允許你打破這種規(guī)則,但它不按標準的方式執(zhí)行,并且在其他數(shù)據(jù)庫系統(tǒng)上無效。)8.C(說明:本題描述了一種在使用join時常犯的概念性錯誤。很多人可能覺得這個查詢將返回兩個表中非共有記錄。但實際上數(shù)據(jù)庫卻認為是“讀出所有ID非共有的記錄”。DBMS將讀取讀取左邊表中所有的記錄加上右邊表中ID非共有的記錄。因此,該查詢將讀取TABLE1中的每條記錄乘以TABLE2中的每條記錄再減去兩表中相同的記錄條數(shù)。)填空題:1.事務2.where3.insert4.auto_increment5.左連接表A和表B意味著取表A的全部記錄按指定的連接條件與表B中滿足連接條件的記錄進行連接,若表B中沒有滿足連接條件的記錄,則表A中相應字段填入NULL。問答題:1.答案參見圖8-21(說明,父子關(guān)系是相對的)2.答案參見8.1.23.滿足唯一性約束的字段可以為NULL。4.MEMORY,MyISAM,InnoDB5.答案參見8.3.36.Varchar是變長,節(jié)省存儲空間,char是固定長度。查找效率要char型快,因為varchar是非定長,必須先查找長度,然后進行數(shù)據(jù)的提取,比char定長類型多了一個步驟,所以效率低一些。7.忽略8.說明:這里使用了MySQL的now()函數(shù)和DATE_FORMAT()函數(shù)。INSERTINTOUser('Name','Tel','Content','Date')VALUES('小王','132****8547','高中','2007-05-06')UPDATEUserSETDate=DATE_FORMAT(NOW(),'%Y-%m-%d')WHEREName='張三'DELETEFROMUserWHEREName='李四'9.SELECTusername,count(*)asnumFROM`members`groupbyusernameorderbycount(*)desclimit10數(shù)據(jù)庫設計題:該題只需設計ER圖,ER圖如下:第9章答案:選擇題:1.B,D(說明:用戶輸入未經(jīng)過濾就直接送往了數(shù)據(jù)庫,這非常危險。如果URL包含ID=0+OR+1這樣的參數(shù)時,實際的查詢?yōu)镈ELETEFROMMYTABLEWHEREID=0OR1,數(shù)據(jù)庫將刪除表中所有的記錄。)2.A3.C4.A(說明:mysql_fetch_field函數(shù)從結(jié)果集中取得列信息并作為對象返回)5.C填空題:過濾特殊字符。addslashes問答題:1.答案參見9.1.62.創(chuàng)建printInfo.php文件,寫入如下代碼:<?phpfunctionprintInfo($database,$tableName){$host='localhost';$userName='root';$password='';mysql_connect($host,$userName,$password);mysql_select_db($database);mysql_query("setnames'gbk'");//制作表格(邊框?qū)挾葹?)echo"<tableborder=1><tr>";//制作表頭(也就是表中擁有的字段)$sql="select*from$tableNamelimit10";$result=mysql_query($sql);$fieldsNum=mysql_num_fields($result);echo"<tr>";for($i=0;$i<$fieldsNum;$i++){echo"<td>".mysql_field_name($result,$i)."</td>";}echo"</tr>";//導出10行記錄while($row=mysql_fetch_array($result)){echo"<tr>";for($i=0;$i<$fieldsNum;$i++){echo"<td>".$row[$i]."</td>";}echo"</tr>";}echo"</table>";}printInfo('register','users');>第10章答案:任務1答案:createtablemessage(idINTNOTNULLAUTO_INCREMENTPRIMARYKEY,titlevarchar(100),contentvarchar(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("<optionvalue='".$rowArray['category_id']."'>".$rowArray['categroy_name']."</option>"n");}print("</select>");}第11章答案:選擇題:CBB(說明:瀏覽器不允許來自某個域名的HTTP事務更改另一個域名下的cookie,否則這將造成嚴重的的安全問題。)DBB,D(說明:B和D是最有可能出問題并應該深入調(diào)查的地方。由于瀏覽器訪問其他網(wǎng)站都正常,所以不可能是瀏覽器程序出了問題。殺毒軟件通常不會選擇性的只阻止安全的cookie(不過有可能會阻止所有的cookie)。你首先應當檢查瀏覽器是否被設置為阻止所有cookie,這是最有可能導致該問題的原因。同時,錯誤的時區(qū)設置也可能是根源——給cookie設置有效期時用得是GMT時間??赡軙霈F(xiàn)cookie在寫入時就立刻過期,從而無法被腳本接收的情況。)B(說明:session.gc_maxlifetime設置的是用戶最后一次請求到session被回收之間的時間間隔。盡管數(shù)據(jù)文件并沒有被真正刪除,不過一旦session被回收,你將無法對此session進行訪問。巧合的是,session.gc_maxlifetime的默認設置正好是1440秒,但這個數(shù)字是可以被系統(tǒng)管理員調(diào)整的。所以答案應該是B。)問答題:1.header函數(shù)和setcookie函數(shù)2.狀態(tài)401代表未被授權(quán),如果返回“找不到文件”的提示,則可用header("Location:www.xxx.php");3.答案參見教材內(nèi)容.4.Cookie的內(nèi)容如下:Set-Cookie:PHPSESSID=btek48cklarn1m73eg2qkcsu12;path=PATH;domain=DOMAIN_NAME;禁用Cookie后,Session還可以使用,請參考教材中的示例程序。5.設置Session的生存時間包括設置服務器端Session的生存時間和瀏覽器端的生存時間。方法1:php.ini配置文件中有一組如下Session的配置選項,實現(xiàn)Session的設置。其中session.gc_maxlifetime=1440:設置Session文件在服務器端的儲存時間,如果超過這個時間,那么Session文件會自動刪除。默認為1440s(24min),表示1440s無操作就會自動銷毀該Session文件。session.cookie_lifetime=0:表示瀏覽器一旦關(guān)閉SessionID立即失效(推薦使用)。方法2:使用下面的程序設置$savePath="./session_save_dir/";$lifeTime=小時*秒;session_save_path($savePath);session_set_cookie_params($lifeTime);session_start();方法3:使用函數(shù)setcookie()或session_set_cookie_params($lifeTime)設置6.解決HTTP無狀態(tài)本質(zhì),可以從以下幾個方面入手。(1)利用form表單的隱藏域hidden,在表單數(shù)據(jù)提交時傳遞參數(shù),這種方法需要和form表單一起使用。(2)利用超鏈接通過URL查詢字符串傳遞參數(shù)。(3)使用header()函數(shù)重定向功能或JavaScript重定向功能,通過URL查詢字符串傳遞參數(shù)。(4)使用Cookie將瀏覽器用戶的個人資料存放在瀏覽器端主機中,其他PHP程序通過讀取瀏覽器端主機中的Cookie信息實現(xiàn)頁面間的參數(shù)傳遞。(5)使用Session將瀏覽器用戶的個人資料存放于WEB服務器中,其他PHP程序通過讀取服務器端主機中的Session信息實現(xiàn)頁面間的參數(shù)傳遞。7.通過了解SESSION的工作原理,可以發(fā)現(xiàn),在默認情況下,各個服務器會各自分別對同一個客戶端產(chǎn)生SESSIONID,如對于同一個用戶瀏覽器,A服務器產(chǎn)生的SESSIONID是30de1e9de3192ba6ce2992d27a1b6a0a,而B服務器生成的則是c72665af28a8b14c0fe11afe3b59b51b。另外,PHP的SESSION數(shù)據(jù)都是分別保存在本服務器的文件系統(tǒng)中。確定了問題所在之后,就可以著手進行解決了。想要共享SESSION數(shù)據(jù),那就必須實現(xiàn)兩個目標:一個是各個服務器對同一個客戶端產(chǎn)生的SESSIONID必須相同,并且可通過同一個COOKIE進行傳遞,也就是說各個服務器必須可以讀取同一個名為PHPSESSID的COOKIE;另一個是SESSION數(shù)據(jù)的存儲方式/位置必須保證各個服務器都能夠訪問到。簡單地說就是多服務器共享客戶端的SESSIONID,同時還必須共享服務器端的SESSION數(shù)據(jù)。第一個目標的實現(xiàn)其實很簡單,只需要對COOKIE的域(domain)進行特殊地設置(將域名設置為父子關(guān)系)即可,默認情況下,COOKIE的域是當前服務器的域名/IP地址,而域不同的話,各個服務器所設置的COOKIE是不能相互訪問的。cookie可以跨越子域名。比如我們在下面注冊個個cookie,那么可以在上讀取到該cookie。第二個目標的實現(xiàn)方法是所有的WEB服務器的SESSION存放在一個文件服務器(或者數(shù)據(jù)庫服務器)上。例如:采用一臺Mysql服務器做共享服務器,把所有的session的數(shù)據(jù)保存到Mysql服務器上,所有Web服務器都來這臺Mysql服務器來獲取Session數(shù)據(jù)。三、編程題1.使用Cookie技術(shù)編寫程序顯示上次登錄時間。<?phpif(isset($_COOKIE['last_visit'])){echo"你上次登陸時間是:".$_COOKIE['last_visit'];setCookie("last_visit",date("Y-m-dH:i:s"),time()+3600);}else{echo"你是第一次登陸!";setCookie("last_visit",date("Y-m-dH:i:s"),time()+3600);}>2.編寫支持換皮膚的PHP程序,并將皮膚保存在Cookie中。程序說明,此題關(guān)鍵在于:?如果GET請求以及Cookie里面都沒有設置皮膚,則使用默認皮膚?如果Cookie里面有皮膚,則使用Cookie里的皮膚?如果GET請求里面有皮膚,則使用GET請求的有皮膚,并將GET請求的皮膚設置到Cookie中1分鐘1.準備JPG皮膚圖片,分別將其命名為1.jpg、2.jpg、3.jpg、4.jpg。2.創(chuàng)建目錄images,將所有皮膚圖片文件置于該目錄下。3.創(chuàng)建skin.php文件,寫入如下代碼:<?php//如果GET請求以及Cookie里面都沒有設置皮膚,則使用默認皮膚if(!isset($_GET["source"])&&!isset($_COOKIE["source"])){$source="images/1.jpg";}//如果Cookie里面有皮膚,則使用Cookie里的皮膚if(isset($_COOKIE["source"])){$source=$_COOKIE["source"];}//如果GET請求里面有皮膚,則使用GET請求的有皮膚,并將GET請求的皮膚設置到Cookie中1分鐘if(isset($_GET["source"])){$source=$_GET["source"];setcookie("source",$source,time()+60);}><bodybackground="<?phpecho$source?>"><form><selectname="source"><optionvalue="images/1.jpg"<?phpecho$source=="images/1.jpg"?"selected":"";?>>皮膚1</option><optionvalue="images/2.jpg"<?phpecho$source=="images/2.jpg"?"selected":"";?>>皮膚2</option><optionvalue="images/3.jpg"<?phpecho$source=="images/3.jpg"?"selected":"";?>>皮膚3</option><optionvalue="images/4.jpg"<?phpecho$source=="images/4.jpg"?"selected":"";?>>皮膚4</option></select><inputtype="submit"value="修改皮膚"></form>3.編寫PHP程序判斷瀏覽器是否開啟Cookie。程序說明,此題關(guān)鍵在于:?頁面重定向時,如果重定向到頁面自己本身,如何防止重定向死循環(huán)。<?phpif(!isset($_GET['set'])){setcookie('test','test');$url='http://';$url.=$_SERVER['HTTP_HOST'];$url.=$_SERVER['PHP_SELF'];$url.='?set=yes';header('Location:'.$url);}else{if(empty($_COOKIE['test'])){echo"瀏覽器關(guān)閉了Cookie!請開啟瀏覽器Cookie后再訪問本網(wǎng)站!";}else{echo"瀏覽器開啟了Cookie!";}}>4.創(chuàng)建createExcel.php文件,寫入如下代碼:<?phpfunctioncreateExcel($database,$tableName){$host='localhost';$userName='root';$password='';mysql_connect($host,$userName,$password);mysql_select_db($database);mysql_query("setnames'gbk'");//制作表格(邊框?qū)挾葹?)echo"<tableborder=1><tr>";//制作表頭(也就是表中擁有的字段)$sql="select*from$tableNamelimit10";$result=mysql_query($sql);$fieldsNum=mysql_num_fields($result);echo"<tr>";for($i=0;$i<$fieldsNum;$i++){echo"<td>".mysql_field_name($result,$i)."</td>";}echo"</tr>";//導出10行記錄while($row=mysql_fetch_array($result)){echo"<tr>";for($i=0;$i<$fieldsNum;$i++){echo"<td>".$row[$i]."</td>";}echo"</tr>";}echo"</table>";}header("Content-type:application/vnd.ms-excel;charset=gbk");header("Content-Disposition:filename=users.xls");createExcel('register','users');>第12章答案:選擇題:C(說明:從PHP4.2.0開始,除非已經(jīng)給定了一個偽隨機整數(shù)列,否則不再需要用rand()函數(shù)初始化隨機數(shù)生成器。此外,即使隨機數(shù)生成器沒有被事先播種,腳本仍然會生成49個偽隨機字符。盡管$array變量是字符串,但可以用訪問數(shù)組的方式進行訪問——使用數(shù)字索引訪問某個位置上的字符。最后,for循環(huán)將從1開始執(zhí)行到50,也就是執(zhí)行了49次。)BAB,D(說明:本題考驗你對HTML編碼的認識以及代碼查錯能力。變量$s在被函數(shù)htmlentities()處理過后,結(jié)果返回給了變量?$ss,而$s自己并沒有被改變。因此答案是B和D。)B(說明:雖然你可以用implode函數(shù)把數(shù)組轉(zhuǎn)化成字符串,然后存在數(shù)組里,但卻無法保證日后一定能用serialize()把這個字符串還原成數(shù)組。瀏覽器對單個cookie有容量限制,因此在cookie里存儲數(shù)組不是個好主意。但事情也并非永遠是這樣,你仍然可以存儲一些比較小的數(shù)組。)BDADDDBB,D,E(注意D選項a為常量,當然該常量并沒有定義,此時該常量的值為常量名)A,DCB,D(說明:pack函數(shù)能對二進制數(shù)據(jù)進行復雜的格式化,包括將字符串中的字符轉(zhuǎn)化成十六進制表示。bin2hex函數(shù)也有同樣的轉(zhuǎn)化功能。注意,printf()能將整數(shù)轉(zhuǎn)化成十六進制數(shù),但無法轉(zhuǎn)化字符串。)B填空題:nl2brstr_pad函數(shù)(說明:它可以把字符串填充到指定長度)mb_convert_encoding($str,'GBK','UTF-8')或者iconv('UTF-8','GBK',$str)explode,implode對空格的轉(zhuǎn)義不同strip_tages(注釋:第二個空有歧義,該書第二版刪除第二個空)substr($a,0,1)和$a{0}跟起始標志的一樣,且結(jié)束標志前也要一個換行,后面加上分號。問答題:方法1參見教材第7章問答題方法2:<?phpfunctionchangeStyle(&$str){$arrStr=explode('_',$str);foreach($arrStras$key=>$value){$arrStr[$key]=strtoupper(substr($value,0,1)).substr($value,1);}returnimplode('',$arrStr);}$s="open_door";echochangeStyle($s);>方法3:<?phpfunctionchangeStyle(&$str){$str=str_replace("_","",$str);$str=ucwords($str);$str=str_replace("","",$str);return$str;}$s="open_door";echochangeStyle($s);><?phpfunctionreverse($str){$len=mb_strlen("$str");$new_string="";for($i=$len;$i>=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論