PHP常见面试题及答案
PHP面试题及答案
用PHP打印出前一天的时间,格式是2006-5-10 22:21:21
echo date("Y:m:d H:i:s",strtotime("-1 day"));
?>
2,echo(),print(),print_r()的区别
echo是语言结构,无返回值;print功能和echo基本相同,不同的是print是函数,有返回值;print_r是递归打印,用于输出数组对象
3,能够使HTML和PHP分离开使用的模板
smarty, PHPLib, FastTemplate, Savant,MiniTemplator,TagTemplate
4,如何实现PHP、JSP交互
$foo = new Java(’java.lang.System’);
5,使用哪些工具进行版本控制
CVS或SVN
CVS Server on Apache作服务端,WinCVS作客户端
Subversion on Apache/DAV 做服务端,TortoiseSVN做客户端
6,如何实现字符串翻转
$str=strrev("Wilson Peng");
echo $str;
?>
7,优化MYSQL数据库的方法
(1)选取最适用的字段属性,尽可能减少定义字段长度,尽量把字段设置NOT NULL,例如’省份,性别’,最好设置为ENUM
(2)使用连接(JOIN)来代替子查询:
(3)使用联合(UNION)来代替手动创建的临时表
(4)事务处理:
保证数据完整性,例如添加和修改同时,两者成立则都执行,一者失败都失败
mysql_query(”BEGIN”);
mysql_query(”INSERT INTO customerinfo (name) VALUES (’$name1′)”;
mysql_query(”SELECT * FROM `orderinfo` where customerid=”.$id”);
mysql_query(”COMMIT”);
(5)锁定表,优化事务处理:
我们用一个 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)使用外键,优化锁定表
(7)建立索引:
(8)优化查询语句
最好在相同字段进行比较操作,在建立好的索引字段上尽量减少函数操作
SELECT * FROM order WHERE YEAR(orderDate)<2008;(慢)
SELECT * FROM order WHERE orderDate<"2008-01-01";(快)
SELECT * FROM order WHERE addtime/7<24;(慢)
SELECT * FROM order WHERE addtime<24*7;(快)
SELECT * FROM order WHERE title like "%good%";
SELECT * FROM order WHERE title>=”good” and name<"good";
8,实现中文字串截取无乱码的方法
$str = "我是一串比较长的中";
echo "mb_substr:" . mb_substr($str, 0, 6, "utf-8");
echo "mb_strcut:" . mb_strcut($str, 0, 6, "utf-8");
?>
mb_substr:我是一串比较
mb_strcut:我是
mb_substr是按字来切分字符,而mb_strcut是按字节来切分字符,但是都不会产生半个字符的现象
9,用PHP写出显示客户端IP与服务器IP的代码
echo $_SERVER[‘REMOTE_ADDR’];
getenv("REMOTE_ADDR");
//客户端IP
$ip=gethostbyname ("www.murray.cn");
//服务器IP
echo $ip;
?>
10,在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量中;而链接到当前页面的URL记录在预定义变量中
echo $_SERVER["PHP_SELF"];
echo $_SERVER["HTTP_REFERER"];
11,
$null = NULL;
$bool = FALSE;
$notSet;
$array = array();
//以下是问题
$a = "hello";
$b = &$a;
unset($b);
//答案为:hello
echo $a;
$b = "world";
//答案为:hello
echo $a;
//以下是问题
$a = 1;
$x = &$a;
$b = $a++;
//答案为:1
echo $b;
//以下是问题
$x = empty($array);
//答案为:1
echo $x;
//答案为:true
echo $x?"true":"false";
?>
12,表单中 get与post提交方法的区别
get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息
13,session与cookie的区别
session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放
cookie:用来存储连续訪問一个頁面时所使用,是存储在客户端,对于Cookie来说是存储在用户WIN的Temp目录中的。
两者都可通过时间来设置时间长短
14,数据库中的事务是什么
事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消
15,MYSQL取得当前时间的函数是 now()
格式化日期的函数是 date()
16,语句include和require的区别是什么
require->require是无条件包含也就是如果一个流程里加入require,无论条件成立与否都会先执行require
include->include有返回值,而require没有(可能因为如此require的速度比include快)
17,如何修改SESSION的生存时间
将php.ini中的session.gc_maxlifetime设置为9999重启apache
或:$savePath = “./session_save_dir/”;
$lifeTime = 小时 * 秒;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
18,有一个网页地址,比如http://www.murray.cn/,如何得到它的内容
$readcontents = fopen(”http://www.murray.cn/”, “rb”);
$contents = stream_get_contents($readcontents);
fclose($readcontents);
echo $contents;
或
echo file_get_contents(”http://www.murray.cn/”);
19,在HTTP 1.0中,状态码401的含义是 未被授权
如果返回“找不到文件”的提示,则可用 header 函数,其语句为 header(”Location:www.murray.cn”);
20,在PHP中,heredoc是一种特殊的字符串,它的结束标志必须
heredoc的语法是用”<<<"加上自己定义成对的标签,在标签范围內的文字视为一个字符串
例子:
$str = << my name is Jiang Qihui!
murray;
21,请说明php中传值与传引用的区别。什么时候传值什么时候传引用?
按值传递:函数范围内对值的任何改变在函数外部都会被忽略
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。
按引用传递则不需要复制值,对于性能提高很有好处。
22,在PHP中error_reporting这个函数有什么作用
设置错误级别与错误信息回报
23,请写一个函数验证电子邮件的格式是否正确
$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);
24,如何得到当前执行脚本路径,包括所得到参数
$script_name = basename(__file__);
print_r($script_name);
25,JS表单弹出对话框函数是
alert(),prompt(),confirm();
获得输入焦点函数是focus();
26,如何声明一个名为”myclass”的没有方法和属性的类
class myclass{ }
如何实例化一个名为”myclass”的对象
new myclass()
如何访问和设置一个类的属性
$object = new myclass();
$newstr = $object->test;
$object->test = “info”;
27,可以打开一个文件,以对文件进行读和写操作: fopen()
28,$num = 10;
function multiply(){
$num = $num * 10;
}
multiply();
echo $num;
//输出:10
29,写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名
function getExt($url){
$arr = parse_url($url);
$file = basename($arr["path"]);
$ext = explode(”.”,$file);
return $ext[1];
}
30,PHP5权限控制修饰符
public(公共),private(私用),protected(继承)
常见的PHP面试题及答案
1.$array['anykey']和$array[anykey]的区别?
答:单引号和没有单引号区别,就是字符串和常量。而单引号和双引号的区别,就是字符串和变量吧。
不加单引号的话,php会首先认为他是常量,然后去搜寻是否存在这个常量,若不存在,则理解为字符串,所以在效率上就慢了。
2.echo 输出语句时候的连接符号: "." 和 ","。点号和逗号的区别?
答:echo用点号时先把语句连接再输出,而用逗号就等于给它传多个参数,不需要进行字符串拼接这一步,效率高!
3.echo,print,print_r的区别?
答:echo,直接输出单个或者多个字符串,是PHP语句!
print,打印输出简单类型,是PHP函数!有整型返回值。我试验了下,都返回1。
print_r,格式化打印输出,常用于比较复杂的类型,如数组,对象之类的,可以输出完整结构,是PHP函数,返回值类型为布尔型!
6.优化MySQL数据库的方法?
答:①选取最适用的字段属性。
②是用连接(JOIN)来代替子查询(Sub-Queries)。
③是用联合(UNION)来代替手动创建的临时表。
④事务
⑤锁定表
⑥使用外键
⑦使用索引
⑧优化的查询语句
上面8条优化的详细说明请点击该链接查看完全优化MySQL数据库性能的八大巧方法
7.PHP的意思?(送一分)
答:Hypertext preprocessor 超文本预处理语言。(汗!我google了才知道滴。。送一分都得不到啊,撞墙!!)
8.MYSQL取得当前时间的函数是?格式化日期的函数是?
答:当前日期函数为 NOW();
格式化日期函数是:
SELECT DATE_FORMAT('2009-01-11 17:25:36',"%H:%i:%s %m/%d/%Y");
->17:25:36 01/11/2009
其它时间函数:详细请查看该页面 MySql 格式化时间函数
SELECT DAYOFWEEK('1998-02-03');
->3
SELECT WEEKDAY('1997-10-04 22:23:00');
->5
SELECT WEEKDAY('1997-11-05');
->2
SELECT DAYOFMONTH('1998-02-03');
->3
SELECT DAYOFYEAR('1998-02-03');
->34
SELECT MONTH('1998-02-03');
->2
SELECT DAYNAME('1998-02-05');
->'February'
SELECT QUARTER('1998-04-01');
->2
SELECT WEEK('1998-02-20');
->7
SELECT WEEK('1998-02-20',0);
->7
SELECT WEEK('1998-02-20',1);
->8
SELECT YEAR('98-02-03');
->1998
SELECT HOUR('10:05:03');
->10
SELECT MINUTE('98-02-03 10:05:03');
->5
SELECT SECOND('10:05:03');
->3
SELECT PERIOD_ADD(9801,2);
->199803
SELECT PERIOD_DIFF(9802,199703);
->11
SELECT TO_DAYS('1997-10-07');
->729669
SELECT TO_DAYS(950501);
->728779
SELECT FROM_DAYS(729669);
->'1997-10-07'
SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00');
->875996580
SELECT FROM_UNIXTIME(875996580);
->'1997-10-04 22:23:00'
SELECT SEC_TO_TIME(2378);
->00:39:38
SELECT TIME_TO_SEC('00:39:38');
->2378
9.怎样截取中文且不出现乱码?
答:如果安装了mb扩展可使用mb_substr();
可以使用以下函数:
function cutstr($sourcestr, $startlength, $cutlength)
{
$returnstr='';
$i=0;
$n=0;
$str_length=strlen($sourcestr); //字符串的字节数
while (($n<$cutlength) and ($i<=$str_length))
{
$temp_str=substr($sourcestr,$i,1);
$ascnum=Ord($temp_str); //得到字符串中第$i位字符的ascii码
if ($ascnum>=224) { //如果ASCII位高与224,
$returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范,将3个连续的字符计为单个字符
$i=$i+3; //实际Byte计为3
$n++; //字串长度计1
} elseif ($ascnum>=192){ //如果ASCII位高与192,
$returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范,将2个连续的字符计为单个字符
$i=$i+2; //实际Byte计为2
$n++; //字串长度计1
} elseif ($ascnum>=65 && $ascnum<=90){ //如果是大写字母,
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //实际的Byte数仍计1个
$n++; //但考虑整体美观,大写字母计成一个高位字符
} else { //其他情况下,包括小写字母和半角标点符号,
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //实际的Byte数计1个
$n=$n+0.5; //小写字母和半角标点等与半个高位字符宽...
}
if ($n <= $startlength){
$returnstr = '';
continue;
}
}
if ($str_length>$cutlength){
$returnstr = $returnstr . "..."; //超过长度时在尾处加上省略号
}
return $returnstr;
}
10.对于大流量的网站,您采用什么样的方法来解决访问量问题?
答:①最根本的是服务器硬件条件。服务器硬件设备如果太差,那不管怎么优化都是徒劳!
②对数据库进行优化。主要是减少对数据库的访问量。访问过多会造成服务器CPU过度消耗,导致服务器受访能力严重下降,解决方法是是前台使用静态或者动态缓存!
③防盗链。对于Apache服务器,主要是是用model_rewrite 模块通过对URL的正则,进行限制和重定向!
④控制大文件下载。不提供超过2MB的文件下载,或使用专门的下载服务器,或者上传到web2.0共享网站上。
⑤多主机分流。将不同文件放置在不同的主机,提供镜像之类的文件下载方式。
⑥是用专业的流量分析软件。如google流量分析。对网站进行精细的流量控制!
11.用PHP写出显示客户端IP与服务器IP的代码?
答:客户端IP获取 $_SERVER['REMOTE_ADDR'];
服务端IP获取 $_SERVER['SERVER_NAME'];
12.如何修改SESSION的生存时间?
答:$lifeTime = 24*3600;
session_set_cookie_params($lifeTime);
session_start();
详细的设置请查看这篇文章:PHP对session生存时间的设置详细介绍。
13.有一个网页地址, 比如PHP研究室主页: http://www.163fly.com/index.php如何得到它的内容?
答:$src = 'http://www.163fly.com/index.php';
$file = 'D:\index.html';
①$content = file_get_contents($src);
$hfile = fopen($file,w);
$result = fwrite($hfile,$content);
②$opsrc = fopen($src,r);
$wfile = fopen($file,w);
$result = stream_copy_to_stream($opsrc,$wfile);
14.在HTTP 1.0中,状态码401的含义是?;如果返回“找不到文件”的提示,则可用 header 函数,其语句为?
答:①HTTP/1.0 401 代表:未授权。 ②可用 header("HTTP/1.0 404 Not Found");
15.在PHP中,heredoc是一种特殊的字符串,它的结束标志必须?
答:<<<标识符
......
标识符;
结束标识符前不能有任何其它字符!
4.获取前天的日期,格式如:2009-01-12 17:15:20
答:echo date('Y-m-d h:i:s',time()-2*24*60*60);
echo date('Y-m-d h:i:s',strtotime('2 days ago')); 未来几天的话把 ago 去掉就行了
5.如何将字符串翻转过来?
答:$str = '7654321';
echo strrev($str); //1234567
另一种方法:
$strlen = strlen($str);
for ($i = 1; $i <= $strlen; $i++) {
echo substr($str,-$i,1);
}
某大公司的PHP面试题
如何用php的环境变量得到一个网页地址的内容?ip地址又要怎样得到?
[php]
echo $_SERVER ['PHP_SELF'];
echo $_SERVER ['SERVER_ADDR'];
[/php]
2. 求两个日期的差数,例如2007-2-5 ~ 2007-3-6 的日期差数
[php]
$begin=strtotime('2007-2-5');
$end=strtotime('2007-3-6');
echo ($end-$begin)/(24*3600);
[/php]
3. 请写一个函数,实现以下功能:
字符串“open_door” 转换成 “OpenDoor”、”make_by_id” 转换成 ”MakeById”。
[php]
function changeStyle(& $str) {
/*$str = str_replace ( "_", " ", $str );
$str = ucwords ( $str );
$str = str_replace ( " ", "", $str );
return $str;*/
$arrStr=explode('_',$str);
foreach($arrStr as $key=>$value){
$arrStr[$key]=strtoupper(substr($value,0,1)).substr($value,1);
}
return implode('',$arrStr);
}
$s = "open_door";
echo changeStyle ( $s );
[/php]
4. 要求写一段程序,实现以下数组$arr1转换成数组$arr2:
[php]$arr1 = array (
'0' => array ('fid' => 1, 'tid' => 1, 'name' =>'Name1' ),
'1' => array ('fid' => 1, 'tid' => 2 , 'name' =>'Name2' ),
'2' => array ('fid' => 1, 'tid' => 5 , 'name' =>'Name3' ),
'3' => array ('fid' => 1, 'tid' => 7 , 'name' =>'Name4' ),
'4' => array ('fid' => 3, 'tid' => 9, 'name' =>'Name5' )
);
$arr2 = array (
'0' => array (
'0' => array ( 'tid' => 1, 'name' => 'Name1'),
'1' => array ( 'tid' => 2, 'name' => 'Name2'),
'2' => array ( 'tid' => 5, 'name' => 'Name3'),
'3' => array ( 'tid' => 7, 'name' => 'Name4')
),
'1' => array (
'0' => array ( 'tid' => 9, 'name' => 'Name5' )
)
);
<?php
$arr1 = array (
'0' => array ('fid' => 1, 'tid' => 1, 'name' =>'Name1' ),
'1' => array ('fid' => 1, 'tid' => 2 , 'name' =>'Name2' ),
'2' => array ('fid' => 1, 'tid' => 5 , 'name' =>'Name3' ),
'3' => array ('fid' => 1, 'tid' => 7 , 'name' =>'Name4' ),
'4' => array ('fid' => 3, 'tid' => 9, 'name' =>'Name5' )
);
function changeArrayStyle($arr){
foreach($arr as $key=>$value){
$result[$value['fid']][]=$value;
}
return array_values($result);
}
$arr2=changeArrayStyle($arr1);
echo "<pre>";
var_dump($arr2);
[/php]
5. 请简述数据库设计的范式及应用。
一般第3范式就足以,用于表结构的优化,这样做既可以避免应用程序过于复杂同时也避免了SQL语句过于庞大所造成系统效率低下。
ANSWER:
第一范式:若关系模式R的每一个属性是不可再分解的,再属于第一范式。
第二范式:若R属于第一范式,且所有的非码属性都完全函数依赖于码属性,则为第二范式。
第三范式:若R属于第二范式,且所有的非码属性没有一个是传递函数依赖于候选码,则属于第三范式。
6.一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数,用SQL语句及视图、存储过程分别实现。
存储过程:
[php]
DELIMITER //
create procedure proc_countNum(in columnId int,out rowsNo int)
begin
select count(*) into rowsNo from member where member_id=columnId;
end
call proc_countNum(1,@no);
select @no;
[/php]
视图:
create view v_countNum as select member_id,count(*) as countNum from member group by member_id
select countNum from v_countNum where member_id=1
7 表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
[php]select
case
when first_name>middle_name then
case when first_name>last_name then first_name
else last_name end
else
case when middle_name>last_name then middle_name else last_name
end
end as name
from member
[/php]
8请简述项目中优化sql语句执行效率的方法,从哪些方面,sql语句性能如何分析?
ANSWER: sql优化有鸟用,不如直接加索引。
9 如果模板是用smarty模板。怎样用section语句来显示一个名为$data的数组。比如:
[php]$data = array(
[0] => array( [id]=8 [name]=’name1′)
[1] => array( [id]=10 [name]=’name2′)
[2] => array( [id]=15 [name]=’name3′)
……
)[/php]
写出在模板页的代码? 若用foreach语句又要怎样显示呢?
占无答案.
10 写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。(目录操作)
[php] <?php
$d = dir(dirname(__file__));
//echo "Handle: " . $d->handle . "\n";
//echo "Path: " . $d->path . "\n";
while ( false !== ($entry = $d->read ()) ) {
echo $entry . "<br />";
}
$d->close ();
[/php]
11 两张表 city表和province表。分别为城市与省份的关系表。
city:
id City Provinceid
1 广州 1
2 深圳 1
3 惠州 1
4 长沙 2
5 武汉 3
………. 广州
province:
id Province
1 广东
2 湖南
3 湖北
……….
(1) 写一条sql语句关系两个表,实现:显示城市的基本信息。?
(2) 显示字段:城市id ,城市名, 所属省份 。
如:
Id(城市id) Cityname(城市名) Privence(所属省份)
。。。。。。。。。
。。。。。。。。。
(2)如果要统计每个省份有多少个城市,请用group by 查询出来。?
显示字段:省份id ,省份名,包含多少个城市。
ANSWER:
1.select A.id,A.Cityname,B.Province from city A,province B where A.provinceid=B.id
2.select B.id,B.Province,count(*) as num from city A,province B where A.provinceid=B.id group by B.id
12. 按照你的经验请简述软件工程进行软件开发的步骤。以下工具Rational Rose、PowerDesigner、Project、VSS或CVS、TestDirector使用过那种,有缺点是什么?
公司用dbdesigner及cvs,测试管理工具用的是Mantis
13. 请简述操作系统的线程与进程的区别。列举LINUX下面你使用过的软件?
14. 请使用伪语言结合数据结构冒泡排序法对以下一组数据进行排序 10 2 36 14 10 25 23 85 99 45。
[php]function bubble_sort(& $arr){
$number=count($arr);
for($i=0;$i<$number-1;$i++){
for($j=0;$j<$number-1-$i;$j++){
if($arr[$j]>$arr[$j+1]){
$tmp=$arr[$j];
$arr[$j]=$arr[$j+1];
$arr[$j+1]=$tmp;
}
}
}
}
$str="10 2 36 14 10 25 23 85 99 45";
$arr=explode(" ",$str);
bubble_sort($arr);
echo "<pre>";
var_dump($arr);
[/php]