分享30个基础的php面试题及答案(对新手非常有用)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分享30个基础的php面试题及答案(对新手非常有用)相关的知识,希望对你有一定的参考价值。
题1:设计一个网页,使得打开它时弹出一个全屏的窗口,该窗口中有一个文本框和一个按钮。用户在文本框中输入信息后点击按钮就可以把窗口关闭,而输入的信息却在主网页中显示!
答案:尼玛。都没明白出这题目是干嘛的,新浪工程师脑子进水了吗?考察js的window对象?亲们告诉我?
index.html
1 <html> 2 <head> 3 <title>by http://www.manongjc.com</title> 4 </head> 5 <body> 6 <h1></h1> 7 <script type="text/javascript"> 8 open(‘manongjc.html‘); 9 </script> 10 </body> 11 </html>
fullwin.html
1 <html> 2 <head> 3 <title>by www.manongjc.com</title> 4 </head> 5 <body> 6 <!-- http://www.manongjc.com/article/1524.html --> 7 <script type="text/javascript"> 8 window.moveTo(0, 0); 9 window.resizeTo(window.screen.width, window.screen.height); 10 var s = prompt(‘请输入:‘); 11 window.opener.document.getElementsByTagName(‘h1‘)[0].innerText = s; 12 window.close(); 13 </script> 14 </body> 15 </html>
题2:nginx使用哪种网络协议?
答案:nginx是应用层 我觉得从下往上的话 传输层用的是tcp/ip 应用层用的是http fastcgi负责调度进程
题3:表单中 get与post提交方法的区别?
答案:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息。
题4:简述论坛中无限分类的实现原理
答案:无限极分类,那么应该是考察递归函数吧!
第一步:建立测试数据库:
1 CREATE TABLE `category` ( 2 `id` smallint(5) unsigned NOT NULL auto_increment, 3 `fid` smallint(5) unsigned NOT NULL default ‘0‘, 4 `value` varchar(50) NOT NULL default ‘‘, 5 PRIMARY KEY (`id`) 6 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
第二步:插入测试数据:
1 INSERT INTO `category` ( `fid`, `value`) VALUES 2 (0, ‘码农教程http://www.manongjc.com‘), 3 (1,‘a‘), 4 (1,‘b‘), 5 (2,‘c‘), 6 (2,‘d‘), 7 (4,‘e‘)
第三步:递归输出分类:
1 <?php 2 /** by http://www.manongjc.com/article/1524.html */ 3 $conn = mysql_connect("localhost", "root", "mckee"); 4 mysql_select_db("test",$conn); 5 mysql_query("set names utf8"); 6 $sql = "SELECT * FROM category"; 7 $res = mysql_query($sql); 8 while($row = mysql_fetch_assoc($res)){ 9 $arr[] = array($row[id],$row[fid],$row[value]); 10 } 11 getCate(0); 12 function getCate($fid = 0) { 13 global $arr; 14 for ($i = 0; $i < count($arr); $i++) { 15 if ($arr[$i][1] == $fid) { 16 echo $arr[$i][2] . "<br>"; 17 getCate($arr[$i][0]); //递归 18 } 19 } 20 } 21 ?>
题5:请用正则表达式(Regular Expression)写一个函数验证电子邮件的格式是否正确
答案:
1 <?php 2 /* http://www.manongjc.com/article/1524.html */ 3 $email=$_POST[‘email‘]; 4 if(!preg_match(‘/^[\w.][email protected]([\w.]+)\.[a-z]{2,6}$/i’,$email)) { 5 echo "电子邮件检测失败"; 6 }else{ 7 echo "电子邮件检测成功"; 8 } 9 ?>
题6:session与cookie的区别?
答案:
session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放.
cookie:用来存储连续訪問一个頁面时所使用,是存储在客户端,对于Cookie来说是存储在用户WIN的Temp目录中的。
两者都可通过时间来设置时间长短.
题7:请用最简单的语言告诉我PHP是什么?
答案:PHP全称:Hypertext Preprocessor,是一种用来开发动态网站的服务器脚本语言。
题8:<? echo ‘hello tusheng‘ ; ?> 没有输出结果, 可能是什么原因, 简述的解决此问题的过程(提示: 语法没有问题)
答案:可能服务器上面没有开启短标签short_open_tag =设置为Off,,php.ini开启短标签控制参数: short_open_tag = On
题9:数据库中的事务是什么?
答案:事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。
题9:写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。
答案: 这个我之前就写过(php opendir()函数讲解及遍历目录实例),只是实现的方法很多,效率不一定最高
1 /* 2 *@blog http://www.manongjc.com 3 */ 4 function listDir($dir = ‘.‘){ 5 if ($handle = opendir($dir)) { 6 while (false !== ($file = readdir($handle))) { 7 if($file == ‘.‘ || $file == ‘..‘){ 8 continue; 9 } 10 if(is_dir($sub_dir = realpath($dir.‘/‘.$file))){ 11 echo ‘FILE in PATH:‘.$dir.‘:‘.$file.‘<br>‘; 12 listDir($sub_dir); 13 }else{ 14 echo ‘FILE:‘.$file.‘<br>‘; 15 } 16 } 17 closedir($handle); 18 } 19 } 20 listDir(‘e:\www\abc‘);
题10:用最少的代码写一个求3值最大值的函数.
答案:
1 function($a,$b,$c){ 2 /* www.manongjc.com/article/1524.html */ 3 return $a>$b? ($a>$c? $a : $c) : ($b>$c? $b : $c ); 4 }
题11:简述下面程序的输出结果, 简要说明为什么, 如何解决这类问题?
1 <?php 2 $tmp = 0 == "a"? 1: 2; 3 echo $tmp; 4 ?>
答案: 1
int和string类型强制转换造成的,0==="a"
0 == 0 肯定是true啊
PHP是弱类型
$tmp = 0 === "a"? 1: 2;
echo $tmp; 这样就是2
题12:什么是MVC?
答案:MVC由Model(模型), View(视图)和Controller(控制器)组成,PHP MVC可以更高效地管理好3个不同层的PHP代码。
Model:数据信息存取层。
View:view层负责将应用的数据以特定的方式展现在界面上。
Controller:通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
题13:优化MYSQL数据库的方法?
答案:
1、选取最适用的字段属性,尽可能减少定义字段长度,尽量把字段设置NOT NULL,例如‘省份,性别‘,最好设置为ENUM
2、使用连接(JOIN)来代替子查询:
a.删除没有任何订单客户:DELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
b.提取所有没有订单客户:SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
c.提高b的速度优化:SELECT FROM customerinfo LEFT JOIN orderid customerinfo.customerid=orderinfo.customerid
WHERE orderinfo.customerid IS NULL
3、使用联合(UNION)来代替手动创建的临时表
a.创建临时表:SELECT name FROM `nametest` UNION SELECT username FROM `nametest2`
4、事务处理:
a.保证数据完整性,例如添加和修改同时,两者成立则都执行,一者失败都失败
mysql_query("BEGIN");
mysql_query("INSERT INTO customerinfo (name) VALUES (‘$name1‘)";
mysql_query("SELECT * FROM `orderinfo` where customerid=".$id");
mysql_query("COMMIT");
5、锁定表,优化事务处理:
a.我们用一个 SELECT 语句取出初始数据,通过一些计算,用 UPDATE 语句将新值更新到表中。
包含有 WRITE 关键字的 LOCK TABLE 语句可以保证在 UNLOCK TABLES 命令被执行之前,
不会有其它的访问来对 inventory 进行插入、更新或者删除的操作
mysql_query("LOCK TABLE customerinfo READ, orderinfo WRITE");
mysql_query("SELECT customerid FROM `customerinfo` where id=".$id);
mysql_query("UPDATE `orderinfo` SET ordertitle=‘$title‘ where customerid=".$id);
mysql_query("UNLOCK TABLES");
6、使用外键,优化锁定表
a.把customerinfo里的customerid映射到orderinfo里的customerid,
任何一条没有合法的customerid的记录不会写到orderinfo里
CREATE TABLE customerinfo
(
customerid INT NOT NULL,
PRIMARY KEY(customerid)
)TYPE = INNODB;
CREATE TABLE orderinfo
(
orderid INT NOT NULL,
customerid INT NOT NULL,
PRIMARY KEY(customerid,orderid),
FOREIGN KEY (customerid) REFERENCES customerinfo
(customerid) ON DELETE CASCADE
)TYPE = INNODB;
注意:‘ON DELETE CASCADE‘,该参数保证当customerinfo表中的一条记录删除的话同时也会删除order
表中的该用户的所有记录,注意使用外键要定义事务安全类型为INNODB;
7、建立索引:
a.格式:
(普通索引)->
创建:CREATE INDEX <索引名> ON tablename (索引字段)
修改:ALTER TABLE tablename ADD INDEX [索引名] (索引字段)
创表指定索引:CREATE TABLE tablename([...],INDEX[索引名](索引字段))
(唯一索引)->
创建:CREATE UNIQUE <索引名> ON tablename (索引字段)
修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引字段)
创表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引字段))
(主键)->
它是唯一索引,一般在创建表是建立,格式为:
CREATA TABLE tablename ([...],PRIMARY KEY[索引字段])
8、优化查询语句
a.最好在相同字段进行比较操作,在建立好的索引字段上尽量减少函数操作
例子1:
SELECT * FROM order WHERE YEAR(orderDate)<2008;(慢)
SELECT * FROM order WHERE orderDate<"2008-01-01";(快)
例子2:
SELECT * FROM order WHERE addtime/7<24;(慢)
SELECT * FROM order WHERE addtime<24*7;(快)
例子3:
SELECT * FROM order WHERE title like "%good%";
SELECT * FROM order WHERE title>="good" and name<"good";题14:写一个函数,算出两个文件的相对路径
如 $a = ‘/a/b/c/d/e.php‘;
$b = ‘/a/b/12/34/c.php‘;
计算出 $b 相对于 $a 的相对路径应该是 ../../c/d将()添上答案:
1 <?php 2 /** by www.manongjc.com */ 3 $a = ‘/a/b/c/d/e.php‘; 4 $b = ‘/a/b/13/34/c.php‘; 5 echo getRelativePath($a, $b); //"../../12/34/" 6 function getRelativePath($a,$b){ 7 $a2array = explode(‘/‘, $a); 8 $b2array = explode(‘/‘, $b); 9 $relativePath = ‘‘; 10 for( $i = 1; $i <= count($b2array)-2; $i++ ) { 11 $relativePath .= $a2array[$i] == $b2array[$i] ? ‘../‘ : $b2array[$i].‘/‘; 12 } 13 return $relativePath; 14 } 15 ?>
题15:javascript能否定义二维数组,如果不能你如何解决?
答案:javascript不支持二维数组定义,可以用arr[0] = new array()来解决
题16:MYSQL取得当前时间的函数是?,格式化日期的函数是
答案:now(),dateformat()
题17:下列HTTP状态码出现的可能原因, 如何处理
200, 301, 404, 502, 503
答案:
- 200 请求已成功,请求所希望的响应头或数据体将随此响应返回。
- 301 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。
- 404 请求失败,请求所希望得到的资源未被在服务器上发现。
- 502 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
- 503 由于临时的服务器维护或者过载,服务器当前无法处理请求。
- 200 OK 一切正常,对GET和POST请求的应答文档跟在后面。
题18:在页面中引用CSS有几种方式?
答案:
在页面中使用CSS有3中方式:
- 引用外部CSS文件
- 内部定义Style样式
- 内联样式
题19:在 HTML 语言中,页面头部的 meta 标记可以用来输出文件的编码格式,以下是一个标准的 meta 语句
<META http-equiv=‘Content-Type‘ content=‘text/html; charset=gbk‘>
请使用 PHP 语言写一个函数,把一个标准 HTML 页面中的类似 meta 标记中的 charset 部分值改为 big5
请注意:
- 需要处理完整的 html 页面,即不光此 meta 语句
- 忽略大小写
- ‘ 和 " 在此处是可以互换的
- ‘Content-Type‘ 两侧的引号是可以忽略的,但 ‘text/html; charset=gbk‘ 两侧的不行
- 注意处理多余空格
答案:主要考察正则表达式
1 <?php 2 /** http://www.manongjc.com/article/1524.html */ 3 $html = "<meta http-equiv=‘Content-Type‘ content=‘text/html; charset=gbk‘>"; 4 //匹配标准的meta标签 5 $pattern = "/<meta\s+http-equiv=(\‘|\")?Content-Type(\‘|\")?\s+content=(\‘|\")text\/html;\s+charset=(.*)(\‘|\")>/i"; 6 $replacement = "<meta http-equiv=‘Content-Type‘ content=‘text/html; charset=big5‘>"; 7 $result = preg_replace($pattern, $replacement, $html); 8 echo htmlspecialchars($result); 9 ?>
题20:假设a.html和b.html在同一个文件夹下面,用javascript实现当打开a.html五秒钟后,自动跳转到b.html。
答案:
1 /** http://www.manongjc.com/article/1524.html */ 2 function go2b(){ 3 window.location = “b.html”; 4 window.close(); 5 } 6 setTimeout( “go2b()”,5000 ); //5秒钟后自动执行go2b()
题21:简述两种屏蔽php程序的notice警告的方法
答案:
- 在程序中添加:error_reporting (E_ALL & ~E_NOTICE);
- 修改php.ini中的:error_reporting = E_ALL 改为:error_reporting = E_ALL & ~E_NOTICE
- error_reporting(0);或者修改php.inidisplay_errors=Off
题22:PHP支持多继承吗?为什么?
答案:不支持。PHP类只能继承一个父类,并用关键字“extended”标识。
题23:include和require 分别返回什么错误级别
答案:include会系统警告并继续执行,require会发出系统警告但是会引致致命错误令脚本终止运行
题24:用PHP写出显示客户端IP与服务器IP的代码
答案:
打印客户端IP:echo $_SERVER[‘REMOTE_ADDR’]; 或者: getenv(‘REMOTE_ADDR’);
打印服务器IP:echo gethostbyname(“www.bolaiwu.com”)题25:写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名
例如: http://www.manongjc.com/article/1524.html?id=1 需要取出 html或 .html
答案:
1 <?php 2 /** by www.manongjc.com */ 3 $url = "http://www.manongjc.com/article/1524.html?id=1"; 4 $path = parse_url($url); 5 echo pathinfo($path[‘path‘],PATHINFO_EXTENSION); //php 6 ?>
题26:PHP中获取图像尺寸大小的方法是什么?
答案:
getimagesize () 获取图片的尺寸
Imagesx () 获取图片的宽度
Imagesy () 获取图片的高度
题27:如何修改SESSION的生存时间
答案:
方法1:将php.ini中的session.gc_maxlifetime设置为9999重启apache
方法2:$savePath = “./session_save_dir/”;1 $lifeTime = 小时 * 秒; 2 session_save_path($savePath); 3 session_set_cookie_params($lifeTime); 4 session_start();
方法3:setcookie() and session_set_cookie_params($lifeTime);
题28:写一个排序算法,可以是冒泡排序或者是快速排序,假设待排序对象是一个维数组
答案:
冒泡排序(数组排序):
1 function bubble_sort($array) 2 { 3 $count = count($array); 4 if ($count <= 0) return false; 5 for($i=0; $i<$count; $i++){ 6 for($j=$count-1; $j>$i; $j–){ 7 if ($array[$j] < $array[$j-1]){ 8 $tmp = $array[$j]; 9 $array[$j] = $array[$j-1]; 10 $array[$j-1] = $tmp; 11 } 12 } 13 } 14 return $array; 15 }
快速排序(数组排序):
1 function quicksort($array) { 2 if (count($array) <= 1) return $array; 3 $key = $array[0]; 4 $left_arr = array(); 5 $right_arr = array(); 6 for ($i=1; $i<count($array); $i++){ 7 if ($array[$i] <= $key) 8 $left_arr[] = $array[$i]; 9 else 10 $right_arr[] = $array[$i]; 11 } 12 $left_arr = quicksort($left_arr); 13 $right_arr = quicksort($right_arr); 14 return array_merge($left_arr, array($key), $right_arr); 15 }
题29:PHP中的错误类型有哪些?
答案:
PHP中遇到的错误类型大致有3类。
- 提示:这都是一些非常正常的信息,而非重大的错误,有些甚至不会展示给用户。比如访问不存在的变量。
- 警告:这是有点严重的错误,将会把警告信息展示给用户,但不会影响代码的输出,比如包含一些不存在的文件。
- 错误:这是真正的严重错误,比如访问不存在的PHP类。
题30:求两个日期的差数,例如2016-2-5 ~ 2016-3-6 的日期差数
答案:
方法一:
1 <?php 2 /* http://www.manongjc.com/article/1524.html */ 3 class Dtime 4 { 5 function get_days($date1, $date2){ 6 $time1 = strtotime($date1); 7 $time2 = strtotime($date2); 8 return ($time2-$time1)/86400; 9 } 10 } 11 12 $Dtime = new Dtime; 13 14 echo $Dtime->get_days(’2016-2-5′, ’2016-3-6′); 15 16 ?>
方法二:
1 <?php 2 /* http://www.manongjc.com/article/1524.html */ 3 $temp = explode(‘‘-‘, ’2016-2-5′); 4 $time1 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]); 5 $temp = explode(‘-‘, ’2016-3-6′); 6 $time2 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]); 7 echo ($time2-$time1)/86400; 8 ?>
方法三:
/* http://www.manongjc.com */ echo abs(strtotime("2016-2-1″)-strtotime("2016-3-1″))/60/60/24
原文地址 http://www.manongjc.com/article/1524.html
以上是关于分享30个基础的php面试题及答案(对新手非常有用)的主要内容,如果未能解决你的问题,请参考以下文章
宅家30天,吃透这份测试工程师面试700道题解析,成功定级阿里P7