php面试题2

      

php面试题及答案(原创)收藏

 基础题:

1.表单中 get与post提交方法的区别?

答:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息.

2.session与cookie的区别?

答:session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放

   cookie:用来存储连续訪問一个頁面时所使用,是存储在客户端,对于Cookie来说是存储在用户WIN的Temp目录中的。

   两者都可通过时间来设置时间长短

简述题:

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)来代替子查询:

3、使用联合(UNION)来代替手动创建的临时表

4、事务处理:

5、锁定表,优化事务处理:

6、使用外键,优化锁定表

  

7、建立索引:

8、优化查询语句

  

8、PHP的意思(送1分)

答:PHP是一个基于服务端来创建动态网站的脚本语言,您可以用PHP和HTML生成网站主页

9、MYSQL取得当前时间的函数是?,格式化日期的函数是(2分)

答:now(),date()

10、实现中文字串截取无乱码的方法。(3分)****************

   Mb_substr

答: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

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=''> ");

    while($rowArray=mysql_fetch_array($result))

    {

       print("<option value='".$rowArray['category_id']."'>".$rowArray['categroy_name']."</option> ");

    }

    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> ";

 }

 else

 {

 echo ">" . $category['name'] . "</option> ";

 }

 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> ";

                 }else{

                     $txt1 = ">" . $cate['name'] . "</option> ";

                 }

                 $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、求$a,$b,$c三个数中的最大值和最小值(5分)

echo max($a,$b,$c);

echo min($a,$b,$c);

2echo()print()print_r()的区别(5分)

print()    只能打印出简单类型变量的值(如int,string) 
print_r() 可以打印出复杂类型变量的值(如数组,对象) 
echo      输出一个或者多个字符串

3、防止SQL注入漏洞可以用哪些函数?(5分)

addslashes()

mysql_escape_string()

正确回答1个即可

4、用PHP写出显示客户端IP与服务器IP的代码(5分)

echo $_SERVER[‘REMOTE_ADDR’];

echo $_SERVER[‘SERVER_ADDR’];

5、用PHP打印出前一天的时间,格式例如 2006-5-10 22:21:2110分)

strftime(“%Y-%m-%d %T”, strtotime(“-1 day”));

date(“Y-m-d H:i:s”, strtotime(“-1 day”));

正确回答1个即可

6、写一个函数,能够遍历一个文件夹下的所有文件和子文件夹(20分)

function dir_recurse($dir) {

    $i = 1;

    if($handle = opendir($dir)) {

        while(false !== ($file = readdir($handle))) {

            if($file != "." && $file != ".." ) {

                if(is_dir($dir."/".$file) == true) {

                    $fullpath = $dir."/".$file;

                    dir_recurse($fullpath);

                    echo "$fullpath ";

                    $i++;

                }else {

                    $fullpath = $dir."/".$file;

                    echo "$fullpath ";

                    $i++;

                }

            }

        }

        closedir($handle);

    }

}

7、创建文件exer1,设置访问权限为rw-r--r--,现要增加所有用户的执行权限和同组用户的写权限,写出操作过程的命令(10分)

touch exer1

chmod 644  exer1

增加权限

chmod a+x  exer1

chmod g+w  exer1

或者

chmod 775 exer1

 

8、字符串“to upper case分别用phpshell js实现将字符串中的字符全部转换成大写并输出。(5分)

Php实现: echo strtoupper(‘to upper case’)

Shell实现:echo "to upper case" | tr 'a-z' 'A-Z'

Js实现:

<script language="javascript">
var stmp1 = "to upper case ";
alert(stmp1.toLocaleUpperCase());//转换成大写
alert(stmp1.toUpperCase())//转换成大写
</script>

9、用root登陆mysql数据库,如果mydb不存在,则在mysql中创建数据库mydb

root用户分配所有权限从192.168.1.1 ip来访问mysdb数据库。(root用户密码为空)(10分)

 

CREATE DATABASE IF NOT EXISTS mydb;

grant all on mydb.* to root@’ 192.168.1.1’ identified by '' ;

10、表1 message字段如下:(15分)

Id

自增id

Title

标题

Content

内容

category_id

分类id

Hits

点击量

2 字段如下comment

comment_id

回复id

Id

关联message表中的id

comment_content

回复内容

现通过查询数据库需要得到以下格式的列表,并按照回复数量排序,

回复最高的排在最前面

“文章id       文章标题       点击量   回复数量”

请写出sql

 

SELECT

M.`id`, M.`title`, M.`hits`, COUNT(C.`comment_id`) AS CNT

FROM

    `message` AS M LEFT JOIN `comment` AS C ON M.`id` = C.`id`

GROUP BY M.`id`

ORDER BY CNT DESC;

12、列举一下你知道的开源搜索引擎开发包。(5分)

    简单描述网页搜索引擎的工作原理(可以简单画出流程图,并加以流程说明)

 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);
?>

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.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。

<?php
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)中。



答:echo $_SERVER['PHP_SELF']; echo $_SERVER["HTTP_REFERER"];



2.执行程序段<?php echo 8%(-2) ?>将输出(3)。



答:0



3.在HTTP 1.0中,状态码 401 的含义是(4);如果返回“找不到文件”的提示,则可用 header 函数,其语句为(5)。

答:(4)未授权 (5) header("HTTP/1.0 404 Not Found");



4.数组函数 arsort 的作用是(6);语句 error_reporting(2047)的作用是(7)。



答:(6)对数组进行逆向排序并保持索引关系  (7)All errors and warnings



5.写出一个正则表达式,过虑网页上的所有JS/VBS脚本(即把标记及其内容都去掉):(9)。



答:/<[^>].*?>.*?</>/si



6.以Apache模块的方式安装PHP,在文件http.conf中首先要用语句(10)动态装载PHP模块,

然后再用语句(11)使得Apache把所有扩展名为php的文件都作为PHP脚本处理。



答:(10) LoadModule    php5_module "D:/xampp/apache/bin/php5apache2.dll"

   (11) AddType application/x-httpd-php-source .phps

        AddType application/x-httpd-php .php .php5 .php4 .php3 .phtml



7.语句 include 和 require 都能把另外一个文件包含到当前文件中,它们的区别是(12);为了避免多次包含同一文件,可以用语句(13)来代替它们。

答:(12) 发生异常时include产生警告require产生致命错误  (13) require_once()/include_once()



8.类的属性可以序列化后保存到 session 中,从而以后可以恢复整个类,这要用到的函数是(14)。



答:serialize() /unserialize()



9.一个函数的参数不能是对变量的引用,除非在php.ini中把(15)设为on.



答:allow_call_time_pass_reference



10.SQL 中LEFT JOIN的含义是(16)。

如果 tbl_user记录了学生的姓名(name)和学号(ID),

tbl_score记录了学生(有的学生考试以后被开除了,没有其记录)的学号(ID)和考试成绩(score)以及考试科目(subject),

要想打印出各个学生姓名及对应的的各科总成绩,则可以用SQL语句(17)。






答:(16) 自然左外连接

     (17) select name , count(score) as sum_score from tbl_user left join tbl_score on tbl_user.ID=tbl_score.ID  group by tbl_user.ID



11..在PHP中,heredoc是一种特殊的字符串,它的结束标志必须(18)。



答:结束标识符所在的行不能包含任何其它字符除";"




12.用PHP打印出前一天的时间格式是2006-5-10 22:21:21



答:echo date('Y-m-d H:i:s', strtotime('-1 day'));



13.echo(),print(),print_r()的区别



答:echo是语言结构,无返回值;print功能和echo基本相同,不同的是print是函数,有返回值;print_r是递归打印,用于输出数组对象



14.如何实现字符串翻转?



答:.用strrev函数呗,不准用PHP内置的就自己写:

strrev($str)

{

    $len=strlen($str);

    $newstr = '';

    for($i=$len;$i>=0;$i--)

    {

        $newstr .= $str{$i};

    }

    return $newstr;

}

15.实现中文字串截取无乱码的方法。



答:mb_substr()



16.使用php写一段简单查询,查出所有姓名为“张三”的内容并打印出来

表名User

Name          Tel              Content         Date

张三        13333663366        大专毕业       2006-10-11

张三        13612312331        本科毕业       2006-10-15

张四        021-55665566       中专毕业       2006-10-15



答:SELECT Name,Tel,Content,Date FROM User WHERE Name='张三'

17.如何使用下面的类,并解释下面什么意思?

class test

{

    Get_test($num)

    {

        $num=md5(md5($num)."En");

        return $num;

    }

}

答:用法:

$get_test = new test();

$result = $get_test->Get_test(2);



将$num变量进行两次md5后返回,第2次的md5中的参数,在第一次md5($num)后多加了En

18.使用五种以上方式获取一个文件的扩展名

要求:dir/upload.image.jpg,找出 .jpg 或者 jpg ,



答:使用五种以上方式获取一个文件的扩展名



1)

get_ext1($file_name)

{

    return strrchr($file_name, '.');

}



2)

get_ext2($file_name)

{

    return substr($file_name, strrpos($file_name, '.'));

}



3)

get_ext3($file_name)

{

    return array_pop(explode('.', $file_name));

}



4)

get_ext4($file_name)

{

    $p = pathinfo($file_name);

    return $p['extension'];

}



5)

get_ext5($file_name)

{

    return strrev(substr(strrev($file_name), 0, strpos(strrev($file_name), '.')));

}

19.如何修改SESSION的生存时间



这个函式库让你处理和显示各式格式的图档,它的另一个常见用途是制作所图档。GD 以外的另一个选择是 ImageMagick,但这个函式库并不内建于 PHP 之中,必须由系统管理员安装在伺服器上答:其实 Session 还提供了一个函数 session_set_cookie_params(); 来设置 Session 的生存期的,该函数必须在 session_start() 函数调用之前调用:

<?php

// 保存一天

$lifeTime = 24 * 3600;

session_set_cookie_params($lifeTime);

session_start();

$_SESSION["admin"] = true;

?>

20. 请写一个函数,实现以下功能: 字符串“open_door” 转换成 “OpenDoor”、”make_by_id” 转换成 ”MakeById”。30.请举例说明在你的开发过程中用什么方法来加快页面的加载速度

A.生成静态HTML

B.生成xml

C.可不用数据库的尽量不用数据库把变量参数存于文本.

D.用ZEND加速





答:<?
Function test($str){
$arr1=explode('_',$str);
//$arr2=array_walk($arr1,ucwords( ));
 
$str = implode(' ',$arr1);
return ucwords($str);
}
$aa='open_door';
echo test($aa);
?>

21. 如何用php的环境变量得到一个网页地址的内容?ip地址又要怎样得到?



答:$_SERVSR[‘REQUEST_URI’]

$_SERVER[‘REMOTE_ADDR’]



22.求两个日期的差数,例如2007-2-5 ~ 2007-3-6 的日期差数

答:(strtotime(‘2007-3-6’)-strtotime(‘2007-2-5’))/3600*24



23.表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。



答:select case when A>B then A else B end,

       case when B>C then B else C end

From test



24.请简述项目中优化sql语句执行效率的方法,从哪些方面,sql语句性能如何分析?



答:(1)选择最有效率的表名顺序

(2)WHERE子句中的连接顺序

(3)SELECT子句中避免使用‘*’

(4)用Where子句替换HAVING子句

(5)通过内部函数提高SQL效率

(6)避免在索引列上使用计算。

(7)提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉。



25.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() 的值。



26.下面的代码用来做什么?请解释。

$date='08/26/2003';print ereg_replace("([0-9]+)/([0-9]+)/([0-9]+)",");

这是把一个日期从 MM/DD/YYYY 的格式转为 DD/MM/YYYY 格式。我的一个好朋友告诉我可以把这个正规表达式拆解为以下的语句,对于如此简单的表示是来说其实无须拆解,纯粹为了解说的方便:

// 对应一个或更多 0-9,后面紧随一个斜号$regExpression = "([0-9]+)/";// 应一个或更多 0-9,后面紧随另一个斜号$regExpression .= "([0-9]+)/";// 再次对应一个或更多 0-9$regExpression .= "([0-9]+)";至于 则是用来对应括号,第一个括号对的是月份,



27.GD 函式库用来做什么?



答:这个函式库让你处理和显示各式格式的图档,它的另一个常见用途是制作所图档。GD 以外的另一个选择是 ImageMagick,但这个函式库并不内建于 PHP 之中,必须由系统管理员安装在伺服器上



28.请举例说明在你的开发过程中用什么方法来加快页面的加载速度

   答:要用到服务器资源时才打开,及时关闭服务器资源,数据库添加索引,页面可生成静态,图片等大文件单独服务器。使用代码优化工具啦



29.防止SQL注射漏洞一般用__addslashes___函数。



30.PHP中传值和传引用、传地址的区别是什么?



答:传值是把实参的值赋值给行参 那么对行参的修改,不会影响实参的值

传地址 是传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都指向同一个对象



31。如何通过javascript判断一个窗口是否已经被屏蔽

答:获取open()的返回值,如果是null,就是屏蔽了




33.对于大流量的网站,您采用什么样的方法来解决访问量问题



答:首先,确认服务器硬件是否足够支持当前的流量

其次,优化数据库访问。

第三,禁止外部的盗链。

第四,控制大文件的下载。

第五,使用不同主机分流主要流量

第六,使用流量分析统计软件

编程题
   1. 写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名
  例如: http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出 php 或 .php
      function getext($url) {

       $w_param = pathinfo($url);

      $str = $w_param['filename'];

      list($type, $vars) = explode('?',$str);

      $kuozhan=explode('.',$type);

       return $kuozhan[1];

}



1、
  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);


4.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。
  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;

     }

}


5.简述论坛中无限分类的实现原理。
 答:
<?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 selectedvalue=".$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      

php面试题及答案(原创)收藏

 基础题:

1.表单中 getpost提交方法的区别?

:get是发送请求HTTP协议通过url参数传递进行接收,post是实体数据,可以通过表单提交大量信息.

 

2.sessioncookie的区别?

:session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放

   cookie:用来存储连续訪問一个頁面时所使用,是存储在客户端,对于Cookie来说是存储在用户WINTemp目录中的。

   两者都可通过时间来设置时间长短

 

简述题:

1、用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2)****************

:echo date('Y-m-d H:i:s', strtotime('-1 days'));

 

2echo(),print(),print_r()的区别(3)

:echoPHP语句, printprint_r是函数,语句没有返回值,函数可以有返回值(即便没有用

   print()    只能打印出简单类型变量的值(int,string) 

   print_r()可以打印出复杂类型变量的值(如数组,对象

   echo     输出一个或者多个字符串

 

3、能够使HTMLPHP分离开使用的模板(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)来代替子查询:

 

3、使用联合(UNION)来代替手动创建的临时表

4、事务处理:

 

5、锁定表,优化事务处理:

 

6、使用外键,优化锁定表

  

7、建立索引:

 

8、优化查询语句

  

8PHP的意思(1)

:PHP是一个基于服务端来创建动态网站的脚本语言,您可以用PHPHTML生成网站主页

 

9MYSQL取得当前时间的函数是?,格式化日期的函数是(2)

:now(),date()

 

10、实现中文字串截取无乱码的方法。(3)****************

   Mb_substr

: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

16、语句includerequire的区别是什么?为避免多次包含同一文件,可用(?)语句代替它们? (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 ScriptJava script

)作为自己的开发语言。

  PHP是一种跨平台的服务器端的嵌入式脚本语言. 它大量地借用C,JavaPerl语言的语法

, 并耦合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 PageJsp 可以在ServerletJavaBean的支持下,完成功能强大的站点

程序。

  三者都提供在 HTML 代码中混合某种程序代码、由语言引擎解释执行程序代码的能力。

JSP代码被编译成 Servlet 并由 Java 虚拟机解释执行,这种编译操作仅在对 JSP 页面的

第一次请求时发生。在 ASP PHPJSP 环境下, HTML 代码主要负责描述信息的显示样式

,而程序代码则用来描述处理逻辑。普通的 HTML 页面只依赖于 Web 服务器,而 ASP PH

PJSP 页面需要附加的语言引擎分析和执行程序代码。程序代码的执行结果被重新嵌入到

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. PHPerror_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);

 

21JS表单弹出对话框函数是?获得输入焦点函数是? (2)

:弹出对话框: alert(),prompt(),confirm()

   获得输入焦点 focus()

 

22JS的转向函数是?怎么引入一个外部JS文件?(2)

:window.location.href,<script type="text/javascript" src="js/js_function.js"></script>

 

23foo()@foo()之间有什么区别?(1)

:@foo()控制错误输出

 

24、如何声明一个名为”myclass”的没有方法和属性的类? (1)

:class myclass{ }

 

25、如何实例化一个名为”myclass”的对象?(1)

:new myclass()

 

26、你如何访问和设置一个类的属性? (2)

:$object = new myclass();

   $newstr = $object->test;

   $object->test = "info";

 

27mysql_fetch_row() mysql_fetch_array之间有什么区别? (1)

:mysql_fetch_row是从结果集取出1行数组,作为枚举

   mysql_fetch_array是从结果集取出一行数组作为关联数组,或数字数组,两者兼得

 

28GD库是做什么用的? (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)的意思; 请问varcharchar有什么区别(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)

 

44PHP可以和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=''> ");

    while($rowArray=mysql_fetch_array($result))

    {

       print("<option value='".$rowArray['category_id']."'>".$rowArray['categroy_name']."</option> ");

    }

    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.SQLLEFT 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> ";

 }

 else

 {

 echo ">" . $category['name'] . "</option> ";

 }

 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> ";

                 }else{

                     $txt1 = ">" . $cate['name'] . "</option> ";

                 }

                 $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、求$a,$b,$c三个数中的最大值和最小值(5分)

echo max($a,$b,$c);

echo min($a,$b,$c);

 

2echo()print()print_r()的区别(5分)

print()   只能打印出简单类型变量的值(int,string) 
print_r()可以打印出复杂类型变量的值(如数组,对象) 
echo      输出一个或者多个字符串

3、防止SQL注入漏洞可以用哪些函数?(5分)

addslashes()

mysql_escape_string()

正确回答1个即可

 

4、用PHP写出显示客户端IP与服务器IP的代码(5分)

echo $_SERVER[‘REMOTE_ADDR’];

echo $_SERVER[‘SERVER_ADDR’];

 

5、用PHP打印出前一天的时间,格式例如 2006-5-10 22:21:2110分)

strftime(“%Y-%m-%d %T”, strtotime(“-1 day”));

date(“Y-m-d H:i:s”, strtotime(“-1 day”));

正确回答1个即可

 

6、写一个函数,能够遍历一个文件夹下的所有文件和子文件夹(20分)

function dir_recurse($dir) {

    $i = 1;

    if($handle = opendir($dir)) {

        while(false !== ($file = readdir($handle))) {

            if($file != "." && $file != ".." ) {

                if(is_dir($dir."/".$file) == true) {

                    $fullpath = $dir."/".$file;

                    dir_recurse($fullpath);

                    echo "$fullpath ";

                    $i++;

                }else {

                    $fullpath = $dir."/".$file;

                    echo "$fullpath ";

                    $i++;

                }

            }

        }

        closedir($handle);

    }

}

 

7、创建文件exer1,设置访问权限为rw-r--r--,现要增加所有用户的执行权限和同组用户的写权限,写出操作过程的命令(10分)

touch exer1

chmod 644  exer1

增加权限

chmod a+x  exer1

chmod g+w  exer1

或者

chmod 775 exer1

 

8、字符串“to upper case分别用phpshell js实现将字符串中的字符全部转换成大写并输出。(5分)

Php实现: echo strtoupper(‘to upper case’)

Shell实现:echo "to upper case" | tr 'a-z' 'A-Z'

Js实现:

<script language="javascript">
var stmp1 = "to upper case ";
alert(stmp1.toLocaleUpperCase());//
转换成大写
alert(stmp1.toUpperCase())//转换成大写
</script>

 

9、用root登陆mysql数据库,如果mydb不存在,则在mysql中创建数据库mydb

root用户分配所有权限从192.168.1.1 ip来访问mysdb数据库。(root用户密码为空)(10分)

 

CREATE DATABASE IF NOT EXISTS mydb;

grant all on mydb.* to root@’ 192.168.1.1’ identified by '' ;

 

10、表1 message字段如下:(15分)

Id

自增id

Title

标题

Content

内容

category_id

分类id

Hits

点击量

2 字段如下comment

comment_id

回复id

Id

关联message表中的id

comment_content

回复内容

现通过查询数据库需要得到以下格式的列表,并按照回复数量排序,

回复最高的排在最前面

“文章id       文章标题       点击量   回复数量”

请写出sql

 

SELECT

M.`id`, M.`title`, M.`hits`, COUNT(C.`comment_id`) AS CNT

FROM

    `message` AS M LEFT JOIN `comment` AS C ON M.`id` = C.`id`

GROUP BY M.`id`

ORDER BY CNT DESC;

12、列举一下你知道的开源搜索引擎开发包。(5分)

    简单描述网页搜索引擎的工作原理(可以简单画出流程图,并加以流程说明)

 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>";
echopreg_replace("/<script[^>].*?>.*?</script>/si", "替换内容", $script);
?>

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语句____.

答:自然左外连接

createdatabase phpinterview;
use phpinterview
createtable tbl_user
(
   ID                             int                            notnull,
   name                           varchar(50)                    notnull,
   primarykey (ID)
);
createtable tbl_score
(
   ID                             int                            notnull,
   score                          dec(6,2)                       notnull,
   subject                        varchar(20)                    notnull
);

insertinto tbl_user (ID, name) values (1, 'beimu');
insertinto tbl_user (ID, name) values (2, 'aihui');
insertinto tbl_score (ID, score, subject) values (1, 90, '语文');
insertinto tbl_score (ID, score, subject) values (1, 80, '数学');
insertinto tbl_score (ID, score, subject) values (2, 86, '数学');
insertinto tbl_score (ID, score, subject) values (2, 96, '语文');

select A.id,sum(B.score) as sumscore
from tbl_user A leftjoin tbl_score B
on A.ID=B.ID
groupby A.id

10.  PHP中,heredoc是一种特殊的字符串,它的结束标志必须____
答:结束标识符所在的行不能包含任何其它字符除";"

11.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。

<?php
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)中。



答:echo $_SERVER['PHP_SELF']; echo $_SERVER["HTTP_REFERER"];



2.执行程序段<?php echo 8%(-2) ?>将输出(3)。



答:0



3.HTTP 1.0中,状态码 401 的含义是(4);如果返回“找不到文件”的提示,则可用 header 函数,其语句为(5)。

答:(4)未授权 (5) header("HTTP/1.0 404 Not Found");



4.数组函数 arsort 的作用是(6);语句 error_reporting(2047)的作用是(7)。



答:(6)对数组进行逆向排序并保持索引关系  (7)All errors and warnings



5.写出一个正则表达式,过虑网页上的所有JS/VBS脚本(即把标记及其内容都去掉):(9)。



答:/<[^>].*?>.*?</>/si



6.Apache模块的方式安装PHP,在文件http.conf中首先要用语句(10)动态装载PHP模块,

然后再用语句(11)使得Apache把所有扩展名为php的文件都作为PHP脚本处理。



答:(10) LoadModule    php5_module "D:/xampp/apache/bin/php5apache2.dll"

   (11) AddType application/x-httpd-php-source .phps

        AddType application/x-httpd-php .php .php5 .php4 .php3 .phtml



7.语句 include require 都能把另外一个文件包含到当前文件中,它们的区别是(12);为了避免多次包含同一文件,可以用语句(13)来代替它们。

答:(12) 发生异常时include产生警告require产生致命错误  (13) require_once()/include_once()



8.类的属性可以序列化后保存到 session 中,从而以后可以恢复整个类,这要用到的函数是(14)。



答:serialize() /unserialize()



9.一个函数的参数不能是对变量的引用,除非在php.ini中把(15)设为on.



答:allow_call_time_pass_reference



10.SQL LEFT JOIN的含义是(16)。

如果 tbl_user记录了学生的姓名(name)和学号(ID)

tbl_score记录了学生(有的学生考试以后被开除了,没有其记录)的学号(ID)和考试成绩(score)以及考试科目(subject)

要想打印出各个学生姓名及对应的的各科总成绩,则可以用SQL语句(17)。




 



答:(16) 自然左外连接

     (17) select name , count(score) as sum_score from tbl_user left join tbl_score on tbl_user.ID=tbl_score.ID  group by tbl_user.ID



11..PHP中,heredoc是一种特殊的字符串,它的结束标志必须(18)。



答:结束标识符所在的行不能包含任何其它字符除";"




12.PHP打印出前一天的时间格式是2006-5-10 22:21:21



答:echo date('Y-m-d H:i:s', strtotime('-1 day'));



13.echo(),print(),print_r()的区别



答:echo是语言结构,无返回值;print功能和echo基本相同,不同的是print是函数,有返回值;print_r是递归打印,用于输出数组对象



14.如何实现字符串翻转?



答:.strrev函数呗,不准用PHP内置的就自己写:

strrev($str)

{

    $len=strlen($str);

    $newstr = '';

    for($i=$len;$i>=0;$i--)

    {

        $newstr .= $str{$i};

    }

    return $newstr;

}

15.
实现中文字串截取无乱码的方法。



答:mb_substr()



16.使用php写一段简单查询,查出所有姓名为“张三”的内容并打印出来

表名User

Name          Tel              Content         Date

张三        13333663366        大专毕业       2006-10-11

张三        13612312331        本科毕业       2006-10-15

张四        021-55665566       中专毕业       2006-10-15



答:SELECT Name,Tel,Content,Date FROM User WHERE Name='张三'

17.如何使用下面的类,并解释下面什么意思?

class test

{

    Get_test($num)

    {

        $num=md5(md5($num)."En");

        return $num;

    }

}

答:用法:

$get_test = new test();

$result = $get_test->Get_test(2);



$num变量进行两次md5后返回,2次的md5中的参数,在第一次md5($num)后多加了En

18.使用五种以上方式获取一个文件的扩展名

要求:dir/upload.image.jpg,找出 .jpg 或者 jpg



答:使用五种以上方式获取一个文件的扩展名



1)

get_ext1($file_name)

{

    return strrchr($file_name, '.');

}



2)

get_ext2($file_name)

{

    return substr($file_name, strrpos($file_name, '.'));

}



3)

get_ext3($file_name)

{

    return array_pop(explode('.', $file_name));

}



4)

get_ext4($file_name)

{

    $p = pathinfo($file_name);

    return $p['extension'];

}



5)

get_ext5($file_name)

{

    return strrev(substr(strrev($file_name), 0, strpos(strrev($file_name), '.')));

}

19.
如何修改SESSION的生存时间



这个函式库让你处理和显示各式格式的图档,它的另一个常见用途是制作所图档。GD 以外的另一个选择是 ImageMagick,但这个函式库并不内建于 PHP 之中,必须由系统管理员安装在伺服器上答:其实 Session 还提供了一个函数 session_set_cookie_params(); 来设置 Session 的生存期的,该函数必须在 session_start() 函数调用之前调用:

?php

// 保存一天

$lifeTime = 24 * 3600;

session_set_cookie_params($lifeTime);

session_start();

$_SESSION["admin"] = true;

?


20. 请写一个函数,实现以下功能:字符串“open_door转换成OpenDoor”、”make_by_id转换成MakeById”。30.请举例说明在你的开发过程中用什么方法来加快页面的加载速度

A.生成静态HTML

B.生成xml

C.可不用数据库的尽量不用数据库把变量参数存于文本.

D.用ZEND加速





答:<?
Function test($str){
$arr1=explode('_',$str);
//$arr2=array_walk($arr1,ucwords( ));
 
$str = implode(' ',$arr1);
return ucwords($str);
}
$aa='open_door';
echo test($aa);
?>

21. 如何用php的环境变量得到一个网页地址的内容?ip地址又要怎样得到?



答:$_SERVSR[REQUEST_URI]

$_SERVER[‘REMOTE_ADDR’]



22.求两个日期的差数,例如2007-2-5 ~ 2007-3-6 的日期差数

答:(strtotime(2007-3-6)-strtotime(2007-2-5))/3600*24



23.表中有A B C三列,SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。



答:select case when A>B then A else B end,

       case when B>C then B else C end

From test



24.请简述项目中优化sql语句执行效率的方法,从哪些方面,sql语句性能如何分析?



答:(1)选择最有效率的表名顺序

2WHERE子句中的连接顺序

3SELECT子句中避免使用‘*

4)用Where子句替换HAVING子句

5)通过内部函数提高SQL效率

6)避免在索引列上使用计算。

7)提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉。



25.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() 的值。



26.下面的代码用来做什么?请解释。

$date='08/26/2003';print ereg_replace("([0-9]+)/([0-9]+)/([0-9]+)",");

这是把一个日期从 MM/DD/YYYY 的格式转为 DD/MM/YYYY 格式。我的一个好朋友告诉我可以把这个正规表达式拆解为以下的语句,对于如此简单的表示是来说其实无须拆解,纯粹为了解说的方便:

// 对应一个或更多 0-9,后面紧随一个斜号$regExpression = "([0-9]+)/";// 应一个或更多 0-9,后面紧随另一个斜号$regExpression .= "([0-9]+)/";// 再次对应一个或更多 0-9$regExpression .= "([0-9]+)";至于则是用来对应括号,第一个括号对的是月份,



27.GD 函式库用来做什么?



答:这个函式库让你处理和显示各式格式的图档,它的另一个常见用途是制作所图档。GD 以外的另一个选择是 ImageMagick,但这个函式库并不内建于 PHP 之中,必须由系统管理员安装在伺服器上



28.请举例说明在你的开发过程中用什么方法来加快页面的加载速度

   答:要用到服务器资源时才打开,及时关闭服务器资源,数据库添加索引,页面可生成静态,图片等大文件单独服务器。使用代码优化工具啦



29.防止SQL注射漏洞一般用__addslashes___函数。



30.PHP中传值和传引用、传地址的区别是什么?



答:传值是把实参的值赋值给行参那么对行参的修改,不会影响实参的值

传地址是传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都指向同一个对象



31。如何通过javascript判断一个窗口是否已经被屏蔽

答:获取open()的返回值,如果是null,就是屏蔽了




33.对于大流量的网站,您采用什么样的方法来解决访问量问题



答:首先,确认服务器硬件是否足够支持当前的流量

其次,优化数据库访问。

第三,禁止外部的盗链。

第四,控制大文件的下载。

第五,使用不同主机分流主要流量

第六,使用流量分析统计软件

 

编程题
   1. 写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名
  例如: http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出 php .php
      function getext($url) {

       $w_param = pathinfo($url);

      $str = $w_param['filename'];

      list($type, $vars) = explode('?',$str);

      $kuozhan=explode('.',$type);

       return $kuozhan[1];

}



1、
  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);


 

4.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。
  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;

     }

}


5.简述论坛中无限分类的实现原理。
 :
<?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 selectedvalue=".$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>";
?>