天天看點

php面試題及答案(轉載)

轉自:http://blog.csdn.net/phpsome/article/details/4085464

基礎題:

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

//指定分類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]);

}

//指定分類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>";

?>