Php面试宝典100题汇总.docx
《Php面试宝典100题汇总.docx》由会员分享,可在线阅读,更多相关《Php面试宝典100题汇总.docx(43页珍藏版)》请在冰豆网上搜索。
Php面试宝典100题汇总
Php面试100题汇总
1,Http和Https的区别
第一:
http是超文本传输协议,信息是明文传输,https是具有安全性的ssl加密传输协议
第二:
http和https使用的是完全不同的连接方式,端口也不一样,前者80或者443
第三:
http连接很简单,是无状态的。
https协议是由ssl+http协议构建的可进行加密传输,身份认证的网络协议。
2.什么方法来加快页面的加载速度
1,用到服务器资源时在打开,不用时,立即关闭服务器资源。
2,数据库添加索引
3,页面可生成静态
4,图片等大文件单独放在一个服务器
5,能不查询数据库的尽量不去数据取数据,可以放在缓存中。
3.表单中get与post提交方法的区别?
答:
get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息.
4.echo,print,print_r 的区别:
echo 是php语句,无返回值。
print,print_r是函数,有返回值。
print() 只能打印出简单类型变量的值(如int,string)
print_r()可以打印出复杂类型变量的值(如数组,对象)
echo 输出一个或者多个字符串
5.session与cookie区别
session与cookie相同:
跨页面、不跨用户
session与cookie不相同:
1、session可以存储任意类型的数据,但cookie只能存储字符串
2、cookie产生在服务器端、存储在客户端
session产生在服务器端、存储在服务器端
6.魔术常量
答案:
__LINE__文件中的当前行号。
__FILE__文件的完整路径和文件名。
__FUNCTION__函数名称
__CLASS__类的名称
__METHOD__类的方法名
7.数据库中的事务是什么?
答:
事务(transaction)是作为一个单元的一组有序的数据库操作。
如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。
如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。
如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。
8.1优化MYSQL数据库的方法。
1、选择合适的字段的数据类型
1)能用数字不用字符串
2)char、varchar、text能用varchar不用char
3)给字段加notnull避免在表中出现NULL关键字(default值)
2、选择合适的字段充当主键
1)建议每张表必须有主键
2)用数字类型的字段充当主键
3、拆分表
1)拆分字段,将文章的标题与内容分开
2)拆分记录,将今年的记录与往年的记录分开
4、给字段合理添加索引
a.格式:
(普通索引)->
创建:
CREATEINDEX<索引名>ONtablename(索引字段)
修改:
ALTERTABLEtablenameADDINDEX[索引名](索引字段)
创表指定索引:
CREATETABLEtablename([...],INDEX[索引名](索引字段))
(唯一索引)->
创建:
CREATEUNIQUE<索引名>ONtablename(索引字段)
修改:
ALTERTABLEtablenameADDUNIQUE[索引名](索引字段)
创表指定索引:
CREATETABLEtablename([...],UNIQUE[索引名](索引字段))
(主键)->
它是唯一索引,一般在创建表是建立,格式为:
CREATATABLEtablename([...],PRIMARYKEY[索引字段])
5、事务处理:
a.保证数据完整性,例如添加和修改同时,两者成立则都执行,一者失败都失败
mysql_query("BEGIN");
mysql_query("INSERTINTOcustomerinfo(name)VALUES('$name1')";
mysql_query("SELECT*FROM`orderinfo`wherecustomerid=".$id");
mysql_query("COMMIT");
6、锁定表,优化事务处理:
a.我们用一个SELECT语句取出初始数据,通过一些计算,用UPDATE语句将新值更新到表中。
包含有WRITE关键字的LOCKTABLE语句可以保证在UNLOCKTABLES命令被执行之前,
不会有其它的访问来对inventory进行插入、更新或者删除的操作
mysql_query("LOCKTABLEcustomerinfoREAD,orderinfoWRITE");
mysql_query("SELECTcustomeridFROM`customerinfo`whereid=".$id);
mysql_query("UPDATE`orderinfo`SETordertitle='$title'where
customerid=".$id);
mysql_query("UNLOCKTABLES");
7、使用外键,优化锁定表
a.把customerinfo里的customerid映射到orderinfo里的customerid,
任何一条没有合法的customerid的记录不会写到orderinfo里
CREATETABLEcustomerinfo(
customeridINTNOTNULL,
PRIMARYKEY(customerid)
)TYPE=INNODB;
CREATETABLEorderinfo(
orderidINTNOTNULL,
customeridINTNOTNULL,
PRIMARYKEY(customerid,orderid),
FOREIGNKEY(customerid)REFERENCEScustomerinfo
(customerid)ONDELETECASCADE
)TYPE=INNODB;
注意:
'ONDELETECASCADE',该参数保证当customerinfo表中的一条记录删除的话同时也会删除order
表中的该用户的所有记录,注意使用外键要定义事务安全类型为INNODB;
8、优化查询语句
a用内连接代替子查询代替子查询,用sphinx代替like模糊查询
b最好在相同字段进行比较操作,在建立好的索引字段上尽量减少函数操作
例子1:
SELECT*FROMorderWHEREYEAR(orderDate)<2008;(慢)
SELECT*FROMorderWHEREorderDate<"2008-01-01";(快)
例子2:
SELECT*FROMorderWHEREaddtime/7<24;(慢)
SELECT*FROMorderWHEREaddtime<24*7;(快)
例子3:
SELECT*FROMorderWHEREtitlelike"%good%";
SELECT*FROMorderWHEREtitle>="good"andname<"good";
9、缓存,静态化
10、选择合适存储引擎用Innodb增删改,用myisam查询
11、主从数据库
12、负载均衡
13、最好拿数字类型的字段充当where条件
14、最好拿相同类型的字段进行比对(避免发生数据类型的转换)
15、不要在具有索引的字段上添加数据库函数(索引失效)
8.2请简述项目中优化sql语句执行效率的方法,从哪些方面,sql语句性能如何分析?
答:
(1)选择最有效率的表名顺序
(2)WHERE子句中的连接顺序
(3)SELECT子句中避免使用‘*’
(4)用Where子句替换HAVING子句
(5)通过内部函数提高SQL效率
(6)避免在索引列上使用计算。
(7)提高GROUPBY语句的效率,可以通过将不需要的记录在GROUPBY之前过滤掉。
9.对于大流量网站,采用什么方法解决访问量问题?
1,确认服务器的硬件是否足够支持当前的流量
2,优化数据库的访问
3,禁止外部的盗链
4,控制大文件的下载
5,使用不同主机分流主要流量
6,使用流量分析统计软件
10.一个函数,能够遍历一个文件夹下的所有文件和子文件夹(20分)
functiondir_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\n";
$i++;
}else{
$fullpath=$dir."/".$file;
echo"$fullpath\n";
$i++;
}
}
}
closedir($handle);
}
}
10.2写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。
functionmy_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;
}
}
11、能够使HTML和PHP分离开使用的模板(1分)
答:
Smarty,Dwoo,TinyButStrong,TemplateLite,Savant,phemplate,XTemplate
12、使用哪些工具进行版本控制?
(1分)
答:
cvs,svn,vss;
13、如何实现字符串翻转?
(3分)
英文:
strrev($a)
中文或其他文字:
中文:
GB2312,代码是使用GB2312编码
php
functionreverse($str)
{
$ret="";
len=mbstrwidth(len=mbstrwidth(len=mb_strwidth(str,"GB2312");
for(i=0;i=0;i=0;i{
arr[]=mbsubstr(arr[]=mbsubstr(arr[]=mb_substr(str,$i,1,"GB2312");
}
returnimplode("",array_reverse($arr));
}
print_r(reverse("你好"));
14.PHP的意思(送1分)
PHP是一个基于服务端来创建动态网站的脚本语言,您可以用PHP和HTML生成网站主页
15.MYSQL取得当前时间的函数是?
,格式化日期的函数是(2分)
答:
now(),date()
16.用PHP写出显示客户端IP与服务器IP的代码1分)
答:
打印客户端IP:
echo$_SERVER[‘REMOTE_ADDR’];或者:
getenv('REMOTE_ADDR');
打印服务器IP:
echogethostbyname("")
17、语句include和require的区别是什么?
为避免多次包含同一文件,可用(?
)语句代替它们?
答:
require->require是无条件包含也就是如果一个流程里加入require,无论条件成立与否都会先执行require
include->include有返回值,而require没有(可能因为如此require的速度比include快)
注意:
包含文件不存在或者语法错误的时候require是致命的,include不是
18.http请求返回状态码
400请求无效
401未授权
403请求被禁止
404请求资源不存在
405请求资源被禁止
406无法接受
407要求代理身份验证
500InternalServerError服务端源代码错误
600源站没有返回响应头部,只返回实现内容
19,linux授权码:
600属主有读写权限
644属主有读写权限,属性组有读权限
700属主有读写执行权限
755属主有读写执行权限,属性组有读,执行权限
711属主有读写执行权限,属性组有执行权限
666所有用户都有文件的读写权限
777所有用户都有文件的读写执行权限
20.有一个网页地址,比如PHP开发资源网主页:
答:
方法1(对于PHP5及更高版本):
$readcontents=fopen(""rb");
$contents=stream_get_contents($readcontents);
fclose($readcontents);
echo$contents;
方法2:
echofile_get_contents("
21.在PHP中error_reporting这个函数有什么作用?
(1分)
答:
设置错误级别与错误信息回报
22.JS表单弹出对话框函数是?
获得输入焦点函数是?
(2分)
答:
弹出对话框:
alert(),prompt(),confirm()
获得输入焦点focus()
23.foo()和@foo()之间有什么区别?
(1分)
答:
@foo()控制错误输出
24、mysql_fetch_row()和mysql_fetch_array之间有什么区别?
(1分)
答:
mysql_fetch_row是从结果集取出1行数组,作为枚举
mysql_fetch_array是从结果集取出一行数组作为关联数组,或数字数组,两者兼得
25、GD库是做什么用的?
(1分)
答:
gd库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片。
在网站上GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据生成报表。
26.面向对象编程
有两个重要的概念:
类和对象
类是具备某项功能的抽象模型,实际应用中,还需要对类进行实例化后使用。
这样就引入了对象的概念。
对象是类进行实例化后的一个产物,是一个实体。
封装:
把客观的事物封装成一个抽象的类。
继承:
子类继承父类,可以使用父类的属性和方法。
可以实现接口,同时实现接口中的所有方法
多态:
覆盖和重载子类可以覆盖父类中的方法;一个类中可以同时拥有同一个函数名的方法,但是方法的参数不同,实现的结果也不同。
27.php框架
熟悉YII,Thinkphp还有laravel,symfony2,cakephp
28.mysql存储引擎
ISAM:
查询速度快、增删改慢,支持全文索引、不支持外键、不支持事务
MyISAM:
ISAM升级版
Memory:
数据驻留在内存、速度快、数据管理不稳定、断电后数据全部丢失
InnoDB:
速度较慢、支持外键、支持事务、不支持全文索引
使用的存储引擎
MyISAM:
内容管理系统(新闻、官网、电商、软件下载、房屋、招聘...)可读不可改大部分是浏览信息
InnoDB:
技术型网站(bbs、blog、webo、oa...)
29.数据库操作流程
$link=mysql_connect("localhost","root","root");
mysql_select_db("test",$link);
$sql="select*fromtable";
$result=mysql_query($sql);
while($row=mysql_fetch_****($result)){
$arr[]=$row;
}
$row=mysql_fetch_array($result) 意思:
$row['name']和$row[1]都可以取到值
$row=mysql_fetch_row($result))意思:
$row[1]只有用索引取值,偏移量从0开始。
$row=mysql_fetch_assoc($result))意思:
$row['name']字段名作为索引取值抽取一条记录转为关联数组,失败返回false
30.php加密函数
crypt($str[,$slat])可以完成单向加密功能
md5()
sha1()返回一个40位的十六进制数,
加密扩展库
Mcrypt()和Mash
31、字符串“touppercase”分别用php,shell,js实现将字符串中的字符全部转换成大写并输出。
(5分)
Php实现:
echostrtoupper(‘touppercase’)
Shell实现:
echo"touppercase"|tr'a-z''A-Z'
Js实现:
varstmp1="touppercase";
alert(stmp1.toLocaleUpperCase());//转换成大写
alert(stmp1.toUpperCase())//转换成大写
32.防止SQL注入
1)一般使用addslashes函数
addslashes函数在制定的预定义字符前添加反斜杠
2)对字段和密码MD5加密处理
3)预处理过滤处理
33、用PHP打印出前一天的时间,格式是2006-5-1022:
21:
21
php
//echodate('Y-m-dH:
i:
s',time()-60*60*24
echodate("Y:
m:
dH:
i:
s",strtotime("-1day"));
>
34.如何实现字符串翻转?
其实PHP本身就有字符串翻转的函数:
strrev(),不妨试试echostrrev($str);不过
所有的这三种方法都不能解决中文字符串翻转的问题,会出错的。
代码
php
functionreverse($var)
{
$res="";
for($i=0,$j=strlen($var);$i<$j;$i++)
{
$res=$var[$i].$res;
}
return$res;
}
$tmpvar="wofang";
$res=reverse($tmpvar);
echo$res;
>
35.实现中文字串截取无乱码的方法。
mb_substr()
36.以下哪一句不会把John新增到users阵列?
$users[]='john';
成功把John新增到阵列users。
array_add($users,’john’);
函式array_add()无定义。
array_push($users,‘john’);
成功把John新增到阵列users。
$users||='john';
语法错误。
37.sort()、assort()、和ksort()有什么分别?
它们分别在什么情况下使用?
sort()
根据阵列中元素的值,以英文字母顺序排序,索引键会由0到n-1重新编号。
主
要是当阵列索引键的值无关疼痒时用来把阵列排序。
assort()
PHP没有assort()函式,所以可能是asort()的笔误。
asort()
与sort()一样把阵列的元素按英文字母顺序来排列,不同的是所有索引键都获得保留,特别适合替联想阵列排序。
ksort()
根据阵列中索引键的值,以英文字母顺序排序,特别适合用于希望把索引键排序的联想阵列。
38.以下的代码会产生什么?
为什么?
$num=10;
functionmultiply(){
$num=$num*10;
}
multiply();
echo$num;
由于函式multiply()没有指定$num为全域变量(例如global$num或者
$_GLOBALS['num']),所以$num的值是10。
39.些函式可以用来在现正执行的脚本中插入函式库?
对这道题目不同的理解会有不同的答案,我的第一个想法是插入PHP函式库不外乎
include()、include_once()、require()、require_once(),但细心再想,“函式库”也应该包括com物件和.net函式库,所以我们的答案也要分别包括
com_load和dotnet_load,下次有人提起“函式库”的时候,别忘记这两个函式。
40.foo()与@foo()有什么分别?
foo()会执行这个函式,任何解译错误、语法错误、执行错误都会在页面上显示出来。
@foo()在执行这个函式时,会隐藏所有上述的错误讯息。
很多应用程式都使用@mysql_connect()和@mysql_query来隐藏mysql的错误讯息,我认为这是很严重的失误,因为错误不该被隐藏,你必须妥善处理它们,可能的话解决它们。
41.“===”是什么?
试举一个“==”是真但“===”是假的例子。
“===”是给既可以送回布尔值“假”,也可以送回一个不是布尔值但却可以赋与“假”值的函式,strpos()和strrpos()便是其中两个例子。
问题的第二部份有点困难,想一个“==”是假,但是“===”是真的例子却很容易,
相反的例子却很少。
但我终于找到以下的例子:
if(strpos("abc","a")==true){//这部分永不会被执行,因为"a"的位
置是0,换算成布尔值“假”}if(strpos("abc","a")===true){//这部份
会被执行,因为“===”保证函式strpos()的送回值不会换算成布尔值.}
42、如何修改SESS