PHP新手面试题集
PHP新手面试题总100分
简述题(50分)
1、用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2分)
echo date('Y-m-d H:i:s', strtotime('-1 day'));
2、echo(),print(),print_r()的区别(3分)
echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用)
print只能打印出简单类型变量的值(如int,string)
print_r可以打印出复杂类型变量的值(如数组,对象)
echo -- 输出一个或者多个字符串
3、能够使HTML和PHP分离开使用的模板(1分)
smarty,Heyes Template Class等0
常见的还有PHPLib,FastTemplate,Savant这里有个模板引擎列表:
http://www.sitepoint.com/forums/showthread.php?t=123769
5、使用哪些工具进行版本控制?(1分)
CVS和SVN,SVN号称下一代CVS,功能强大,不过CVS是老牌,市占率很高
VS Server on Apache作服务端,WinCVS作客户端;Subversion on Apache/DAV 做服务端,TortoiseSVN做客户端,或者Subclipse做客户端.
6、如何实现字符串翻转?(3分)
strrev()
不准用PHP内置的就自己写:
function strrev($str)
{
$len=strlen($str);
$newstr = '';
for($i=$len;$i>=0;$i--)
{
$newstr .= $str{$i};
}
return $newstr;
}
7、优化MYSQL数据库的方法。(4分,多写多得)
(1).选取最适用的字段属性,应该尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值。
(2).使用连接(JOIN)来代替子查询(Sub-Queries)
(3).使用联合(UNION)来代替手动创建的临时表
(4).尽量少使用 LIKE 关键字和通配符
(5).使用事务和外键
8、PHP的意思(送1分)
Hypertext Preprocessor
9、MYSQL取得当前时间的函数是?,格式化日期的函数是(2分)
now(), DATE_FORMAT(date,format)
10、实现中文字串截取无乱码的方法。(3分)
mb_substr()
11、您是否用过版本控制软件? 如果有您用的版本控制软件的名字是?(1分)
TortoiseSVN- 1.2.6 svn-1.2.3
12、您是否用过模板引擎? 如果有您用的模板引擎的名字是?(1分)
smarty
Smarty,Dwoo,TinyButStrong,Template Lite,Savant,phemplate,XTemplate
13、请简单阐述您最得意的开发之作(4分)
自由发挥
14、对于大流量的网站,您采用什么样的方法来解决访问量问题?(4分)
首先,确认服务器硬件是否足够支持当前的流量
其次,优化数据库访问。
第三,禁止外部的盗链。
第四,控制大文件的下载。
第五,使用不同主机分流主要流量
第六,使用流量分析统计软件。
15、用PHP写出显示客户端IP与服务器IP的代码1分)
//
客户端IP
function get_client_ip() {#
if(getenv('HTTP_CLIENT_IP')) {
$client_ip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR')) {
$client_ip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR')) {
$client_ip = getenv('REMOTE_ADDR');
} else {
$client_ip = $HTTP_SERVER_VAR['REMOTE_ADDR'];
}
return $client_ip;
}
//
服务器IP
function get_server_ip(){
if (isset($_SERVER)) {
if($_SERVER['SERVER_ADDR'])
$server_ip=$_SERVER['SERVER_ADDR'];
else $server_ip=$_SERVER['LOCAL_ADDR'];
} else {
$server_ip=getenv('SERVER_ADDR');
}
return $server_ip;
}
更简单的方式:
echo $_SERVER['REMOTE_ADDR'];
echo $_SERVER['SERVER_ADDR'];
16、语句include和require的区别是什么?为避免多次包含同一文件,可用(?)语句代替它们? (2分)
require()和include()除了怎样处理失败之外在各方面都完全一样。include()产生一个警告而require()则导致一个致命错误。
换句话说,如果你想在丢失文件时停止处理页面,用require()。include() 就不是这样,脚本会继续运行。
require()无论如何都会包含文件,而include()可以有选择地包含.
代替用0.
include_once
require_once
17、如何修改SESSION的生存时间(1分).
方法1:将php.ini中的session.gc_maxlifetime设置为9999重启apache
方法2: $savePath = "./session_save_dir/";
$lifeTime = 24 * 3600;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
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:
file_get_contents($url)
19、在HTTP 1.0中,状态码401的含义是(?);如果返回“找不到文件”的提示,则可用 header 函数,其语句为(?);(2分)
未授权(Unauthorized)
Header("http/1.0 403 Forbidden");
12、在PHP中,heredoc是一种特殊的字符串,它的结束标志必须?(1分)
跟起始的一样,且结束标志前也要一个换行,后面加上分号.
heredoc的语法是用"<<<"加上自己定义成对的标签,在标签范围內的文字视为一个字符串
例子:
$str = <<
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.net)自由下载。而且你可以不受限制地获得源码,甚至可以从中加进你自己需要的特色。
JSP 是Sun公司推出的新一代站点开发语言,他完全解决了目前ASP,PHP的一个通病-脚本级执行(据说PHP4 也已经在Zend 的支持下,实现编译运行).Sun 公司借助自己在Java 上的不凡造诣,将Java 从Java 应用程序 和 Java Applet 之外,又有新的硕果,就是Jsp--Java Server Page。Jsp 可以在Serverlet和JavaBean的支持下,完成功能强大的站点程序。
三者都提供在 HTML 代码中混合某种程序代码、由语言引擎解释执行程序代码的能力。但JSP代码被编译成 Servlet 并由 Java 虚拟机解释执行,这种编译操作仅在对 JSP 页面的第一次请求时发生。在 ASP 、PHP、JSP 环境下, HTML 代码主要负责描述信息的显示样式,而程序代码则用来描述处理逻辑。普通的 HTML 页面只依赖于 Web 服务器,而 ASP 、PHP、JSP 页面需要附加的语言引擎分析和执行程序代码。程序代码的执行结果被重新嵌入到HTML 代码中,然后一起发送给浏览器。 ASP 、PHP、 JSP三者都是面向 Web 服务器的技术,客户端浏览器不需要任何附加的软件支持。
14、谈谈对mvc的认识(1分)
模型(model),视图(view),控制器(controller)完成的应用程序
由模型发出要实现的功能到控制器,控制器接收组织功能传递给视图;
15、写出发贴数最多的十个人名字的SQL,利用下表:members(id,username,posts,pass,email)(2分)
select members.username
from members
order by posts DESC
limit 10
16. 请说明php中传值与传引用的区别。什么时候传值什么时候传引用?(2分)
按值传递:函数范围内对值的任何改变在函数外部都会被忽略
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。
17. 在PHP中error_reporting这个函数有什么作用? (1分)
用来配置错误信息回报的等级
18. 请写一个函数验证电子邮件的格式是否正确 (2分)
function validateEmail($email)
{
if(eregi('^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$',$email) ){
return true;
}else{
return false;
}
}
19. 简述如何得到当前执行脚本路径,包括所得到参数。(2分)
echo $_SERVER['scrīpt_FILENAME']."?".$_SERVER['QUERY_STRING'];
20.如何修改SESSION的生存时间. (1分)
setcookie()或session_set_cookie_params($lifeTime)
21、JS表单弹出对话框函数是?获得输入焦点函数是? (2分)
alert(),prompt(),confirm()
focus()
22、JS的转向函数是?怎么引入一个外部JS文件?(2分)
window.location.href
23、foo()和@foo()之间有什么区别?(1分)
@foo()控制错误输出
24、如何声明一个名为”myclass”的没有方法和属性的类? (1分)
class myclass{};
25、如何实例化一个名为”myclass”的对象?(1分)
$newmyclass = new myclass();
26、你如何访问和设置一个类的属性? (2分)
$newmyclass = new myclass();
$temp=$newmyclass->testvalue;
$newmyclass->testvalue="a";
27、mysql_fetch_row() 和mysql_fetch_array之间有什么区别? (1分)
--------------------------------------------------------------------
mysql_fetch_row -- 从结果集中取得一行作为枚举数组
mysql_fetch_array -- 从结果集中取得一行作为关联数组,或数字数组,或二者兼有
28、GD库是做什么用的? (1分)
GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片。
在网站上GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据生成报表。
29、指出一些在PHP输入一段HTML代码的办法。(1分)
print("");
echo "aaa";
30、下面哪个函数可以打开一个文件,以对文件进行读和写操作?(1分) (c)
(a) fget() (b) file_open() (c) fopen() (d) open_file()
31、下面哪个选项没有将 john 添加到users 数组中? (1分) (c)(d)
(a) $users[] = ‘john’;
(b) array_add($users,’john’);
(c) array_push($users,‘john’);
(d) $users ||= ‘john’;
32、下面的程序会输入是否?(1分)
$num = 10;
function multiply(){
$num = $num * 10;
}
multiply();
echo $num;
?>
否,局部变量
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($row=mysql_fetch_array($result))
{
echo $row['Name'].$row['Tel'].$row['Content'].$row['Date'];
echo "
";
}
34、如何使用下面的类, 并解释下面什么意思?(3)
class test{
function Get_test($num){
$num=md5(md5($num)."En");
return $num;
}
}
类test里面包含Get_test方法,实例化类调用方法多字符串加密
双重md5加密
$testObject = new test();
$encryption = $testObject->Get_test("xiaotian_ls");
----------------------------------------------------------------------------
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语句新增至表中
INSERT INTO User('Name','Tel','Content','Date') VALUES('小王','13254748547','高中毕业',' 2007-05-06 ')
(b) 请用sql语句把张三的时间更新成为当前系统时间
UPDATE User SET Date=DATE_FORMAT(NOW(),'%Y-%m-%d') WHERE Name='张三'
(c) 请写出删除名为张四的全部记录
DELETE FROM User WHERE Name='张四'
36、请写出数据类型(int char varchar datetime text)的意思; 请问varchar和char有什么区别(2分)
int 数值类型 char 固定长度字符串 varchar 可变长字符串 datetime 日期时间型 text 字符字符串
char列的长度固定为创建表时声明的长度.varchar列中的值为可变长字符串.
37、MySQ自增类型(通常为表ID字段)必需将其设为(?)字段(1分)
AUTO_INCREMENT
38、写出以下程序的输出结果 (1分)
$b=201;
$c=40;
$a=$b>$c?4:5;
echo $a;
?>
4
39、检测一个变量是否有设置的函数是否?是否为空的函数是?(2分)
isset() empty()
-----------------------------------------------------------------------------
40、取得查询结果集总数的函数是?(1分)
count()
41、$arr = array('james', 'tom', 'symfony'); 请打印出第一个元素的值 (1分)
echo $arr[0];
42、请将41题的数组的值用','号分隔并合并成字串输出(1分)
echo $arr[0].$arr[1].$arr[2]
43、$a = 'abcdef'; 请取出$a的值并打印出第一个字母(1分)
echo $a{0};
44、PHP可以和sql server/oracle等数据库连接吗?(1分)
可以
45、请写出PHP5权限控制修饰符(3分)
private protected public
46、请写出php5的构造函数和析构函数(2分)
__construct __destruct
------------------------------------------------------------------------------
47、以下请用PHPMYADMIN完成
(一)创建新闻发布系统,表名为message有如下字段 (3分)
id 文章id
title 文章标题
content 文章内容
category_id 文章分类id
hits 点击量
CREATE TABLE 'message'(
'id' int(11) NOT NULL auto_increment,
'title' varchar(200) default NULL,
'content' blob,
'category_id' int(11) default NULL,
'hits' int(11) default NULL,
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("");
}
二、PHP文件操作
1)
上述内容管理系统:用户提交内容后,系统生成静态HTML页面;写出实现的基本思路
思路:当用户第一次访问该文章的时候读取静态页面,如果文件不存在,则生成静态文件。
如果加上有效期的话,同时判断是否过期,不过期,读静态文件,过期重新生成。
生成方式:使用输出控制函数,在文件最后获取页面全部信息,并将内容写到指定的静态文件中,再此访问根据判读选择访问
详细代码略
2) 简单描述用户修改以发布内容的实现流程和基本思路
1.从数据库获取改文章的信息,对应显示
2.再进行内容修改,修改完毕,update文章内容即可
一写出以下程序的输出结果
var $empty = '';
var $null = NULL;
var $bool = FALSE;
var $notSet;
var $array = array();
1.
$a = "hello";
$b = &$a;
unset($b);
$b = "world";
what is $a?
$a的结果是hello
2.
$a = 1;
$x = &$a;
$b = $a++;
what is $b?
$b的值为1;考的是前加与后加的问题
3.
$x = empty($array);
what is $x? true or false
true
4.
$b=201;
$c=40;
$a=$b>$c?4:5;
echo $a;
?>
4
5.
$str="cd";
$$str="hotdog";
$$str.="ok";
echo $cd;
?>sunny ok
一. 简答题
1. 请说明php中传值与传引用的区别。什么时候传值什么时候传引用?
按值传递:函数范围内对值的任何改变在函数外部都会被忽略
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。
按引用传递则不需要复制值,对于性能提高很有好处。
2. 在PHP中error_reporting这个函数有什么作用?
用来配置错误信息回报的等级]
3. 请写一个函数验证电子邮件的格式是否正确
function validateEmail($email)
{
if(eregi('^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*,$email) ){
return true;
}else{
return false;
}
}
4. 简述如何得到当前执行脚本路径,包括所得到参数。
说明:例如有一个脚本 www.domain.com,传给他的参数有参数1,参数2,参数3….
传递参数的方法有可能是GET有可能是POST,那么现在请写出类似
http://www.domain.com/script.php? 参数1=值1&参数2=值2..... 的结果
echo $_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING'];
5.如何修改SESSION的生存时间.
1. setcookie
方式
session_start();
//
保存一天
$lifeTime = 24 * 3600;
setcookie(session_name(), session_id(), time() + $lifeTime, "/");
2.
session_set_cookie_params()
方式
其实 Session 还提供了一个函数 session_set_cookie_params(); 来设置 Session 的生存期的,该函数必须在 session_start() 函数调用之前调用:
<?php
//
保存一天
$lifeTime = 24 * 3600;
session_set_cookie_params($lifeTime);
session_start();
$_SESSION["admin"] = true;
?
>
如果客户端使用 IE 6.0 , session_set_cookie_params(); 函数设置 Cookie 会有些问题,所以我们还是手动调用 setcookie 函数来创建 cookie。
6..有一个网页地址 http://www.domain.com/xxx.php,如何得到它的内容?
file_get_contents($url);
7. 有一个一维数组,里面存储整型数据,请写一个函数,将他们按从大到小的顺序排列。
要求执行效率高。并说明如何改善执行效率。(该函数必须自己实现,不能使用php函数)
function BubbleSort(&$arr)
{
$cnt=count($arr);
$flag=1;
for($i=0;$i<$cnt;$i++)
{
if($flag==0)
{
return;
}
$flag=0;
for($j=0;$j<$cnt-$i-1;$j++)
{
if($arr[$j]>$arr[$j+1])
{
$tmp=$arr[$j];
$arr[$j]=$arr[$j+1];
$arr[$j+1]=$tmp;
$flag=1;
}
}
}
}
$test=array(1,3,6,8,2,7);
BubbleSort($test);
var_dump($test);
?>
8. 请举例说明在你的开发过程中用什么方法来加快页面的加载速度。
A.生成静态HTML
B.生成XML
C.可不用数据库的尽量不用数据库,把变量参数存于文本.
D.用ZEND加速
二. 数据库设计题:
请设计一套图书馆借书管理系统的数据库表结构;可以记录基本的用户信息、图书信息、借还书信息;数据表的个数不超过6个;请画表格描述表结构(需要说明每个字段的字段名、字段类型、字段含义描述);
在数据库设计中应:
1. 保证每个用户的唯一性;
2.保证每种图书的唯一性;每种图书对应不等本数的多本图书;保证每本图书的唯一性;
3.借书信息表中,应同时考虑借书行为与还书行为,考虑借书期限;
4. 保证借书信息表与用户表、图书信息表之间的参照完整性;
5. 限制每个用户最大可借书的本数
6. 若有新用户注册或新书入库,保证自动生成其唯一性标识
7. 为以下的一系列报表需求提供支持:
(无特定说明,不需编写实现语句,而需在数据库设计中,保证这些报表可以用最多一条SQL语句实现)
a) 日统计报表:当日借书本数、当日还书本数报表;
b) 实时报表:
i. 当前每种书的借出本数、可借本数;
ii. 当前系统中所有超期图书、用户的列表及其超期天数
iii. 当前系统中所有用户借书的本数,分用户列出(包括没有借书行为的用户);请编写实现此需求的SQL语句:
数据库应用:
请撰写一系列的SQL语句,分别描述完整的借书行为与还书行为;并保证这一系列的SQL语句的执行完整性
下题是测验能力之最重要测试,如不能完成我们将无法给出评判结果!所以请写出详细的回答,并保证答案是可以执行的程序。在两日内将结果通过电子邮件寄到[email protected]邮箱
结合第二题中你的设计,用一种数据库实现,要求使用三层结构或者多层结构,要求采用面向对象的思想进行编程,有可能的话,设计一套模板机制来实现之。
功能:列出当前借出图书的情况 ,按日期排列
编号 用户姓名 书名 书的编号 借出日期
1. 张进 大染坊 12576587 2004-9-1
2. 刘兴 西游记 32131098 2004-9-2
……
第四份
1.在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量(1)中;而链接到当前页面的URL记录在预定义变量(2)中。
1.echo $_SERVER['PHP_SELF'];2. echo $_SERVER["HTTP_REFERER"];
2.执行程序段将输出(3)。
2
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.PEAR中的数据库连接字符串格式是(8)。
6.写出一个正则表达式,过虑网页上的所有JS/VBS脚本(即把script标记及其内容都去掉):(9)。
答案:/<[^>].*?>.*?/>/si
preg_replace("//si", "newinfo", $script);
7.以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
8.语句 include 和 require 都能把另外一个文件包含到当前文件中,它们的区别是(12);为了避免多次包含同一文件,可以用语句(13)来代替它们。
12.equire()和include()除了怎样处理失败之外在各方面都完全一样。include()产生一个警告而require()则导致一个致命错误。
换句话说,如果你想在丢失文件时停止处理页面,用require()。include() 就不是这样,脚本会继续运行。
require()无论如何都会包含文件,而include()可以有选择地包含.
13.
include_once
require_once
9.类的属性可以序列化后保存到 session 中,从而以后可以恢复整个类,这要用到的函数是(14)。
serialize() /unserialize()
10.一个函数的参数不能是对变量的引用,除非在php.ini中把(15)设为on.
allow_call_time_pass_reference
11.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
12.在PHP中,heredoc是一种特殊的字符串,它的结束标志必须(18)。
结束标识符所在的行不能包含任何其它字符除";"
13.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。
答案:
1.function displaydir($dir) {
$files = array();
if ( $handle = opendir($dir) )
{
while ( ($file = readdir($handle)) !== false )
{
if ( $file != ".." && $file != "." )
{
if ( is_dir($dir . "/" . $file) )
{
$files[$file] = displaydir($dir . "/" . $file);
}
else
{
$files[] = $file;
}
}
}
closedir($handle);
return $files;
}
}
2. @param string $dir
* @return array
*/
my_scandir($dir)
{
$files = array();
if ( $handle = opendir($dir) )
{
while ( ($file = readdir($handle)) !== false )
{
if ( $file != ".." && $file != "." )
{
if ( is_dir($dir . "/" . $file) )
{
$files[$file] = rec_scandir($dir . "/" . $file);
}
else
{
$files[] = $file;
}
}
}
closedir($handle);
return $files;
}
}
14.简述论坛中无限分类的实现原理。
答:
/*
数据表结构如下:
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 "
if ($level > 0)
{
echo ">" . str_repeat( " ", $level ) . " " . $category['name'] . "/n";
}
else
{
echo ">" . $category['name'] . "/n";
}
Get_Category($key, $level + 1, $default_category);
}
unset($category_array[$category_id]);
}
/*
函数返回的数组格式如下所示:
Array
(
[1] => Array ( [id] => 1 [name] => 一级类别 [level] => 0 [ParentID] => 0 )
[4] => Array ( [id] => 4 [name] => 二级类别 [level] => 1 [ParentID] => 1 )
[9] => Array ( [id] => 9 [name] => 哈哈 [level] => 2 [ParentID] => 4 )
[3] => Array ( [id] => 3 [name] => 二级类别 [level] => 1 [ParentID] => 1 )
[8] => Array ( [id] => 8 [name] => aqqqqqd [level] => 2 [ParentID] => 3 )
[2] => Array ( [id] => 2 [name] => 二级类别 [level] => 1 [ParentID] => 1 )
[7] => Array ( [id] => 7 [name] => 234234 [level] => 2 [ParentID] => 2 )
[6] => Array ( [id] => 6 [name] => 333332 [level] => 2 [ParentID] => 2 )
[5] => Array ( [id] => 5 [name] => 三级类别 [level] => 2 [ParentID] => 2 )
[10] => Array ( [id] => 10 [name] => 66333666 [level] => 3 [ParentID] => 5 )
)
*/
//指定分类id,然后返回数组
function Category_array($category_id = 0,$level=0)
{
global $DB;
$sql = "SELECT * FROM category ORDER BY categoryID DESC";
$result = $DB->query($sql);
while ($rows = $DB->fetch_array($result))
{
$category_array[$rows['categoryParentID']][$rows['categoryID']] = $rows;
}
foreach ($category_array AS $key=>$val)
{
if ($key == $category_id)
{
foreach ($val AS $k=> $v)
{
$options[$k] =
array(
'id' => $v['categoryID'], 'name' => $v['categoryName'], 'level' => $level, 'ParentID'=>$v['categoryParentID']
);
$children = Category_array($k, $level+1);
if (count($children) > 0)
{
$options = $options + $children;
}
}
}
}
unset($category_array[$category_id]);
return $options;
}
?>
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 = "/n";
}else{
$txt1 = ">" . $cate['name'] . "/n";
}
$val = $txt.$txt1;
echo $val;
self::Get_Category($key, $level + 1, $default_category);
}
}
function getFlush($category_id = 0,$level = 0, $default_category = 0)
{
ob_start();
self::Get_Category($category_id ,$level, $default_category);
$out = ob_get_contents();
ob_end_clean();
return $out;
}
}
$id =$_GET['id'];
echo "";
?>
15.设计一个网页,使得打开它时弹出一个全屏的窗口,该窗口中有一个文本框和一个按钮。用户在文本框中输入信息后点击按钮就可以把窗口关闭,而输入的信息却在主网页中显示。
Index.php页
” name=”show” id=”show”>
fullwin.php页
” name=”userinput” id=”userinput” οnclick=”winclose()”> ” name=”jump” id=”jump” Onclik=>
附:
toolbar=no 是否显示工具栏,yes为显示;
menubar,scrollbars 表示菜单栏和滚动栏。
resizable=no 是否允许改变窗口大小,yes为允许;
location=no 是否显示地址栏,yes为允许;
status=no 是否显示状态栏内的信息(通常是文件已经打开),yes为允许;
width=400 窗口宽度;
height=300 窗口高度;
top=0 窗口距离屏幕上方的象素值;
left=0 窗口距离屏幕左侧的象素值;
window.open("filename","","fullscreen=1");
window.open(Url,'cscedcLogin',"dependent,alwaysLowered=0,alwaysRaised=0,channelmode=0,dependent=0,directories=0,fullscreen=1,hotkeys=1,location=0,menubar=0,resizable=0,scrollbars=0,status=0,titlebar=0,toolbar=0,z-lock=0,screenX=0,screeny=0,left=0,top=0,toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no");
3. 关闭前一个窗口??
window.opener=null;
window.close();
面试题6
有一表 menu(mainmenu,submenu,url),请用递归法写出一树形菜单,将所有的menu列出来。
function GenerateMenu($id=0,$str="")
{
$result=mysql_query("select mainmenu,url,submenu from menu where mainmenu=$id");
while($row=mysql_fetch_array($result))
{
echo $str.$row["url"]."
";
GenerateMenu($row["submenu"],$str."--");
}
mysql_free_result($result);
}
$link=mysql_connect("localhost","root","");
mysql_select_db("phpinterview");
GenerateMenu();
mysql_close($link)
?>
、取得查询结果集总数的函数是?(1分)
mysql_num_rows($res);
面试题7
1- 给你三个数,写程序求出其最大值。
$var1=1;
$var2=7;
$var3=8;
$max=$var1>$var2?$var1:$var2;
$max=$max>$var3?$max:$var3;
echo $max;
2- 谈谈asp,php,jsp的优缺点
3- 谈谈对mvc的认识
4- 写出发贴数最多的十个人名字的SQL,利用下表:
members(id,username,posts,pass,email)
SELECT username,count(*) as num FROM `members` group by username order by count(*) desc limit 10
面试题8
1-如何通过javascript判断一个窗口是否已经被屏蔽。
2-写出session的运行机制
用户A访问站点Y,如果站点Y执行了session_start();(以下假定session_start()总是存在)那么会产生一个 session_id,这个session id一般会以COOKIE的形式保存到用户A(我们可以通过在php.ini里设置session.use_only_cookies为1,强制 SESSION ID必须以COOKIE传递。)。这时候SESSION ID表现为$_COOKIE[’PHPSESSID’];(PHPSESSID可用session_name()函数来修改)
用户A接着访问,这个session id($_COOKIE[’PHPSESSID’])就会在A每次访问Y的时候传送到站点Y。
在站点Y上,会有这么一个目录,是用来保存SESSION的实际数据的。站点Y接收到session id,然后通过session id,来获得与SESSION数据的关联,并返回SESSION数据。
3-有一数组 $a=array(4,3,8,9,2);请将其重新排序,按从小到大的顺序列出。
4-防止SQL注射漏洞一般用_____函数。addslashes
5-查询在线人数,并能处理异常掉线的SQL
....WHERE ________
编程题:
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);
如何实现PHP、JSP交互?
题目有点含糊不清,SOAP,XML_RPC,Socket function,CURL都可以实现这些,如果是考PHP和Java的整合,PHP内置了这种机制(如果考PHP和.NET的整合,也可以这么回答), 例如$foo = new Java('java.lang.System');
优化MYSQL数据库的方法:
参考1: 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";
参考2:(1).数据库设计方面,这是DBA和Architect的责任,设计结构良好的数据库,必要的时候,去正规化(英文是这个:denormalize,中文翻译成啥我不知道),允许部分数据冗余,避免JOIN操作,以提高查询效率
(2).系统架构设计方面,表散列,把海量数据散列到几个不同的表里面.快慢表,快表只留最新数据,慢表是历史存档.集群,主服务器Read & write,从服务器read only,或者N台服务器,各机器互为Master
(3).(1)和(2)超越PHP Programmer的要求了,会更好,不会没关系.检查有没有少加索引
(4).写高效的SQL语句,看看有没有写低效的SQL语句,比如生成笛卡尔积的全连接啊,大量的Group By和order by,没有limit等等.必要的时候,把数据库逻辑封装到DBMS端的存储过程里面.缓存查询结果,explain每一个sql语句
(5).所得皆必须,只从数据库取必需的数据,比如查询某篇文章的评论数,select count(*) ... where article_id = ? 就可以了,不要先select * ... where article_id = ?然后msql_num_rows.
只传送必须的SQL语句,比如修改文章的时候,如果用户只修改了标题,那就update ... set title = ?where article_id = ?不要set content = ?(大文本)
(6).必要的时候用不同的存储引擎.比如InnoDB可以减少死锁.HEAP可以提高一个数量级的查询速度.
).数据库设计方面,设计结构良好的数据库,允许部分数据冗余,避免JOIN操作,以提高查询效率
(2).系统架构设计方面,表散列,把海量数据散列到几个不同的表里面.快慢表,快表只留最新数据,慢表是历史存档.集群,主 服务器Read & write,从服务器read only,或者N台服务器,各机器互为Master
(3).(1)和(2)超越PHP Programmer的要求了,会更好,不会没关系.检查有没有少加索引
(4).写高效的SQL语句,看看有没有写低效的SQL语句,比如生成笛卡尔积的全连接啊,大量的Group By和order by,没有l limit等等.必要的时候,把数据库逻辑封装到DBMS端的存储过程里面.缓存查询结果,explain每一个sql语句
(5).所得皆必须,只从数据库取必需的数据,比如查询某篇文章的评论数,select count(*) ... where article_id = 就可以, 不要先select * ... where article_id = 然后msql_num_rows.
只传送必须的SQL语句,比如修改文章的时候,如果用户只修改了标题,那就update ... set title = where article_id = 不要 set content = (大文本)
(6).必要的时候用不同的存储引擎.比如InnoDB可以减少死锁.HEAP可以提高一个数量级的查询速度.
(7).选取最适用的字段属性,应该尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL 值。
(8).使用连接(JOIN)来代替子查询(Sub-Queries)
(9).使用联合(UNION)来代替手动创建的临时表
(10).尽量少使用 LIKE 关键字和通配符
(11).使用事务和外键
谈谈事务处理
如同是个编程语言都会有答应Hello World的例子一样,是本数据库的教材都会讲A给B的账户转账50美元的例子,回答这个就好了.不过据我所知,用MySQL的企业,很少用MySQL来实现事务处理.何况现在Oracle收购了InnoDB的公司.
可以控制并发事务所产生的数据同步提交,更新问题,就是一个锁的概念.comit,rollback
apache+mysql+php实现最大负载的方法.
单台的MYSQL 和PHP 是不能承担多大的访问量,个人的力量毕竟是有限的,机器也是。
需要通过负载均衡,将访问量可以均匀的分摊到不同的机器上,从而实现大的负载承担能力,
一般来说,系统的瓶颈都是卡在数据库上面,如果对单台的要求,需要加CACHE,优化APACHE和MYSQL,php本身意义不大
问的太笼统,生成静态html页面,squid反向代理,apache,mysql的负载均衡.
1.表单中 get与post提交方法的区别?
答:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息.
2.session与cookie的区别?
答:session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放
cookie:用来存储连续訪問一个頁面时所使用,是存储在客户端,对于Cookie来说是存储在用户WIN的Temp目录中的。
两者都可通过时间来设置时间长短
3.数据库中的事务是什么?
答:事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,
事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。
用javascipt打印 “上海爱吉”
<>
write('上海爱吉');
>
PHP面试题系列四【附答案】 $num2 $num1 /$str1 => $str1
1、假定要使用Apache+Php的配置,并将php3编译成Apache的一个模块。那麽以下httpd.conf文件的语句是必须的:【 】
A、AddModule mod_php3.c
B、LoadModule php3_module libexec/libphp3.so
C、AddType application/x-httpd-php3.php3
D、setup
E、make install
2、PHP支持的数据类型有七种,以下被支持的有:【】
A、array
B、floating-point numbers(double)
C、integer
D、date
E、string
3、以下程序:
$num1 = 15;
$num2 = $num1;
echo "
$num2 = &$num1;
$num2 = 20;
echo "
?>
程序输出为:[ ]
A、15
B、35
C、20
D、5
4、以下程序
$str1 = "01";
$str1++;
$str1 += 1;
echo "
?>
程序输出为:[ ]
A、$str1 => 01
B、$str1 => 2
C、$str1 => 03
D、$str1 => 3
E、$str1 => 1
5、全局变量与局部变量
$a=1;
sum()
{
echo $a;
}
sum();
程序输出为:[ ]
A、1
B、10
C、100
D、1000
E、空值
6、PHP的控制语句
$a = 3;
$b = $a++;
if ($a > $b)
{
echo "a 比 b 大";
}
elseif ($a == $b)
{
echo "a 等于 b";
}
else
{
echo "a 比 b 小";
}
?>
输出结果为:[ ]
A、a 比 b 大
B、a 等于 b
C、a 比 b 小
D、"a 比 b 小"
E、无输出
7、include的功能和require一样,不同的是,require不能用在[ ]
A、判断语句或循环里,
B、连接语句里
C、声明语句里
D、文件的开头
E、文件的中间
8、PHP对字符串的处理程序
$name="Jollen";
echo 'Name:$name';
echo "Name:$name";
输出结果为:[ ]
A、Name:Jollen
Name:Jollen
B、Name:Jollen
Name:$name
C、Name:$name
Name:Jollen
D、Name:$name
Name:$name
E、Name:"Jollen"
Name:Jollen
9、数据处理程序
$string="This is a test.";
echo ereg_replace(" is"," was",$string)."
";
echo ereg_replace("() is","//1was",$string)."
";
echo ereg_replace("(() is)","//2was",$string)."
";
输出为:[ ]
A、This was a test.
This is a test.
This was a test.
B、This is a test.
This is a test.
This was a test.
C、This is a test.
This is a test.
This is a test.
D、This was a test.
This is a test.
This is a test.
E、This was a test.
This was a test.
This was a test.
10、下面建立与MySQL Server的连接语法正确的是:[ ]
A、$link=connect("host_name","user_name","password");
B、$link=mysql_connect("host_name","user_name","password");
C、$link=mysqlconnect("host_name","user_name","password");
D、$link=mysql_pconnect("host_name","user_name","password");
E、$link=pconnect("host_name","user_name","password");
11、下面程序
$message="abcdefghijklmnopqrstuvwxyz";
mail("[email protected]", "No topic", $message, "From:
[email protected]/nReply-To: [email protected]/nX-Mailer: PHP/"
. phpversion());
?>[ ]
A、从[email protected]接收邮件
B、发送邮件到[email protected]
C、发送邮件到[email protected]
D、从[email protected]接收邮件
E、不能发送任何邮件
12、rawurlencode()的作用是[ ]
A、对PHP3将要输出的URL部分进行编码
B、对PHP3将要输入的URL部分进行编码
C、对PHP3已经输出的URL部分进行编码
D、对PHP3已经输出的URL部分进行编码
E、对PHP3将要输出的URL部分进行解码
13、假如我们要删除一个,再建立一个同样的,应写成:[ ]
A、set("fullname");
set("fullname","Jacky");
B、set("fullname","Jacky");
C、set("fullname","Jacky");
set("fullname");
D、set("fullname");
E、sets("fullname","Jacky");
sets("fullname");
14、如果要在大量的数据里读取一个字段的数据,则最好使用mysql_fetch_row()、mysql_fetch_array()、
mysql_fetch_object()函数。因为这几个函数的速度都比[ ]
A、mysql_num_rows
B、mysql_num_fields
C、mysql_result
D、mysql_list_fields
E、mysql_insert_id
来得快。
15、在PHP中,如果派生类与父类有相同名字的函数,则派生类的函数会替换父类的函数,程序
class A
{
disName()
{
echo "Picachu";
}
}
class B extends A
{
var tmp;
disName()
{
echo "Doraemon";
}
}
$cartoon = new B;
$cartoon->disName();
结果为:[ ]
A、tmp
B、Picachu
C、disName
D、Doraemon
E、无输出
答案:
1.[C]
2.[ A B C E ]
PHP的变量属于松散数据类型,在计算时动态(dynamic)决定。如果要强制设置变量的数据类型的话,可以利用 settype()函数。或利用 c 语言的强制转型方式(type casting)。
3.[ A C ]
4.[ D ]
5.[ E ]
6.[ A ]
7.[ E ]
但include可以。
8.[ C ]
9.[ E ]
10.[ B D ]
11.[ C ]
12.[ C D ]
13.[ B ]
14.[ C ]
15.[ D ]
===============================================================================
PHP面试题系列五【附答案】
一、基础题
1. 写出如下程序的输出结果
$str1 = null;
$str2 = false;
echo $str1==$str2 ? '相等' : '不相等';
$str3 = '';
$str4 = 0;
echo $str3==$str4 ? '相等' : '不相等';
$str5 = 0;
$str6 = '0';
echo $str5===$str6 ? '相等' : '不相等';
?>
2. 写出如下程序的输出结果
$a1 = null;
$a2 = false;
$a3 = 0;
$a4 = '';
$a5 = '0';
$a6 = 'null';
$a7 = array();
$a8 = array(array());
echo empty($a1) ? 'true' : 'false';
echo empty($a2) ? 'true' : 'false';
echo empty($a3) ? 'true' : 'false';
echo empty($a4) ? 'true' : 'false';
echo empty($a5) ? 'true' : 'false';
echo empty($a6) ? 'true' : 'false';
echo empty($a7) ? 'true' : 'false';
echo empty($a8) ? 'true' : 'false';
?>
3. 写出如下程序的输出结果
$test = 'aaaaaa';
$abc = & $test;
unset($test);
echo $abc;
?>
4. 写出如下程序的输出结果
$count = 5;
get_count()
{
static $count = 0;
return $count++;
}
echo $count;
++$count;
echo get_count();
echo get_count();
?>
5. 写出如下程序的输出结果
$GLOBALS['var1'] = 5;
$var2 = 1;
get_()
{
global $var2;
$var1 = 0;
return $var2++;
}
get_();
echo $var1;
echo $var2;
?>
6. 写出如下程序的输出结果
get_arr($arr)
{
unset($arr[0]);
}
$arr1 = array(1, 2);
$arr2 = array(1, 2);
get_arr(&$arr1);
get_arr($arr2);
echo count($arr1);
echo count($arr2);
?>
7. 使用五种以上方式获取一个文件的扩展名
要求:dir/upload.image.jpg,找出 .jpg 或者 jpg ,
必须使用PHP自带的处理函数进行处理,方法不能明显重复,可以封装成函数,比如 get_ext1($file_name), get_ext2($file_name)
二、算法题
1. 使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组
2. 使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组
3. 写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数
答案(以下答案不一定是最好的,只是一个简单的参考)
一、基础题
1. 相等 相等 不相等
2. true true true true true false true false
3. aaaaaa
4. 5 0 1
5. 5 2
6. 1 2
7. 使用五种以上方式获取一个文件的扩展名
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), '.')));
}
二、算法题
1. 使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组
//冒泡排序(数组排序)
bubble_sort($array)
{
$count = count($array);
if ($count <= 0)
return false;
for($i=0; $i<$count; $i++)
{
for($j=$count-1; $j>$i; $j--)
{
if ($array[$j] < $array[$j-1])
{
$tmp = $array[$j];
$array[$j] = $array[$j-1];
$array[$j-1] = $tmp;
}
}
}
return $array;
}
//快速排序(数组排序)
quick_sort($array)
{
if (count($array) <= 1)
return $array;
$key = $array[0];
$left_arr = array();
$right_arr = array();
for ($i=1; $i
if ($array[$i] <= $key)
$left_arr[] = $array[$i];
else
$right_arr[] = $array[$i];
}
$left_arr = quick_sort($left_arr);
$right_arr = quick_sort($right_arr);
return array_merge($left_arr, array($key), $right_arr);
}
2.
//二分查找(数组里查找某个元素)
bin_sch($array, $low, $high, $k)
{
if ($low <= $high)
{
$mid = intval(($low+$high)/2);
if ($array[$mid] == $k)
{
return $mid;
}
elseif ($k < $array[$mid])
{
return bin_sch($array, $low, $mid-1, $k);
}
else
{
return bin_sch($array, $mid+1, $high, $k);
}
}
return -1;
}
//顺序查找(数组里查找某个元素)
seq_sch($array, $n, $k)
{
$array[$n] = $k;
for($i=0; $i<$n; $i++)
{
if($array[$i]==$k)
{
break;
}
}
if ($i<$n)
{
return $i;
}
else
{
return -1;
}
}
3. 写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数
//二维数组排序, $arr是数据,$keys是排序的健值,$order是排序规则,1是升序,0是降序
array_sort($arr, $keys, $order=0)
{
if (!is_array($arr))
{
return false;
}
$keys = array();
foreach($arr as $key => $val)
{
$keys[$key] = $val[$keys];
}
if($order == 0)
{
asort($keys);
}
else
{
arsort($keys);
}
reset($keys);
foreach($keys as $key => $vals)
{
$keysort[$key] = $key;
}
$new_array = array();
foreach($keysort as $key => $val)
{
$new_array[$key] = $arr[$val];
}
return $new_array;
}
一、基础及程序题(建议使用你擅长的语言:C/C++、PHP、Java)
1.写一个排序算法,可以是冒泡排序或者是快速排序,假设待排序对象是一个维数组。(提示:不能使用系统已有函数,另外请仔细回忆以前学习过的基础知识)
2.实现一个字符串截取的函数,类似于substr,必须能够截取中文这种多字节编码。假设每个中文也是一个字符,普通的数字、符号、字母也是一个字符。(提示:GB编码的中文字符高位范围是 0x81-0xFE )
3.写一个遍历指定目录下所有子目录和子文件的函数(提示:可以使用递归的方法)
4.写出匹配邮箱地址和URL的两个正则表达式。类似下面的:
邮箱地址:[email protected]
URL地址:http://www.example.com.cn/user_profile.php?uid=100
(提示:使用标准的正则表达式,就是PHP中preg_* 类的正则处理函数能够解析的正则)
二、数据库技术题
1.写出三种以上MySQL数据库存储引擎的名称(提示:不区分大小写)
2.说出你所知道的三种以上开源数据库的名称(提示:想想目前国外流行的开源数据库)
3.MySQL数据库中的字段类型varchar和char的主要区别是什么?那种字段的查找效率要高,为什么?
4.说出MySQL 4.0和MySQL 4.1版本的最主要的两个区别。如果你使用过MySQL 5,请说说MySQL 5跟MySQL 4的主要区别。(后半题选作)
5.MySQL数据库基本的三个优化法则是什么?(提示:从服务配置、应用、开发角度考虑)
二、综合技术题
1.请使用JavaScript写出三种产生一个Image 标签的方法(提示:从方法、对象、HTML角度考虑)
2.请使用CSS样式,描述两种方法在当前列中只显示一个div对象
3.请描述出两点以上XHTML和HTML最显著的区别
4.出五种以上你使用过的PHP的扩展的名称(提示:常用的PHP扩展)
5.了解MVC模式吗?请写出三种以上目前PHP流行的MVC框架名称(不区分大小写)
以下为十个目前最流行的基于MVC设计模式的PHP框架。
1. Yii
Yii是一个基于组件的高性能的PHP的框架,用于开发大规模Web应用。Yii采用严格的OOP编写,并有着完善的库引用以及全面的教程。从MVC,DAO/ActiveRecord,widgets,caching,等级式RBAC,Web服务,到主体化,I18N和L10N,Yii提供了今日Web 2.0应用开发所需要的几乎一切功能。而且这个框架的价格也并不太高。事实上,Yii是最有效率的PHP框架之一。
2. CodeIgniter
CodeIgniter是一个应用开发框架——一个为建立PHP网站的人们所设计的工具包。其目标在于快速的开发项目:它提供了丰富的库组以完成常见的任务,以及简单的界面,富有条理性的架构来访问这些库。使用CodeIgniter开发可以往项目中注入更多的创造力,因为它节省了大量编码的时间。
3. CakePHP
CakePHP是一个快速开发PHP的框架,其中使用了一些常见的设计模式如ActiveRecord,Association Data Mapping,Front Controller以及MVC。其主要目标在于提供一个令任意水平的PHP开发人员都能够快速开发web应用的框架,而且这个快速的实现并没有牺牲项目的弹性。
4. PHPDevShell
PHPDevShell是一个开源(GNU/LGPL)的快速应用开发框架,用于开发不含Javascript的纯PHP。它有一个完整的GUI管理员后台界面。其主要目标在于开发插件一类的基于管理的应用,其中速度、安全、稳定性及弹性是最优先考虑的重点。其设计形成了一个简单的学习曲线,PHP开发者无需学习复杂的新术语。PHPDevShell的到来满足了开发者们对于一个轻量级但是功能完善,可以无限制的进行配置的GUI的需求。
5. Akelos
Akelos PHP框架是一个基于MVC设计模式的web应用开发平台。基于良好的使用习惯,使用它可以完成如下任务:
◆方便的使用Ajax编写views
◆通过控制器管理请求(request)及响应(response)
◆管理国际化的应用
◆使用简单的协议与模型及数据库通信
你的Akelos应用可以在大多数共享主机服务供应方上运行,因为Akelos对服务器唯一的要求就是支持PHP。因此,Akelos PHP框架是理想的用于发布单独web应用的框架,因为它不需要非标准PHP配置便能运行。
6. Symfony
Symfony是一个用于开发PHP5项目的web应用框架。
这个框架的目的在于加速web应用的开发以及维护,减少重复的编码工作。
Symfony的系统需求不高,可以被轻易的安装在任意设置上:你只需一个Unix或Windows,搭配一个安装了PHP5的网络服务器即可。它与差不多所有的数据库兼容。Symfony的价位不高,相比主机上的花销要低得多。
对于PHP开发者而言,使用Symfony是一件很自然的事,其学习曲线只有短短一天。干净的设计以及代码可读性将缩短开发时间。开发者可以将敏捷开发的原理(如DRY,KISS或XP等)应用在其中,将重点放在应用逻辑层面上,而不用花费大量时间在编写没完没了的XML配置文件上。
Symfony旨在建立企业级的完善应用程序。也就是说,你拥有整个设置的控制权:从路径结构到外部库,几乎一切都可以自定义。为了符合企业的开发条例,Symfony还绑定了一些额外的工具,以便于项目的测试,调试以及归档。
7. Prado
PRADO团队由一些PRADO狂热者组成,这些成员开发并推动PRADO框架以及相关项目的进行。
PRADO的灵感起源于Apache Tapestry。从04年开始,PRADO成为SourceForge上的开源项目之一。这个项目目前进展到了3.x版本。
8. Zend
作为PHP艺术及精神的延伸,Zend框架的基础在于简单,面向对象的最佳方法,方便企业的许可协议,以及经过反复测试的快速代码库。Zend框架旨在建造更安全,更可靠的Web 2.0应用及web服务,并不断从前沿厂商(如Google,Amazon,Yahoo,Flickr,StrikeIron和ProgrammableWeb等)的API那里吸收精华。
9. ZooP
Zoop PHP框架,意为Zoop面向对象的PHP框架。
这是个稳定,可伸缩并可移植的框架。从诞生到现在的5年间,已经在不少产品开发中被使用。Zoop是一个快速,有效并干净的框架。它的伸缩性很好,你可以只安装你需要的功能。
对代码并不很熟悉的开发者也可以通过Zoop快速的开发安全的web应用。熟练的开发者则可以更加将Zoop的弹性利用到极致。
Zoop建议将display,logic以及数据层(MVC)分开使用。
Zoop由很多组件和项目集合而成,其中包括smarty和prototype AJAX框架,PEAR模块等。高效的核心组件提供了很多你原本需要自己编码来实现的功能。Zoop内置的纠错功能可以通过配置实现生产环境下的错误日志生成,这个错误日志提供了很多信息,可读性很高,可以更轻易的寻找并排除错误。
Zoop的一个特别之处在于其GuiControls,在PHP中是一个相当革新的想法。它提供了很多form widgets与验证完整的集合到一起,并形成了一个可以轻松打造个性化GuiControls的框架。
10. QPHP
QPHP,意为快速PHP,它是一个与ASP.NET类似的MVC框架。基本上它是这样一个情况:
◆整合了Java和C#的美感
◆除去了在其他PHP框架中使用的Perl形式的意义含糊的语言
◆大量基于OOP的概念
6.写出15个以上你所知道的常用的Linux命令和它的功能
7.使用过Vim编辑器吗?如果使用过,如何在vim里切分多个可视化窗口,包括横排和纵排。(本题选作)
8.说说Linux下的find命令和grep命令的区别(本题选作)
9.请描述出七层网络模型的名称,由下到上(可以使用中文描述)
10.说说下面这些这些协议的全称和中文解释(提示:都是工作在应用层)SMTP、POP3、HTTP、FTP、DNS
11.使用过Memcache缓存吗,如果使用过,能够简单的描述一下它的工作原理吗?(本题选作)
12.请大致的说说Session的工作原理。(提示:与Cookie有相应的关系)
13.说说你所了解的搜索引擎包含那些技术?(本题选作)
三、项目及设计题
1.一个Web开发团队开发中,大致说说你所了解的所有成员的分工合作情况
2.说说你做过的最得意的项目或者个人开发作品(可以是个人作品,也可以是合作项目)
3.假设给你5台服务器,请大致的描述一下,如何使用你所熟悉的开源软件,搭建一个日PV 300万左右的中型网站
六、数据库技术题
6.写出三种以上MySQL数据库存储引擎的名称(提示:不区分大小写)
MyISAM、InnoDB、BDB(Berkeley DB)、Merge、Memory(Heap)、Example、Federated、Archive、CSV、Blackhole、MaxDB 等等十几个引擎
7.说出你所知道的三种以上开源数据库的名称(提示:想想目前国外流行的开源数据库)
MySQL、SQLite、BDB(Berkeley DB)、PostgreSQL、Firebird
8.MySQL数据库中的字段类型varchar和char的主要区别是什么?那种字段的查找效率要高,为什么?
Varchar是变长,节省存储空间,char是固定长度。查找效率要char型快,因为varchar是非定长,必须先查找长度,然后进行数据的提取,比char定长类型多了一个步骤,所以效率低一些
9.说出MySQL 4.0和MySQL 4.1版本的最主要的两个区别。如果你使用过MySQL 5,请说说MySQL 5跟MySQL 4的主要区别。(后半题选作)
MySQL 4.1 主要是比MySQL 4.0多了子查询和字符编码的支持两个特点。
MySQL5增加的功能比MySQL4要更多,包括存储过程、视图、事务等等
10.MySQL数据库基本的三个优化法则是什么,除了增加硬件和带宽?(提示:从服务配置、应用、开发角度考虑)
(1)系统服务优化,把MySQL的key_buffer、cache_buffer、query_cache等增加容量
(2)给所有经常查询的字段增加适当的索引
(3)优化SQL语句,减少Ditinct、Group、Join等等语句的操作
PHP面试题目
一、基础题
1. 写出如下程序的输出结果
$str1 = null;
$str2 = false;
echo $str1==$str2 ? '相等' : '不相等';
$str3 = '';
$str4 = 0;
echo $str3==$str4 ? '相等' : '不相等';
$str5 = 0;
$str6 = '0';
echo $str5===$str6 ? '相等' : '不相等';
?>
2. 写出如下程序的输出结果
$a1 = null;
$a2 = false;
$a3 = 0;
$a4 = '';
$a5 = '0';
$a6 = 'null';
$a7 = array();
$a8 = array(array());
echo empty($a1) ? 'true' : 'false';
echo empty($a2) ? 'true' : 'false';
echo empty($a3) ? 'true' : 'false';
echo empty($a4) ? 'true' : 'false';
echo empty($a5) ? 'true' : 'false';
echo empty($a6) ? 'true' : 'false';
echo empty($a7) ? 'true' : 'false';
echo empty($a8) ? 'true' : 'false';
?>
3. 写出如下程序的输出结果
$test = 'aaaaaa';
$abc = & $test;
unset($test);
echo $abc;
?>
4. 写出如下程序的输出结果
$count = 5;
function get_count(){
static $count = 0;
return $count++;
}
echo $count;
++$count;
echo get_count();
echo get_count();
?>
5. 写出如下程序的输出结果
$GLOBALS['var1'] = 5;
$var2 = 1;
function get_value(){
global $var2;
$var1 = 0;
return $var2++;
}
get_value();
echo $var1;
echo $var2;
?>
6. 写出如下程序的输出结果
function get_arr($arr){
unset($arr[0]);
}
$arr1 = array(1, 2);
$arr2 = array(1, 2);
get_arr(&$arr1);
get_arr($arr2);
echo count($arr1);
echo count($arr2);
?>
7. 使用五种以上方式获取一个文件的扩展名
要求:dir/upload.image.jpg,找出 .jpg 或者 jpg ,
必须使用PHP自带的处理函数进行处理,方法不能明显重复,可以封装成函数,比如 get_ext1($file_name), get_ext2($file_name)
二、算法题
1. 使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组
2. 使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组
3. 写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数
【附答案】(以下答案不一定是最好的,只是一个简单的参考)
一、基础题
1. 相等 相等 不相等
2. true true true true true false true false
3. aaaaaa
4. 5 0 1
5. 5 2
6. 1 2
7. 使用五种以上方式获取一个文件的扩展名
function get_ext1($file_name){
return strrchr($file_name, '.');
}
function get_ext2($file_name){
return substr($file_name, strrpos($file_name, '.'));
}
function get_ext3($file_name){
return array_pop(explode('.', $file_name));
}
function get_ext4($file_name){
$p = pathinfo($file_name);
return $p['extension'];
}
function get_ext5($file_name){
return strrev(substr(strrev($file_name), 0, strpos(strrev($file_name), '.')));
}
二、算法题
1. 使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组
//冒泡排序(数组排序)
function bubble_sort($array)
{
$count = count($array);
if ($count <= 0) return false;
for($i=0; $i<$count; $i++){
for($j=$count-1; $j>$i; $j--){
if ($array[$j] < $array[$j-1]){
$tmp = $array[$j];
$array[$j] = $array[$j-1];
$array[$j-1] = $tmp;
}
}
}
return $array;
}
//快速排序(数组排序)
function quick_sort($array) {
if (count($array) <= 1) return $array;
$key = $array[0];
$left_arr = array();
$right_arr = array();
for ($i=1; $i
if ($array[$i] <= $key)
$left_arr[] = $array[$i];
else
$right_arr[] = $array[$i];
}
$left_arr = quick_sort($left_arr);
$right_arr = quick_sort($right_arr);
return array_merge($left_arr, array($key), $right_arr);
}
2.
//二分查找(数组里查找某个元素)
function bin_sch($array, $low, $high, $k){
if ($low <= $high){
$mid = intval(($low+$high)/2);
if ($array[$mid] == $k){
return $mid;
}elseif ($k < $array[$mid]){
return bin_sch($array, $low, $mid-1, $k);
}else{
return bin_sch($array, $mid+1, $high, $k);
}
}
return -1;
}
//顺序查找(数组里查找某个元素)
function seq_sch($array, $n, $k){
$array[$n] = $k;
for($i=0; $i<$n; $i++){
if($array[$i]==$k){
break;
}
}
if ($i<$n){
return $i;
}else{
return -1;
}
}
3. 写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数
//二维数组排序, $arr是数据,$keys是排序的健值,$order是排序规则,1是升序,0是降序
function array_sort($arr, $keys, $order=0) {
if (!is_array($arr)) {
return false;
}
$keysvalue = array();
foreach($arr as $key => $val) {
$keysvalue[$key] = $val[$keys];
}
if($order == 0){
asort($keysvalue);
}else {
arsort($keysvalue);
}
reset($keysvalue);
foreach($keysvalue as $key => $vals) {
$keysort[$key] = $key;
}
$new_array = array();
foreach($keysort as $key => $val) {
$new_array[$key] = $arr[$val];
}
return $new_array;
}