php面試題

基礎題:
1.表單中 get與post提交方法的區別?
答:get是發送請求HTTP協議經過url參數傳遞進行接收,而post是實體數據,能夠經過表單提交大量信息.
2.session與cookie的區別?
答:session:儲存用戶訪問的全局惟一變量,存儲在服務器上的php指定的目錄中的(session_dir)的位置進行的存放
cookie:用來存儲連續訪問一個頁面時所使用,是存儲在客戶端,對於Cookie來講是存儲在用戶WIN的Temp目錄中的。
二者均可經過時間來設置時間長短
3.數據庫中的事務是什麼?
答:事務(transaction)是做爲一個單元的一組有序的數據庫操做。若是組中的全部操做都成功,則認爲事務成功,即便只有一個操做失敗,事務也不成功。若是全部操做 完成,事務則提交,其修改將做用於全部其餘數據庫進程。若是一個操做失敗,則事務將回滾,該事務全部操做的影響都將取消。
簡述題:
一、用PHP打印出前一天的時間格式是2006-5-10 22:21:21(2分)
答:echo date(‘Y-m-d H:i:s’, strtotime(‘-1 days’));
二、echo(),print(),print_r()的區別(3分)
答:echo是PHP語句, print和print_r是函數,語句沒有返回值,函數能夠有返回值(即使沒有用)
print() 只能打印出簡單類型變量的值(如int,string)
print_r() 能夠打印出複雜類型變量的值(如數組,對象)
echo 輸出一個或者多個字符串
三、可以使HTML和PHP分離開使用的模板(1分)
答:Smarty,Dwoo,TinyButStrong,Template Lite,Savant,phemplate,XTemplate
五、使用哪些工具進行版本控制?(1分)
答:cvs,svn,vss;
六、如何實現字符串翻轉?(3分)
答:echo strrev($a);
七、優化MYSQL數據庫的方法。(4分,多寫多得)
答:
一、選取最適用的字段屬性,儘量減小定義字段長度,儘可能把字段設置NOT NULL,例如’省份,性別’,最好設置爲ENUM
二、使用鏈接(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
三、使用聯合(UNION)來代替手動建立的臨時表
a.建立臨時表:SELECT name FROM `nametest` UNION SELECT username FROM `nametest2`
四、事務處理:
a.保證數據完整性,例如添加和修改同時,二者成立則都執行,一者失敗都失敗
mysql_query(「BEGIN」);
mysql_query(「INSERT INTO customerinfo (name) 8i VALUES (‘$name1′)」;
mysql_query(「SELECT * FROM `orderinfo` where customerid=」.$id」);
mysql_query(「COMMIT」);
五、鎖定表,優化事務處理:
a.咱們用一個 SELECT 語句取出初始數據,經過一些計算,用 UPDATE 語句將新值更新到表中。
包含有 WRITE(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」);
六、使用外鍵,優化鎖定表
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;
七、創建索引:
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[索引字段])
八、優化查詢語句
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";
八、PHP的意思(送1分)
答:PHP是一個基於服務端來建立動態網站的腳本語言,您能夠用PHP和HTML生成網站主頁
九、MYSQL取得當前時間的函數是?,格式化日期的函數是(2分)
答:now(),date()
十、實現中文字串截取無亂碼的方法。(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;
}
}
十一、您是否用過版本控制軟件? 若是有您用的版本控制軟件的名字是?(1分)
十二、您是否用過模板引擎? 若是有您用的模板引擎的名字是?(1分)
答:用過,smarty
1三、請簡單闡述您最得意的開發之做(4分)
答:信息分類
1四、對於大流量的網站,您採用什麼樣的方法來解決訪問量問題?(4分)
答:確認服務器硬件是否足夠支持當前的流量,數據庫讀寫分離,優化數據表,
程序功能規則,禁止外部的盜鏈,控制大文件的下載,使用不一樣主機分流主要流量
1五、用PHP寫出顯示客戶端IP與服務器IP的代碼1分)
答:打印客戶端IP:echo $_SERVER['REMOTE_ADDR’]; 或者: getenv(‘REMOTE_ADDR’);
打印服務器IP:echo gethostbyname(「www.bolaiwu.com」)
1六、語句include和require的區別是什麼?爲避免屢次包含同一文件,可用(?)語句代替它們? (2分)
答:require->require是無條件包含也就是若是一個流程里加入require,不管條件成立與否都會先執行require
include->include有返回值,而require沒有(可能由於如此require的速度比include快)
注意:包含文件不存在或者語法錯誤的時候require是致命的,include不是
1七、如何修改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);

1八、有一個網頁地址, 好比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」);
1九、在HTTP 1.0中,狀態碼401的含義是(?);若是返回「找不到文件」的提示,則可用 header 函數,其語句爲(?);(2分)
答:狀態401表明未被受權,header(「Location:www.xxx.php」);
十二、在PHP中,heredoc是一種特殊的字符串,它的結束標誌必須?(1分)
答:heredoc的語法是用」<<<"加上本身定義成對的標籤,在標籤範圍內的文字視爲一個字符串
例子:
$str = <<<SHOW
my name is Jiang Qihui!
SHOW;
1三、談談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 服務器的技術
,客戶端瀏覽器不須要任何附加的軟件支持。
1四、談談對mvc的認識(1分)
答:由模型(model),視圖(view),控制器(controller)完成的應用程序
由模型發出要實現的功能到控制器,控制器接收組織功能傳遞給視圖;
1五、寫出發貼數最多的十我的名字的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分)
dy@sina.com
8047@qq.com
yahu@.com.cn
dy@163.com
dy_35
答: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);
2一、JS表單彈出對話框函數是?得到輸入焦點函數是? (2分)
答:彈出對話框: alert(),prompt(),confirm()
得到輸入焦點 focus()
2二、JS的轉向函數是?怎麼引入一個外部JS文件?(2分)
答:window.location.href,
2三、foo()和@foo()之間有什麼區別?(1分)
答:@foo()控制錯誤輸出
2四、如何聲明一個名爲」myclass」的沒有方法和屬性的類? (1分)
答:class myclass{ }
2五、如何實例化一個名爲」myclass」的對象?(1分)
答:new myclass()
2六、你如何訪問和設置一個類的屬性? (2分)
答:$object = new myclass();
$newstr = $object->test;
$object->test = "info";
2七、mysql_fetch_row() 和mysql_fetch_array之間有什麼區別? (1分)
答:mysql_fetch_row是從結果集取出1行數組,做爲枚舉
mysql_fetch_array是從結果集取出一行數組做爲關聯數組,或數字數組,二者兼得
2八、GD庫是作什麼用的? (1分)
答:gd庫提供了一系列用來處理圖片的API,使用GD庫能夠處理圖片,或者生成圖片。
在網站上GD庫一般用來生成縮略圖或者用來對圖片加水印或者對網站數據生成報表。
2九、指出一些在PHP輸入一段HTML代碼的辦法。(1分)
答:echo "aaa";
30、下面哪一個函數能夠打開一個文件,以對文件進行讀和寫操做?(1分)
(a) fget() (b) file_open() (c) fopen() (d) open_file() [ c ]
3一、下面哪一個選項沒有將 john 添加到users 數組中? (1分)
(a) $users[] = 'john’;
(b) array_add($users,’john’);
(c) array_push($users,'john’);
(d) $users ||= 'john’; [ a , c ]
3二、下面的程序會輸入是否?(1分)
$num = 10;
function multiply(){
$num = $num * 10;
}
multiply();
echo $num;
?>
輸出:10
3三、使用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"];
}
3四、如何使用下面的類,並解釋下面什麼意思?(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方法,實例化類調用方法多字符串加密
3五、寫出 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='張四'");
3六、請寫出數據類型(int char varchar datetime text)的意思; 請問varchar和char有什麼區別(2分)
答:int是數字類型,char固定長度字符串,varchar實際長度字符串,datetime日期時間型,text文本字符串
char的場地固定爲建立表設置的長度,varchar爲可變長度的字符
3八、寫出如下程序的輸出結果 (1分)
$b=201;
$c=40;
$a=$b>$c?4:5;
echo $a;
?>
答:4
3九、檢測一個變量是否有設置的函數是否?是否爲空的函數是?(2分)
答:isset($str),empty($str);
40、取得查詢結果集總數的函數是?(1分)
答:mysql_num_rows($result);
4一、$arr = array('james', 'tom', 'symfony'); 請打印出第一個元素的值 (1分)
答:echo $array[0];
4二、請將41題的數組的值用','號分隔併合併成字串輸出(1分)
答:for($i=0;$i<count($array);$i++){ echo $array[$i].",";}
4三、$a = 'abcdef'; 請取出$a的值並打印出第一個字母(1分)
答:echo $a{0} 或 echo substr($a,0,1)
4四、PHP能夠和sql server/oracle等數據庫鏈接嗎?(1分)
答:固然能夠
4五、請寫出PHP5權限控制修飾符(3分)
答:public(公共),private(私用),protected(繼承)
4六、請寫出php5的構造函數和析構函數(2分)
答:__construct , __destruct
4七、完成如下:
(一)建立新聞發佈系統,表名爲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("
\n");
while($rowArray=mysql_fetch_array($result))
{
print("
".$rowArray['categroy_name']."\n");
}
print("");
}
編程題:
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 的相對路徑應該是 http://www.cnblogs.com/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.執行程序段將輸出__0__。
3.在HTTP 1.0中,狀態碼 401 的含義是____;若是返回「找不到文件」的提示,則可用 header 函數,其語句爲____。
4.數組函數 arsort 的做用是__對數組進行逆向排序並保持索引關係__;語句 error_reporting(2047)的做用是__報告全部錯誤和警告__。
5.PEAR中的數據庫鏈接字符串格式是____。
6.寫出一個正則表達式,過慮網頁上的全部JS/VBS腳本(即把scrīpt標記及其內容都去掉):preg_replace("/].*?>.*?/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'] . "\n";
}
else
{
echo ">" . $category['name'] . "\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'] . "\n";
}else{
$txt1 = ">" . $cate['name'] . "\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 "
";
$c = new cate();
//$c->Get_Category();
$ttt= $c->getFlush($id,'0','3');
echo $ttt;
echo "";
?>php

相關文章
相關標籤/搜索