您的位置:首页 > 职场人生

PHP程序员常用面试题

2009-07-25 10:54 323 查看
基础题:

1表单中GET与POST提交方法的区别?

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

2 SESSION与COOKIE的区别?

答:SESSION:储存用户访问的全局唯一变量,存储在服务器上的PHP指定的目录中(SESSION_DIR)的位置存放。COOKIE:是用来存储连续访问一个页面时所使用,是存储客户端,对于COOKIE来说是存储在用户WIN的TEMP目录中的。两者都可以时间来设置长短。

SESSION的时间设置:PHP.INI中的session.gc_maxlifetime

3:数据库的事务是什么?

答:事务(TRANSACTION)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使一个操作失败,事务也不会成功。如果所有操作完成。事务则提交,其修改将作用于其它数据库的进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。

简述题

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

  if(function_exists('date_default_timezone_set')){

    date_default_timezone_set('PRC');

}

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

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

  echo能输出一个或多个字符,不是函数,没有返回值

  print print_r()是函数,有返回值

  pinrt通常输出(int string)

  print_r()通常用于打印数组对像

3.能够使HTML和PHP分离开使用的模板。

  smarty

4.使用哪些工具进行版本控制。

  cvs svn(subvation)

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

  strrev()

6.优化MYSQL数方法据库的.

  1:选用最适用的字段属性,应该尽量把字段设置为NOT NULL,这样将来执行查询的时候,数据库不用去比较NULL的值。

 2:使用连接(JOIN)代替子查询(SUB—QUERYIES)

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

 4:尽量少使用LIKE关键字和通配符

 5:使用事务和外键

7:什么是PHP?

  PHP是一种服务器端的,嵌入HTML的脚本语言。

8:MYSQL取得当前时间的函数是?,格式化日期的函数是?

   NOW() date_format(date,format)

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

当用 substr 截取中文字符的时候会出现乱码,当然你如果装了 mb 扩展, 用 mb_substr截取就不会出现这种问题,如果你用的是虚拟主机,主机上又没装 mb扩展的话,你可以用下面的函数截取

# Cut chinese string into appointed length

# @param [string] string need deal

# @param [start]  position to cut from

# @param [length] length to cut

# @return string

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;

  }

}

10.您是否用过版本控制软件?如果您用的版本控制软件的名字是?

  CVS subverstion

11.您是否用过模板引擎?如果有您用的模板引擎是?

  用过 SMARTY

13、对于大流量的网站,您采用什么样的方法来解决访问量问题?(4分)

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

其次,优化数据库访问。

第三,禁止外部的盗链。

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

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

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

14.用PHP写出显示客户端IP与服务器IP的代码?

   客户端:echo $_SERVER['REMOTE_ADDR']

   服务器:

   $serverIP=gethostnamel("$url")

   echo array_shift($serverIP);

15.语句INCLUDE和REQUIRE的区别是什么?为避免多次包含一文件,可用什么代替?

1、PHP程序执行到require()时,只会读取一次档案,故常放在程序开头,档案引入后PHP会将网页档重新编译,让引入档成为原先网页的一部分。

2、PHP程序执行到include()时,每次皆会读取档案,故常用于流程控制的区段,如条件判断或循环中。

3、require() :如果文件不存在,会报出一个fatal error.脚本停止执行

4、include() : 如果文件不存在,会给出一个 warning,但脚本会继续执行

16.如何修改SESSION的生存时间/

  修改PHP。INI里的SESSION.GC_MAXLIFETIME

17、有一个网页地址, 比如PHP开发资源网主页: http://www.baidu.com/index.html,如何得到它的内容?($1分)
   $handle=fopen("http://www.baidu.com/index.html","rb")

   $content = Stream_get_contents($handle);

   fclose($handle);

   echo $content;

18、在HTTP 1.0中,状态码401的含义是(?);如果返回“找不到文件”的提示,则可用 header 函数,其语句为(?);(2分)

状态值为401,代表未被授权; header("Location:  http://www.php.net");
19、在PHP中,heredoc是一种特殊的字符串,它的结束标志必须?(1分)

heredoc的语法是用"<<<"加上自己定义成对的标签,在标签范围內的文字视为一个字符串

$str = <<I saw a dog yesterday.

EOD;

?>

需要注意的是:

1、"<<<"后面的EOD是自己定义的标签名称,必须要成对,而且后面要加上分号表示结束。2、结束的标签前面最好不要有空格,以免发生错误!

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(__f
4000
ile__); print_r($script_name);

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

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

   获得输入焦点 focus()

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

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

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

答:@foo()控制错误输出

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

答:class myclass{ }

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

答:new myclass()

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

答:$object = new myclass();

   $newstr = $object->test;

   $object->test = "info";

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

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

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

28、GD库是做什么用的? (1分)

答:gd库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片。

   在网站上GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据生成报表。

29、指出一些在PHP输入一段HTML代码的办法。(1分)

答:echo "<a href='index.php'>aaa</a>";

30、下面哪个函数可以打开一个文件,以对文件进行读和写操作?(1分)

    (a) fget() (b) file_open() (c) fopen() (d) open_file()  [  c  ]

31、下面哪个选项没有将 john 添加到users 数组中? (1分)

  (a) $users[] = ‘john’;

  (b) array_add($users,’john’);

  (c) array_push($users,‘john’);

  (d) $users ||= ‘john’;  [  a , c  ]

32、下面的程序会输入是否?(1分)

  $num = 10;

  function multiply(){

  $num = $num * 10;

  }

  multiply();

  echo $num;

  ?>

    输出:10

33、使用php写一段简单查询,查出所有姓名为“张三”的内容并打印出来 (2分)

  表名User

  Name Tel Content Date

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

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

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

  请根据上面的题目完成代码:

  $mysql_db=mysql_connect("local","root","pass");

  @mysql_select_db("DB",$mysql_db);

    $result = mysql_query("SELECT * FROM `user` WHERE name='张三'");

    while($rs = mysql_fetch_array($result)){

      echo $rs["tel"].$rs["content"].$rs["date"];

    }  

34、如何使用下面的类,并解释下面什么意思?(3)

  class test{

     function Get_test($num){

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

      return $num;

   }

  }

答:$testnum = "123";

   $object = new test();

   $encrypt = $object->Get_test($testnum);

   echo $encrypt;

   类test里面包含Get_test方法,实例化类调用方法多字符串加密

35、写出 SQL语句的格式 : 插入 ,更新 ,删除 (4分)

  表名User

  Name Tel Content Date

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

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

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

  (a) 有一新记录(小王 13254748547 高中毕业 2007-05-06)请用SQL语句新增至表中

    mysql_query("INSERT INTO `user` (name,tel,content,date) VALUES

    ('小王','13254748547','高中毕业','2007-05-06')")

  (b) 请用sql语句把张三的时间更新成为当前系统时间

    $nowDate = date("Ymd");

    mysql_query("UPDATE `user` SET date='".$nowDate."' WHERE name='张山'");

  (c) 请写出删除名为张四的全部记录

    mysql_query("DELETE FROM `user` WHERE name='张四'");

36、请写出数据类型(int char varchar datetime text)的意思; 请问varchar和char有什么区别(2分)

答:int是数字类型,char固定长度字符串,varchar实际长度字符串,datetime日期时间型,text文本字符串

   char的场地固定为创建表设置的长度,varchar为可变长度的字符

38、写出以下程序的输出结果 (1分)

  $b=201;

  $c=40;

    $a=$b>$c?4:5;

  echo $a;

  ?>

答:4

39、检测一个变量是否有设置的函数是否?是否为空的函数是?(2分)

答:isset($str),empty($str);

40、取得查询结果集总数的函数是?(1分)

答:mysql_num_rows($result);

41、$arr = array('james', 'tom', 'symfony'); 请打印出第一个元素的值 (1分)

答:echo $array[0];

42、请将41题的数组的值用','号分隔并合并成字串输出(1分)

答:for($i=0;$i<count($array);$i++){ echo $array[$i].",";}

43、$a = 'abcdef'; 请取出$a的值并打印出第一个字母(1分)

答:echo $a{0} 或 echo substr($a,0,1)

44、PHP可以和sql server/oracle等数据库连接吗?(1分)

答:当然可以

45、请写出PHP5权限控制修饰符(3分)

答:public(公共),private(私用),protected(继承)

46、请写出php5的构造函数和析构函数(2分)

答:__construct , __destruct

47、完成以下:

   (一)创建新闻发布系统,表名为message有如下字段 (3分)

  id 文章id

  title 文章标题

  content 文章内容

  category_id 文章分类id

    hits 点击量

答:CREATE TABLE 'message'(

   'id' int(10) NOT NULL auto_increment,

   'title' varchar(200) default NULL,

   'content' text,

   'category_id' int(10) NOT NULL,

   'hits' int(20),

   PRIMARY KEY('id');

   )ENGINE=InnoDB DEFAULT CHARSET=utf8;

    (二)同样上述新闻发布系统:表comment记录用户回复内容,字段如下 (4分)

  comment_id 回复id

  id 文章id,关联message表中的id

  comment_content 回复内容

  现通过查询数据库需要得到以下格式的文章标题列表,并按照回复数量排序,回复最高的排在最前面

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

  用一个SQL语句完成上述查询,如果文章没有回复则回复数量显示为0

答:SELECT message.id id,message.title title,IF(message.`hits` IS NULL,0,message.`hits`) hits,

   IF(comment.`id` is NULL,0,count(*)) number FROM message LEFT JOIN

   comment ON message.id=comment.id GROUP BY message.`id`;

  (三)上述内容管理系统,表category保存分类信息,字段如下 (3分)

  category_id int(4) not null auto_increment;

  categroy_name varchar(40) not null;

  用户输入文章时,通过选择下拉菜单选定文章分类

  写出如何实现这个下拉菜单

答:function categoryList()

{

    $result=mysql_query("select category_id,categroy_name from category")

            or die("Invalid query: " . mysql_error());

    print("<select name='category' value=''>/n");

    while($rowArray=mysql_fetch_array($result))

    {

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

    }

    print("</select>");

}

编程题:

1. 写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名

   例如: http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出 php 或 .php

答案1:

   function getExt($url){

   $arr = parse_url($url);

 

   $file = basename($arr['path']);

   $ext = explode(".",$file);

   return $ext[1];

}

答案2:

    function getExt($url) {

    $url = basename($url);

    $pos1 = strpos($url,".");

    $pos2 = strpos($url,"?");

    if(strstr($url,"?")){

         return substr($url,$pos1 + 1,$pos2 - $pos1 - 1);

    } else {

      return substr($url,$pos1);

    }

}

2. 在 HTML 语言中,页面头部的 meta 标记可以用来输出文件的编码格式,以下是一个标准的 meta 语句

  请使用 PHP 语言写一个函数,把一个标准 HTML 页面中的类似 meta 标记中的 charset 部分值改为 big5

  请注意:

  1. 需要处理完整的 html 页面,即不光此 meta 语句

  2. 忽略大小写

    3. ' 和 " 在此处是可以互换的

    4. 'Content-Type' 两侧的引号是可以忽略的,但 'text/html; charset=gbk' 两侧的不行

  5. 注意处理多余空格

3. 写一个函数,算出两个文件的相对路径

  如 $a = '/a/b/c/d/e.php';

  $b = '/a/b/12/34/c.php';

  计算出 $b 相对于 $a 的相对路径应该是 ../../c/d将()添上

答:function getRelativePath($a, $b) { 

    $returnPath = array(dirname($b)); 

    $arrA = explode('/', $a); 

    $arrB = explode('/', $returnPath[0]); 

    for ($n = 1, $len = count($arrB); $n < $len; $n++) { 

        if ($arrA[$n] != $arrB[$n]) { 

            break; 

        }  

    } 

    if ($len - $n > 0) { 

        $returnPath = array_merge($returnPath, array_fill(1, $len - $n, '..')); 

    } 

     

    $returnPath = array_merge($returnPath, array_slice($arrA, $n)); 

    return implode('/', $returnPath); 

   } 

   echo getRelativePath($a, $b);

填空题:

1.在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量__$_SERVER['PHP_SELF']__中;而链接到当前页面的URL记录在预定义变量__$_SERVER['HTTP_REFERER']__



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

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

4.数组函数 arsort 的作用是__对数组进行逆向排序并保持索引关系__;语句 error_reporting(2047)的作用是__报告所有错误和警告__。

5.PEAR中的数据库连接字符串格式是____。

6.写出一个正则表达式,过虑网页上的所有JS/VBS脚本(即把scrīpt标记及其内容都去掉):preg_replace(" /<script[^>].*?>.*?</script>/si", "newinfo", $script);

7.以Apache模块的方式安装PHP,在文件http.conf中首先要用语句____动态装载PHP模块,然后再用语句____使得Apache把所有扩展名为php的文件都作为PHP脚本处理。

  LoadModule php5_module "c:/php/php5apache2.dll" , AddType application/x-httpd-php .php,

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

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

10.一个函数的参数不能是对变量的引用,除非在php.ini中把__allow_call_time_pass_reference boolean__设为on.

11.SQL中LEFT JOIN的含义是__自然左外链接__。如果 tbl_user记录了学生的姓名(name)和学号(ID),tbl_score记录了学生(有的学生考试以后被开除了,没有其记录)的学号(ID)

和考试成绩(score)以及考试科目(subject),要想打印出各个学生姓名及对应的的各科总成绩,则可以用SQL语句____。

12.在PHP中,heredoc是一种特殊的字符串,它的结束标志必须____。

编程题:

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

答:

function my_scandir($dir)

{

     $files = array();

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

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

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

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

                     $files[$file] = scandir($dir . "/" . $file);

                 }else {

                     $files[] = $file;

                 }

             }

         }

         closedir($handle);

         return $files;

     }

}

14.简述论坛中无限分类的实现原理。

答:

<?php

/*

数据表结构如下:

CREATE TABLE `category` (

 `categoryID` smallint(5) unsigned NOT NULL auto_increment,

 `categoryParentID` smallint(5) unsigned NOT NULL default '0',

 `categoryName` varchar(50) NOT NULL default '',

 PRIMARY KEY (`categoryID`)

) ENGINE=MyISAM DEFAULT CHARSET=gbk;

INSERT INTO `category` ( `categoryParentID`, `categoryName`) VALUES

(0, '一级类别'),

(1, '二级类别'),

(1, '二级类别'),

(1, '二级类别'),

(2, '三级类别'),

(2, '333332'),

(2, '234234'),

(3, 'aqqqqqd'),

(4, '哈哈'),

(5, '66333666');

*/

//指定分类id变量$category_id,然后返回该分类的所有子类

//$default_category为默认的选中的分类

function Get_Category($category_id = 0,$level = 0, $default_category = 0)

{

 global $DB;

 $sql = "SELECT * FROM category ORDER BY categoryID DESC";

 $result = $DB->query( $sql );

 while ($rows = $DB->fetch_array($result))

 {

 $category_array[$rows[categoryParentID]][$rows[categoryID]] = array('id' => $rows[categoryID], 'parent' => $rows[categoryParentID], 'name' => $rows

[categoryName]);

 }

 if (!isset($category_array[$category_id]))

 {

 return "";

 }

 foreach($category_array[$category_id] AS $key => $category)

 {

 if ($category['id'] == $default_category)

 {

 echo "<option selected value=".$category['id']."";

 }else

 {

 echo "<option value=".$category['id']."";

 }

 if ($level > 0)

 {

 echo ">" . str_repeat( " ", $level ) . " " . $category['name'] . "</option>/n";

 }

 else

 {

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

 }

 Get_Category($key, $level + 1, $default_category);

 }

 unset($category_array[$category_id]);

}

/*

函数返回的数组格式如下所示:

Array

(

 [1] => Array ( [id] => 1 [name] => 一级类别 [level] => 0 [ParentID] => 0 )

 [4] => Array ( [id] => 4 [name] => 二级类别 [level] => 1 [ParentID] => 1 )

 [9] => Array ( [id] => 9 [name] => 哈哈 [level] => 2 [ParentID] => 4 )

 [3] => Array ( [id] => 3 [name] => 二级类别 [level] => 1 [ParentID] => 1 )

 [8] => Array ( [id] => 8 [name] => aqqqqqd [level] => 2 [ParentID] => 3 )

 [2] => Array ( [id] => 2 [name] => 二级类别 [level] => 1 [ParentID] => 1 )

 [7] => Array ( [id] => 7 [name] => 234
b670
234 [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>";

?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息