1.表單中 get與post提交方法的區別? 答:get是發送請求HTTP協議通過url參數傳遞進行接收,而post是實體數據,可以通過表單提交大量信息. 2.session與cookie的區別? 答:session:儲存用戶訪問的全局唯一變量,存儲在服務器上的php指定的目錄中的(session_dir)的位置進行的存放 cookie:用來存儲連續訪問一個頁面時所使用,是存儲在客戶端,對於Cookie來說是存儲在用戶WIN的Temp目錄中的。 兩者都可通過時間來設置時間長短 3.數據庫中的事務是什麼? 答:事務(transaction)是作為一個單元的一組有序的數據庫操作。如果組中的所有操作都成功,則認為事務成功,即使只有一個操作失敗,事務也不成功。如果所有操作完成, 事務則提交,其修改將作用於所有其他數據庫進程。如果一個操作失敗,則事務將回滾,該事務所有操作的影響都將取消。 簡述題: 1、用PHP打印出前一天的時間格式是2006-5-10 22:21:21(2分) 答:echo date('Y-m-d H:i:s', strtotime('-1 days')); 2、echo(),print(),print_r()的區別(3分) 答:echo是PHP語句, print和print_r是函數,語句沒有返回值,函數可以有返回值(即便沒有用) print() 只能打印出簡單類型變量的值(如int,string) print_r() 可以打印出復雜類型變量的值(如數組,對象) echo 輸出一個或者多個字符串 3、能夠使HTML和PHP分離開使用的模板(1分) 答:Smarty,Dwoo,TinyButStrong,Template Lite,Savant,phemplate,XTemplate 5、使用哪些工具進行版本控制?(1分) 答:cvs,svn,vss; 6、如何實現字符串翻轉?(3分) 答:echo strrev($a); 7、優化MYSQL數據庫的方法。(4分,多寫多得) 答: 1、選取最適用的字段屬性,盡可能減少定義字段長度,盡量把字段設置NOT NULL,例如'省份,性別',最好設置為ENUM 2、使用連接(JOIN)來代替子查詢: a.刪除沒有任何訂單客戶:DELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo) b.提取所有沒有訂單客戶:SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo) c.提高b的速度優化:SELECT FROM customerinfo LEFT JOIN orderid customerinfo.customerid=orderinfo.customerid WHERE orderinfo.customerid IS NULL 3、使用聯合(UNION)來代替手動創建的臨時表 a.創建臨時表:SELECT name FROM `nametest` UNION SELECT username FROM `nametest2` 4、事務處理: a.保證數據完整性,例如添加和修改同時,兩者成立則都執行,一者失敗都失敗 mysql_query("BEGIN"); mysql_query("INSERT INTO customerinfo (name) VALUES ('$name1')"; mysql_query("SELECT * FROM `orderinfo` where customerid=".$id"); mysql_query("COMMIT"); 5、鎖定表,優化事務處理: a.我們用一個 SELECT 語句取出初始數據,通過一些計算,用 UPDATE 語句將新值更新到表中。 包含有 WRITE 關鍵字的 LOCK TABLE 語句可以保證在 UNLOCK TABLES 命令被執行之前, 不會有其它的訪問來對 inventory 進行插入、更新或者刪除的操作 mysql_query("LOCK TABLE customerinfo READ, orderinfo WRITE"); mysql_query("SELECT customerid FROM `customerinfo` where id=".$id); mysql_query("UPDATE `orderinfo` SET ordertitle='$title' where customerid=".$id); mysql_query("UNLOCK TABLES"); 6、使用外鍵,優化鎖定表 a.把customerinfo裡的customerid映射到orderinfo裡的customerid, 任何一條沒有合法的customerid的記錄不會寫到orderinfo裡 CREATE TABLE customerinfo ( customerid INT NOT NULL, PRIMARY KEY(customerid) )TYPE = INNODB; CREATE TABLE orderinfo ( orderid INT NOT NULL, customerid INT NOT NULL, PRIMARY KEY(customerid,orderid), FOREIGN KEY (customerid) REFERENCES customerinfo (customerid) ON DELETE CASCADE )TYPE = INNODB; 注意:'ON DELETE CASCADE',該參數保證當customerinfo表中的一條記錄刪除的話同時也會刪除order 表中的該用戶的所有記錄,注意使用外鍵要定義事務安全類型為INNODB; 7、建立索引: a.格式: (普通索引)-> 創建:CREATE INDEX <索引名> ON tablename (索引字段) 修改:ALTER TABLE tablename ADD INDEX [索引名] (索引字段) 創表指定索引:CREATE TABLE tablename([...],INDEX[索引名](索引字段)) (唯一索引)-> 創建:CREATE UNIQUE <索引名> ON tablename (索引字段) 修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引字段) 創表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引字段)) (主鍵)-> 它是唯一索引,一般在創建表是建立,格式為: CREATA TABLE tablename ([...],PRIMARY KEY[索引字段]) 8、優化查詢語句 a.最好在相同字段進行比較操作,在建立好的索引字段上盡量減少函數操作 例子1: SELECT * FROM order WHERE YEAR(orderDate)<2008;(慢) SELECT * FROM order WHERE orderDate<"2008-01-01";(快) 例子2: SELECT * FROM order WHERE addtime/7<24;(慢) SELECT * FROM order WHERE addtime<24*7;(快) 例子3: SELECT * FROM order WHERE title like "%good%"; SELECT * FROM order WHERE title>="good" and name<"good"; 8、PHP的意思(送1分) 答:PHP是一個基於服務端來創建動態網站的腳本語言,您可以用PHP和HTML生成網站主頁 9、MYSQL取得當前時間的函數是?,格式化日期的函數是(2分) 答:now(),date() 10、實現中文字串截取無亂碼的方法。(3分) 答:function GBsubstr($string, $start, $length) { if(strlen($string)>$length){ $str=null; $len=$start+$length; for($i=$start;$i<$len;$i++){ if(ord(substr($string,$i,1))>0xa0){ $str.=substr($string,$i,2); $i++; }else{ $str.=substr($string,$i,1); } } return $str.'...'; }else{ return $string; } } 11、您是否用過版本控制軟件? 如果有您用的版本控制軟件的名字是?(1分) 12、您是否用過模板引擎? 如果有您用的模板引擎的名字是?(1分) 答:用過,smarty 13、請簡單闡述您最得意的開發之作(4分) 答:信息分類 14、對於大流量的網站,您采用什麼樣的方法來解決訪問量問題?(4分) 答:確認服務器硬件是否足夠支持當前的流量,數據庫讀寫分離,優化數據表, 程序功能規則,禁止外部的盜鏈,控制大文件的下載,使用不同主機分流主要流量 15、用PHP寫出顯示客戶端IP與服務器IP的代碼1分) 答:打印客戶端IP:echo $_SERVER[‘REMOTE_ADDR’]; 或者: getenv('REMOTE_ADDR'); 打印服務器IP:echo gethostbyname("www.bolaiwu.com") 16、語句include和require的區別是什麼?為避免多次包含同一文件,可用(?)語句代替它們? (2分) 答:require->require是無條件包含也就是如果一個流程裡加入require,無論條件成立與否都會先執行require include->include有返回值,而require沒有(可能因為如此require的速度比include快) 注意:包含文件不存在或者語法錯誤的時候require是致命的,include不是 17、如何修改SESSION的生存時間(1分). 答:方法1:將php.ini中的session.gc_maxlifetime設置為9999重啟apache 方法2:$savePath = "./session_save_dir/"; $lifeTime = 小時 * 秒; session_save_path($savePath); session_set_cookie_params($lifeTime); session_start(); 方法3:setcookie() and session_set_cookie_params($lifeTime); 18、有一個網頁地址, 比如PHP開發資源網主頁: http://www.phpres.com/index.html,如何得到它的內容?($1分) 答:方法1(對於PHP5及更高版本): $readcontents = fopen("http://www.phpres.com/index.html", "rb"); $contents = stream_get_contents($readcontents); fclose($readcontents); echo $contents; 方法2: echo file_get_contents("http://www.phpres.com/index.html"); 19、在HTTP 1.0中,狀態碼401的含義是(?);如果返回“找不到文件”的提示,則可用 header 函數,其語句為(?);(2分) 答:狀態401代表未被授權,header("Location:www.xxx.php"); 12、在PHP中,heredoc是一種特殊的字符串,它的結束標志必須?(1分) 答:heredoc的語法是用"<<<"加上自己定義成對的標簽,在標簽范圍內的文字視為一個字符串 例子: $str = <<<SHOW my name is Jiang Qihui! SHOW; 13、談談asp,php,jsp的優缺點(1分) 答:ASP全名Active Server Pages,是一個WEB服務器端的開發環境, 利用它可以產生和運 行動態的、交互的、高性能的WEB服務應用程序。ASP采用腳本語言VB Script(Java script )作為自己的開發語言。 PHP是一種跨平台的服務器端的嵌入式腳本語言. 它大量地借用C,Java和Perl語言的語法 , 並耦合PHP自己的特性,使WEB開發者能夠快速地寫出動態生成頁面.它支持目前絕大多數數 據庫。還有一點,PHP是完全免費的,不用花錢,你可以從PHP官方站點(http://www.php.ne t)自由下載。而且你可以不受限制地獲得源碼,甚至可以從中加進你自己需要的特色。 JSP 是Sun公司推出的新一代站點開發語言,他完全解決了目前ASP,PHP的一個通病-- 腳本級執行(據說PHP4 也已經在Zend 的支持下,實現編譯運行).Sun 公司借助自己在Jav a 上的不凡造詣,將Java 從Java 應用程序 和 Java Applet 之外,又有新的碩果,就是Js p--Java Server Page。Jsp 可以在Serverlet和JavaBean的支持下,完成功能強大的站點 程序。 三者都提供在 HTML 代碼中混合某種程序代碼、由語言引擎解釋執行程序代碼的能力。 但JSP代碼被編譯成 Servlet 並由 Java 虛擬機解釋執行,這種編譯操作僅在對 JSP 頁面的 第一次請求時發生。在 ASP 、PHP、JSP 環境下, HTML 代碼主要負責描述信息的顯示樣式 ,而程序代碼則用來描述處理邏輯。普通的 HTML 頁面只依賴於 Web 服務器,而 ASP 、PH P、JSP 頁面需要附加的語言引擎分析和執行程序代碼。程序代碼的執行結果被重新嵌入到 HTML 代碼中,然後一起發送給浏覽器。 ASP 、PHP、 JSP三者都是面向 Web 服務器的技術 ,客戶端浏覽器不需要任何附加的軟件支持。 14、談談對mvc的認識(1分) 答:由模型(model),視圖(view),控制器(controller)完成的應用程序 由模型發出要實現的功能到控制器,控制器接收組織功能傳遞給視圖; 15、寫出發貼數最多的十個人名字的SQL,利用下表:members(id,username,posts,pass,email)(2分) 答:SELECT * FROM `members` ORDER BY posts DESC limit 0,10; 16. 請說明php中傳值與傳引用的區別。什麼時候傳值什麼時候傳引用?(2分) 答:按值傳遞:函數范圍內對值的任何改變在函數外部都會被忽略 按引用傳遞:函數范圍內對值的任何改變在函數外部也能反映出這些修改 優缺點:按值傳遞時,php必須復制值。特別是對於大型的字符串和對象來說,這將會是一個代價很大的操作。 按引用傳遞則不需要復制值,對於性能提高很有好處。 17. 在PHP中error_reporting這個函數有什麼作用? (1分) 答:設置錯誤級別與錯誤信息回報 18. 請寫一個函數驗證電子郵件的格式是否正確 (2分) 答:function checkEmail($email) { $pregEmail = "/([a-z0-9]*[-_/.]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[/.][a-z]{2,3}([/.][a-z]{2})?/i"; return preg_match($pregEmail,$email); } 19. 簡述如何得到當前執行腳本路徑,包括所得到參數。(2分) 答:$script_name = basename(__file__); print_r($script_name); 21、JS表單彈出對話框函數是?獲得輸入焦點函數是? (2分) 答:彈出對話框: alert(),prompt(),confirm() 獲得輸入焦點 focus() 22、JS的轉向函數是?怎麼引入一個外部JS文件?(2分) 答:window.location.href,<script type="text/javascript" src="js/js_function.js"></script> 23、foo()和@foo()之間有什麼區別?(1分) 答:@foo()控制錯誤輸出 24、如何聲明一個名為”myclass”的沒有方法和屬性的類? (1分) 答:class myclass{ } 25、如何實例化一個名為”myclass”的對象?(1分) 答:new myclass() 26、你如何訪問和設置一個類的屬性? (2分) 答:$object = new myclass(); $newstr = $object->test; $object->test = "info"; 27、mysql_fetch_row() 和mysql_fetch_array之間有什麼區別? (1分) 答:mysql_fetch_row是從結果集取出1行數組,作為枚舉 mysql_fetch_array是從結果集取出一行數組作為關聯數組,或數字數組,兩者兼得 28、GD庫是做什麼用的? (1分) 答:gd庫提供了一系列用來處理圖片的API,使用GD庫可以處理圖片,或者生成圖片。 在網站上GD庫通常用來生成縮略圖或者用來對圖片加水印或者對網站數據生成報表。 29、指出一些在PHP輸入一段HTML代碼的辦法。(1分) 答:echo "<a href='index.php'>aaa</a>"; 30、下面哪個函數可以打開一個文件,以對文件進行讀和寫操作?(1分) (a) fget() (b) file_open() (c) fopen() (d) open_file() [ c ] 31、下面哪個選項沒有將 john 添加到users 數組中? (1分) (a) $users[] = ‘john’; (b) array_add($users,’john’); (c) array_push($users,‘john’); (d) $users ||= ‘john’; [ a , c ] 32、下面的程序會輸入是否?(1分) $num = 10; function multiply(){ $num = $num * 10; } multiply(); echo $num; ?> 輸出:10 33、使用php寫一段簡單查詢,查出所有姓名為“張三”的內容並打印出來 (2分) 表名User Name Tel Content Date 張三 13333663366 大專畢業 2006-10-11 張三 13612312331 本科畢業 2006-10-15 張四 021-55665566 中專畢業 2006-10-15 請根據上面的題目完成代碼: $mysql_db=mysql_connect("local","root","pass"); @mysql_select_db("DB",$mysql_db); $result = mysql_query("SELECT * FROM `user` WHERE name='張三'"); while($rs = mysql_fetch_array($result)){ echo $rs["tel"].$rs["content"].$rs["date"]; } 34、如何使用下面的類,並解釋下面什麼意思?(3) class test{ function Get_test($num){ $num=md5(md5($num)."En"); return $num; } } 答:$testnum = "123"; $object = new test(); $encrypt = $object->Get_test($testnum); echo $encrypt; 類test裡面包含Get_test方法,實例化類調用方法多字符串加密 35、寫出 SQL語句的格式 : 插入 ,更新 ,刪除 (4分) 表名User Name Tel Content Date 張三 13333663366 大專畢業 2006-10-11 張三 13612312331 本科畢業 2006-10-15 張四 021-55665566 中專畢業 2006-10-15 (a) 有一新記錄(小王 13254748547 高中畢業 2007-05-06)請用SQL語句新增至表中 mysql_query("INSERT INTO `user` (name,tel,content,date) VALUES ('小王','13254748547','高中畢業','2007-05-06')") (b) 請用sql語句把張三的時間更新成為當前系統時間 $nowDate = date("Ymd"); mysql_query("UPDATE `user` SET date='".$nowDate."' WHERE name='張山'"); (c) 請寫出刪除名為張四的全部記錄 mysql_query("DELETE FROM `user` WHERE name='張四'"); 36、請寫出數據類型(int char varchar datetime text)的意思; 請問varchar和char有什麼區別(2分) 答:int是數字類型,char固定長度字符串,varchar實際長度字符串,datetime日期時間型,text文本字符串 char的場地固定為創建表設置的長度,varchar為可變長度的字符 38、寫出以下程序的輸出結果 (1分) $b=201; $c=40; $a=$b>$c?4:5; echo $a; ?> 答:4 39、檢測一個變量是否有設置的函數是否?是否為空的函數是?(2分) 答:isset($str),empty($str); 40、取得查詢結果集總數的函數是?(1分) 答:mysql_num_rows($result); 41、$arr = array('james', 'tom', 'symfony'); 請打印出第一個元素的值 (1分) 答:echo $array[0]; 42、請將41題的數組的值用','號分隔並合並成字串輸出(1分) 答:for($i=0;$i<count($array);$i++){ echo $array[$i].",";} 43、$a = 'abcdef'; 請取出$a的值並打印出第一個字母(1分) 答:echo $a{0} 或 echo substr($a,0,1) 44、PHP可以和sql server/oracle等數據庫連接嗎?(1分) 答:當然可以 45、請寫出PHP5權限控制修飾符(3分) 答:public(公共),private(私用),protected(繼承) 46、請寫出php5的構造函數和析構函數(2分) 答:__construct , __destruct 47、完成以下: (一)創建新聞發布系統,表名為message有如下字段 (3分) id 文章id title 文章標題 content 文章內容 category_id 文章分類id hits 點擊量 答:CREATE TABLE 'message'( 'id' int(10) NOT NULL auto_increment, 'title' varchar(200) default NULL, 'content' text, 'category_id' int(10) NOT NULL, 'hits' int(20), PRIMARY KEY('id'); )ENGINE=InnoDB DEFAULT CHARSET=utf8; (二)同樣上述新聞發布系統:表comment記錄用戶回復內容,字段如下 (4分) comment_id 回復id id 文章id,關聯message表中的id comment_content 回復內容 現通過查詢數據庫需要得到以下格式的文章標題列表,並按照回復數量排序,回復最高的排在最前面 文章id 文章標題 點擊量 回復數量 用一個SQL語句完成上述查詢,如果文章沒有回復則回復數量顯示為0 答:SELECT message.id id,message.title title,IF(message.`hits` IS NULL,0,message.`hits`) hits, IF(comment.`id` is NULL,0,count(*)) number FROM message LEFT JOIN comment ON message.id=comment.id GROUP BY message.`id`; (三)上述內容管理系統,表category保存分類信息,字段如下 (3分) category_id int(4) not null auto_increment; categroy_name varchar(40) not null; 用戶輸入文章時,通過選擇下拉菜單選定文章分類 寫出如何實現這個下拉菜單 答:function categoryList() { $result=mysql_query("select category_id,categroy_name from category") or die("Invalid query: " . mysql_error()); print("<select name='category' value=''>/n"); while($rowArray=mysql_fetch_array($result)) { print("<option value='".$rowArray['category_id']."'>".$rowArray['categroy_name']."</option>/n"); } print("</select>"); } 編程題: 1. 寫一個函數,盡可能高效的,從一個標准 url 裡取出文件的擴展名 例如: http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出 php 或 .php 答案1: function getExt($url){ $arr = parse_url($url); $file = basename($arr['path']); $ext = explode(".",$file); 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); } } 2. 在 HTML 語言中,頁面頭部的 meta 標記可以用來輸出文件的編碼格式,以下是一個標准的 meta 語句 請使用 PHP 語言寫一個函數,把一個標准 HTML 頁面中的類似 meta 標記中的 charset 部分值改為 big5 請注意: 1. 需要處理完整的 html 頁面,即不光此 meta 語句 2. 忽略大小寫 3. ' 和 " 在此處是可以互換的 4. 'Content-Type' 兩側的引號是可以忽略的,但 'text/html; charset=gbk' 兩側的不行 5. 注意處理多余空格 3. 寫一個函數,算出兩個文件的相對路徑 如 $a = '/a/b/c/d/e.php'; $b = '/a/b/12/34/c.php'; 計算出 $b 相對於 $a 的相對路徑應該是 ../../c/d將()添上 答: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); } echo getRelativePath($a, $b); 填空題: 1.在PHP中,當前腳本的名稱(不包括路徑和查詢字符串)記錄在預定義變量__$_SERVER['PHP_SELF']__中;而鏈接到當前頁面的URL記錄在預定義變量__$_SERVER['HTTP_REFERER']__ 中 2.執行程序段<?php echo 8%(-2) ?>將輸出__0__。 3.在HTTP 1.0中,狀態碼 401 的含義是____;如果返回“找不到文件”的提示,則可用 header 函數,其語句為____。 4.數組函數 arsort 的作用是__對數組進行逆向排序並保持索引關系__;語句 error_reporting(2047)的作用是__報告所有錯誤和警告__。 5.PEAR中的數據庫連接字符串格式是____。 6.寫出一個正則表達式,過慮網頁上的所有JS/VBS腳本(即把scrīpt標記及其內容都去掉):preg_replace("/<script[^>].*?>.*?</script>/si", "newinfo", $script); 7.以Apache模塊的方式安裝PHP,在文件http.conf中首先要用語句____動態裝載PHP模塊,然後再用語句____使得Apache把所有擴展名為php的文件都作為PHP腳本處理。 LoadModule php5_module "c:/php/php5apache2.dll" , AddType application/x-httpd-php .php, 8.語句 include 和 require 都能把另外一個文件包含到當前文件中,它們的區別是____;為了避免多次包含同一文件,可以用語句__require_once||include_once__來代替它們。 9.類的屬性可以序列化後保存到 session 中,從而以後可以恢復整個類,這要用到的函數是____。 10.一個函數的參數不能是對變量的引用,除非在php.ini中把__allow_call_time_pass_reference boolean__設為on. 11.SQL中LEFT JOIN的含義是__自然左外鏈接__。如果 tbl_user記錄了學生的姓名(name)和學號(ID),tbl_score記錄了學生(有的學生考試以後被開除了,沒有其記錄)的學號(ID) 和考試成績(score)以及考試科目(subject),要想打印出各個學生姓名及對應的的各科總成績,則可以用SQL語句____。 12.在PHP中,heredoc是一種特殊的字符串,它的結束標志必須____。 編程題: 13.寫一個函數,能夠遍歷一個文件夾下的所有文件和子文件夾。 答: function my_scandir($dir) { $files = array(); if ( $handle = opendir($dir) ) { while ( ($file = readdir($handle)) !== false ) { if ( $file != ".." && $file != "." ) { if ( is_dir($dir . "/" . $file) ) { $files[$file] = scandir($dir . "/" . $file); }else { $files[] = $file; } } } closedir($handle); return $files; } } 14.簡述論壇中無限分類的實現原理。 答: <?php /* 數據表結構如下: 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 = "SELECT * FROM category ORDER BY 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 "<option selected value=".$category['id'].""; }else { echo "<option value=".$category['id'].""; } if ($level > 0) { echo ">" . str_repeat( " ", $level ) . " " . $category['name'] . "</option>/n"; } else { echo ">" . $category['name'] . "</option>/n"; } Get_Category($key, $level + 1, $default_category); } unset($category_array[$category_id]); } /* 函數返回的數組格式如下所示: Array ( [1] => Array ( [id] => 1 [name] => 一級類別 [level] => 0 [ParentID] => 0 ) [4] => Array ( [id] => 4 [name] => 二級類別 [level] => 1 [ParentID] => 1 ) [9] => Array ( [id] => 9 [name] => 哈哈 [level] => 2 [ParentID] => 4 ) [3] => Array ( [id] => 3 [name] => 二級類別 [level] => 1 [ParentID] => 1 ) [8] => Array ( [id] => 8 [name] => aqqqqqd [level] => 2 [ParentID] => 3 ) [2] => Array ( [id] => 2 [name] => 二級類別 [level] => 1 [ParentID] => 1 ) [7] => Array ( [id] => 7 [name] => 234234 [level] => 2 [ParentID] => 2 ) [6] => Array ( [id] => 6 [name] => 333332 [level] => 2 [ParentID] => 2 ) [5] => Array ( [id] => 5 [name] => 三級類別 [level] => 2 [ParentID] => 2 ) [10] => Array ( [id] => 10 [name] => 66333666 [level] => 3 [ParentID] => 5 ) ) */ //指定分類id,然後返回數組 function Category_array($category_id = 0,$level=0) { global $DB; $sql = "SELECT * FROM category ORDER BY 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'] ); $children = Category_array($k, $level+1); if (count($children) > 0) { $options = $options + $children; } } } } unset($category_array[$category_id]); return $options; } ?> <?php class cate { 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 = "<option selected value=".$cate['id'].""; }else{ $txt = "<option value=".$cate['id'].""; } if ($level > 0) { $txt1 = ">" . str_repeat( "-", $level ) . " " . $cate['name'] . "</option>/n"; }else{ $txt1 = ">" . $cate['name'] . "</option>/n"; } $val = $txt.$txt1; echo $val; self::Get_Category($key, $level + 1, $default_category); } } function getFlush($category_id = 0,$level = 0, $default_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 = new cate(); //$c->Get_Category(); $ttt= $c->getFlush($id,'0','3'); echo $ttt; echo "</select>"; ?> 1.以下哪一句不會把 John 新增到 users 陣列? $users[] = ‘john’; 成功把 John 新增到陣列 users。 array_add($users,’john’); 函式 array_add() 無定義。 array_push($users,‘john’); 成功把 John 新增到陣列 users。 $users ||= ‘john’; 語法錯誤。 2.sort()、assort()、和 ksort() 有什麼分別?它們分別在什麼情況下使用? sort() 根據陣列中元素的值,以英文字母順序排序,索引鍵會由 0 到 n-1 重新編號。主要是當陣列索引鍵的值無關疼癢時用來把陣列排序。 assort() PHP 沒有 assort() 函式,所以可能是 asort() 的筆誤。 asort() 與 sort() 一樣把陣列的元素按英文字母順序來排列,不同的是所有索引鍵都獲得保留,特別適合替聯想陣列排序。 ksort() 根據陣列中索引鍵的值, 以英文字母順序排序,特別適合用於希望把索引鍵排序的聯想陣列。 3.以下的代碼會產生什麼?為什麼? $num =10; function multiply(){ $num =$num *10; } multiply(); echo $num; 由 於函式 multiply() 沒有指定 $num 為全域變量(例如 global $num 或者 $_GLOBALS['num']),所以 $num 的值是 10。 4. reference 跟一個正規的變量有什麼分別?如何 pass by reference?在什麼情況下我們需要這樣做? Reference 傳送的是變量的地址而非它的值,所以在函式中改變一個變量的值時,整個應用都見到這個變量的新值。 一個正規變量傳送給函式的是它的值,當函式改變 這個變量的值時,只有這個函式才見到新值,應用的其他部分仍然見到舊值。 $myVariable = “its’ value”;Myfunction(&$myVariable); // 以 reference 傳送參數 以 reference 傳送參數給函式,可以使函式改變了的變量,即使在函式結束後仍然保留新值。 5.些函式可以用來在現正執行的腳本中插入函式庫? 對 這道題目不同的理解會有不同的答案,我的第一個想法是插入 PHP 函式庫不外乎 include()、include_once()、require()、require_once(),但細心再想,“函式庫”也應該包括 com 物件和 .net 函式庫,所以我們的答案也要分別包括 com_load 和 dotnet_load,下次有人提起“函式庫”的時候,別忘記這兩個函式。 6.foo() 與 @foo() 有什麼分別? foo() 會執行這個函式,任何解譯錯誤、語法錯誤、執行錯誤都會在頁面上顯示出來。 @foo() 在執行這個函式時,會隱藏所有上述的錯誤訊息。 很 多應用程式都使用 @mysql_connect() 和 @mysql_query 來隱藏 mysql 的錯誤訊息,我認為這是很嚴重的失誤,因為錯誤不該被隱藏,你必須妥善處理它們,可能的話解決它們。 7.你如何替 PHP 的應用程式偵錯? 我並不常這樣做,我曾經試過很多不同的偵錯工具,在 Linux 系統中設定這些工具一點也不容易。不過以下我會介紹一個近來頗受注目的偵錯工具。 PHP – Advanced PHP Debugger 或稱 PHP – APD,第一步是執行以下的指令安裝: pear install apd安裝後在你的腳本的開頭位置加入以下的語句開始進行偵錯: apd_set_pprof_trace();執行完畢,打開以下檔案來 查閱執行日志: apd.dumpdir 你也可以使用 pprofp 來格式化日志。 詳細的資料可以參閱 http://us.php.net/manual/en/ref.apd.php。 8.“===” 是什麼?試舉一個“==”是真但“===”是假的例子。 “===”是給既可以送回布爾值“假”,也可以送回一個不是布爾值但卻可以賦與“假”值的 函式,strpos() 和 strrpos() 便是其中兩個例子。 問題的第二部份有點困難,想一個“==”是假,但是“===”是真的例子卻 很容易,相反的例子卻很少。但我終於找到以下的例子: if (strpos(“abc”, “a”) == true){ // 這部分永不會被執行,因為 “a” 的位置是 0,換算成布爾值“假”}if (strpos(“abc”, “a”) === true){ // 這部份會被執行,因為“===”保證函式 strpos() 的送回值不會換算成布爾值.} 9.你會如何定義 一個沒有成員函式或特性的類別 myclass? class myclass{} 10.你如何產生一個 myclass 的物件? $obj = new myclass(); 11.在一個類別內如何存取這個類別的特性及變改它的值? 使 用語句:$this->propertyName,例如: class myclass{ private $propertyName; public function __construct() { $this->propertyName = “value”; }} 12.include 和 include_once 有什麼分別?require 又如何? 三者都是 用來在腳本中插入其他檔案,視乎 url_allow_fopen 是否核准,這個檔案可以從系統內部或外部取得。但他們之間也有微細的分別: include(): 這個函式容許你在腳本中把同一個檔案插入多次,若果檔案不存在,它會發出系統警告並繼續執行腳本。 include_once():它跟 include() 的功能相似,正如它的名字所示,在腳本的執行期間,有關檔案只會被插入一次。 require():跟 include() 差不多,它也是用來在腳本中插入其他檔案,但若果檔案不存在,它會發出系統警告,這個警告會引致致命錯誤令腳本中止執行 13.以下哪一個 函式可以把浏覽器轉向到另一個頁面? redir() 這不是一個 PHP 函式,會引致執行錯誤。 header() 這個是 正確答案,header() 用來插入卷頭資料,可以用來使浏覽器轉向到另一個頁面,例如: header(“Location: http://www.gosoa.com.cn/”); location() 這 不是一個 PHP 函式,會引致執行錯誤。 redirect() 這不是一個 PHP 函式,會引致執行錯誤。 14. 以下哪一個函式可以用來開啟檔案以便讀/寫? fget() 這不是一個 PHP 函式,會引致執行錯誤。 file_open() 這 不是一個 PHP 函式,會引致執行錯誤。 fopen() 這是正確答案,fopen() 可以用來開啟檔案以便讀/寫,事實上這個函式還有很多選項,詳細資料請參閱 php.net。 open_file() 這不是一個 PHP 函式,會引致執行錯誤。 15.mysql_fetch_row() 和 mysql_fetch_array() 有什麼分別? mysql_fetch_row() 把數據庫的一列儲存在一個以零為基數的陣列中,第一欄在陣列的索引 0,第二欄在索引 1,如此類推。mysql_fetch_assoc() 把數據庫的一列儲存在一個關聯陣列中,陣列的索引就是欄位名稱,例如我的數據庫查詢送回“first_name”、“last_name”、 “email”三個欄位,陣列的索引便是“first_name”、“last_name”和“email”。mysql_fetch_array() 可以同時送回 mysql_fetch_row() 和 mysql_fetch_assoc() 的值。 16.下面的代碼用來做什麼?請解釋。 $date=’08/26/2003′;print ereg_replace(“([0-9]+)/([0-9]+)/([0-9]+)”,”\\2/\\1/\\3″,$date); 這 是把一個日期從 MM/DD/YYYY 的格式轉為 DD/MM/YYYY 格式。我的一個好朋友告訴我可以把這個正規表達式拆解為以下的語句,對於如此簡單的表示是來說其實無須拆解,純粹為了解說的方便: // 對應一個或更多 0-9,後面緊隨一個斜號$regExpression = “([0-9]+)/”;// 應一個或更多 0-9,後面緊隨另一個斜號$regExpression .= “([0-9]+)/”;// 再次對應一個或更多 0-9$regExpression .= “([0-9]+)”;至於 \\2/\\1/\\3 則是用來對應括號,第一個括號對的是月份,第二個括號對應的是日期,第三個括號對應的是年份。 17.給你一行文字 $string,你會如何編寫一個正規表達式,把 $string 內的 HTML 標簽除去? 首先,PHP 有內建函式 strip_tags() 除去 HTML 標簽,為何要自行編寫正規表達式?好了,便當作是面試的一道考題吧,我會這樣回答: $stringOfText = “<p>This is a test</p>”;$expression_r = “/<(.*?)>(.*?)<\/(.*?)>/”;echo preg_replace($expression_r, “\\2″, $stringOfText);// 有人說也可以使用 /(<[^>]*>)/ $expression_r = “/(<[^>]*>)/”;echo preg_replace($expression_r, “”, $stringOfText); 18.PHP 和 Perl 分辨陣列和散列表的方法有什麼差異? 這正是為何我老是告訴別人選擇 適當的編程語言,若果你只用一種語言的話你怎麼能回答這道問題?這道問題很簡單,Perl 所有陣列變量都是以 @ 開頭,例如 @myArray,PHP 則沿用 $ 作為所有變量的開頭,例如 $myArray。 至於 Perl 表示散列表則用 %,例如 %myHash,PHP 則沒有分別,仍是使用 $,例如 $myHash。 19.你如何利用 PHP 解決 HTTP 的無狀態本質? 最 主要的倆各選擇是 session 和 cookie。使用 session 的方法是在每一頁的開始加上 session_start(),然後利用 $_SESSION 散列表來儲存 session 變量。至於 cookie 你只需記著一個原則:在輸出任何文字之前調用 set_cookie() 函式,此外只需使用 $_COOKIE 散列表便可以存取所有 cookie 變量。 還有一個不那麼可靠的方法,就是利用訪客的 IP 地址,這個方法有特定的危險性。 20.GD 函式庫用來做什麼? 這個可能是我最喜歡的函式庫,自從 PHP 4.3.0 版本後 GD 便內建在 PHP 系統中。這個函式庫讓你處理和顯示各式格式的圖檔,它的另一個常見用途是制作所圖檔。GD 以外的另一個選擇是 ImageMagick,但這個函式庫並不內建於 PHP 之中,必須由系統管理員安裝在伺服器上。 21.試寫出幾個輸出一段 HTML 代碼的方法。 嗯,你可以使用 PHP 中任何一種輸出語句,包括 echo、print、printf,大部分人都使用如下例的 echo: echo “My string $variable”;你也可以使用這種方法: echo <<<ENDThis text is written to the screen as output and this $variable is parsed too. If you wanted you can have <span> HTML tags in here as well.</span> The END; remarks must be on a line of its own, and can’t contain any extra white space.END; 22.PHP 比 Perl 好嗎?請討論。 我 們不要為一個簡單的問題引發一場舌戰,正如我經常說的:“為工作選擇適合的語言,不要把工作遷就語言。”我個人認為 Perl 十分適合用作命令行工具,雖然它在網頁應用上也有不錯的表現,但是它的真正實力在命令行上才能充分發揮。同樣地,PHP 雖然可以在控制台的環境中使用,但是個人認為它在網頁應用上有更好的表現,PHP 有大量專門為網頁應用而設計的函式,Perl 則似乎以命令行為設計之本。 個人來說兩種語言我都喜歡,在大學期間我經常使用 Perl、PHP 和 Java,可惜工作上我使用 C#,但在家裡我花不少時間操練 PHP、Perl、Ruby(現正學習)和 Java,保持我的技能知識在最新狀態。很多人問我 C 和 C++ 怎麼樣,它們是否仍有機會在我的應用中占一席位,我的答案基本上是“否”,我近來的工作主要集中在網頁開發,雖然 C 和 C++ 也可以用來寫網頁,但它們到底不是為這種工作而設計的,“為工作選擇適合的語言”,若果我需要編寫一個控制台應用,用來展示 bubble sort、quick sort 和 merge sort 的效能比較,我一定會使用 C / C++。若果我需要編寫一個相片簿系統,我會使用 PHP 或者 C#(我認為制作用戶介面方面 .NET 語言比網頁更加)。 6.以Apache模塊的方式安裝PHP,在文件http.conf中首先要用語句____動態裝載PHP模塊, 然 後再用語句____使得Apache把所有擴展名為php的文件都作為PHP腳本處理。 答:LoadModule php5_module “c:/php/php5apache2.dll”;AddType application/x-httpd-php .php 見參考 手冊》目錄》II. 安裝與配置》6. Windows 系統下的安裝》Microsoft Windows 下的 Apache 2.0.x 7. 語句 include 和 require 都能把另外一個文件包含到當前文件中,它們的區別是____;為了避免多次包含同一文件,可以用語句____來代替它們。 答:在如何處理失敗 時,include() 產生一個警告而 require() 則導致一個致命錯誤;require_once()/include_once() 8. 一個函數的參數不能是對變量的引用,除非在php.ini中把____設為on. 答:allow_call_time_pass_reference boolean :是否啟用在函數調用時強制參數被按照引用傳遞, 見參考手冊》附錄G 9.SQL 中LEFT JOIN的含義是__,如果 tbl_user記錄了學生的姓名(name)和學號(ID), tbl_score記錄了學生(有的學生考試以後被 開除了,沒有其記錄)的學號(ID)和考試成績(score)以及考試科目(subject),要想打印出各個學生姓名及對應的的各科總成績,則可以用 SQL語句____. 答:自然左外連接 create database phpinterview; use phpinterview create table tbl_user ( ID int not null, name varchar(50) not null, primary key (ID) ); create table tbl_score ( ID int not null, score dec(6,2) not null, subject varchar(20) not null ); insert into tbl_user (ID, name) values (1, ’beimu’); insert into tbl_user (ID, name) values (2, ’aihui’); insert into tbl_score (ID, score, subject) values (1, 90, ’語文’); insert into tbl_score (ID, score, subject) values (1, 80, ’數學’); insert into tbl_score (ID, score, subject) values (2, 86, ’數學’); insert into tbl_score (ID, score, subject) values (2, 96, ’語文’); select A.id,sum(B.score) as sumscore from tbl_user A left join tbl_score B on A.ID=B.ID group by A.id 10. 在PHP中,heredoc是一種特殊的字符串,它的結束標志必須____ 答:結束標識符所 在的行不能包含任何其它字符除”;” 11.寫一個函數,能夠遍歷一個文件夾下的所有文件和子文件夾。 function my_scandir($dir) { $files=array(); if(is_dir($dir)) { if($handle=opendir($dir)) { while(($file=readdir($handle))!==false) { if($file!="." && $file!="..") { if(is_dir($dir."/".$file)) { $files[$file]=my_scandir($dir."/".$file); } else { $files[]=$dir."/".$file; } } } closedir($handle); return $files; } } } print_r(my_scandir("D:Program FilesInternet ExplorerMUI")); 1.在PHP中,當前腳本的名稱(不包括路徑和查詢字符串)記錄在預定義變量(1)中;而鏈接到當前頁面的的前一頁面URL記錄在預定義變量(2)中 <?php //本頁地址,SCRIPT_NAME也可以:php/test.php echo $_SERVER['PHP_SELF'].”<br />”; //鏈接到當前頁面的前一頁面的 URL 地址: echo $_SERVER['HTTP_REFERER'].”<br />”; //其它的見參考手冊:語言參考》變量》預定義變量 // 前執行腳本的絕對路徑名:D:Inetpubwwwrootphp est.php echo $_SERVER["SCRIPT_FILENAME"].”<br />”; //正在浏覽當前頁面用戶的 IP 地址:127.0.0.1 echo $_SERVER["REMOTE_ADDR"].”<br />”; //查詢 (query)的字符串(URL 中第一個問號 ? 之後的內容):id=1&bi=2 echo $_SERVER["QUERY_STRING"].”<br />”; //當前運行腳本所在的文檔根目 錄:d:inetpubwwwroot echo $_SERVER["DOCUMENT_ROOT"].”<br />”; ?> 2. 執行程序段<?php echo 8%(-2) ?>將輸出__。 <?php //參考手冊》語言參考》運算 符》算術運算符》%為取模運算,輸出0 echo 8%(-2).”<br />”; //取模 $a % $b 在 $a 為負值時的結果也是負值。輸出-2 echo ((-8)%3).”<br />”; //輸出2 echo (8%(-3)).”<br />”; ?> 3.在HTTP 1.0中,狀態碼 401 的含義是____;如果返回“找不到文件”的提示,則可用 header 函數,其語句為____。 答:401表示未授 權;header(“HTTP/1.0 404 Not Found”);[見參考手冊》函數參考》HTTP函數》header] 4.數 組函數 arsort 的作用是____;語句 error_reporting(2047)的作用是____。 答:arsort:對數 組進行逆向排序並保持索引關系 error_reporting(2047)的作用是:report All errors and warnings 5. 寫出一個正則表達式,過慮網頁上的所有JS/VBS腳本(即把script標記及其內容都去掉): <?php $script=” 以下內容不顯示:<script language=’javascript’>alert(‘cc’);</script>”; echo preg_replace(“/<script[^>].*?>.*?</script>/si”, “替換內容”, $script); 8、談談事務處理 A給B的賬戶轉賬50美元的例子 10. 實現中文字串截取無亂碼的方法。 mb_substr() 11. <?php $empty = ”; $null = NULL; $bool = FALSE; $notSet; $array = array(); // 以下是問題 $a = “hello”; $b = &$a; unset($b); $b = “world”; // 答案為:hello echo $a; ?> 12. <?php $empty = ”; $null = NULL; $bool = FALSE; $notSet; $array = array(); //以下是問題 $a = 1; $x = &$a; $b = $a++; //以下為答案:1 echo $b; ?> 13 <?php $empty = ”; $null = NULL; $bool = FALSE; $notSet; $array = array(); //以下是問題 $x = empty($array); //以下為答案:true echo $x?”true”:”false”; ?> 14、用PHP寫出顯示客戶端IP與服務器IP的代碼: <?php $ip=gethostbyname (“”); echo $ip; ?> 1、用PHP打印出前一天的時間,格式是2006-5-10 22:21:21 <?php //echo date(‘Y-m-d H:i:s’,time()-60*60*24 echo date(“Y:m:d H:i:s”,strtotime(“-1 day”)); ?> 2、echo(),print(),print_r()的區別 echo 是語言結構,無返回值;print功能和echo基本相同,不同的是print是函數,有返回值;print_r是遞歸打印,用於輸出數組對象 3、 能夠使HTML和PHP分離開使用的模板 so much,其實PHP本身就是一種模版引擎,我用過的是smarty,常見的還有PHPLib,FastTemplate,Savant這裡有個模板引擎 列表:http://www.sitepoint.com/forums/showthread.php?t=123769 4. 如何實現PHP、JSP交互? 題目有點含糊不清,SOAP,XML_RPC,Socket function,CURL都可以實現這些,如果是考PHP和Java的整合,PHP內置了這種機制(如果考PHP和.NET的整合,也可以這麼回答), 例如$foo = new Java(‘java.lang.System’); 5.使用哪些工具進行版本控制? CVS和SVN,SVN 號稱下一代CVS,功能強大,不過CVS是老牌,市占率很高.我一直用SVN,題目是問用什麼工具,呃,這個可能需要這麼回答:CVS Server on Apache作服務端,WinCVS作客戶端;Subversion on Apache/DAV 做服務端,TortoiseSVN做客戶端,或者Subclipse做客戶端 6.如何實現字符串翻轉? <?php function reverse($var) { $res=”"; for($i=0,$j=strlen($var);$i<$j;$i++) { $res=$var[$i].$res; } return $res; } $tmpvar=”wofang”; $res=reverse($tmpvar); echo $res; ?> 7、優化MYSQL數據庫的方法。 (1).數據庫設計方面,這是DBA和Architect的責任,設計結構良好的數 據庫,必要的時候,去正規化(英文是這個:denormalize,中文翻譯成啥我不知道),允許部分數據冗余,避免JOIN操作,以提高查詢效率 (2). 系統架構設計方面,表散列,把海量數據散列到幾個不同的表裡面.快慢表,快表只留最新數據,慢表是歷史存檔.集群,主服務器Read & write,從服務器read only,或者N台服務器,各機器互為Master (3).(1)和(2)超越PHP Programmer的要求了,會更好,不會沒關系.檢查有沒有少加索引 (4).寫高效的SQL語句,看看有沒有寫低效的SQL語句,比如生成笛 卡爾積的全連接啊,大量的Group By和order by,沒有limit等等.必要的時候,把數據庫邏輯封裝到DBMS端的存儲過程裡面.緩存查詢結果,explain每一個sql語句 (5).所 得皆必須,只從數據庫取必需的數據,比如查詢某篇文章的評論數,select count(*) … where article_id = ? 就可以了,不要先select * … where article_id = ?然後msql_num_rows. 只傳送必須的SQL語 句,比如修改文章的時候,如果用戶只修改了標題,那就update … set title = ? where article_id = ?不要set content = ?(大文本) (6).必要的時候用不同的存儲引擎.比如InnoDB可以減少死鎖.HEAP可以提高一個數量 級的查詢速度