PHP面试宝典(三)

0 270
无敌美少女 2017-11-2发布
签名:欢迎访问徕问社区!

101、简述如何得到当前执行脚本路径,包括所得到参数。

echo "http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING'];

//echo "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

?>

102、有一个一维数组,里面存储整形数据,请写一个函数,将他们按从大到小的顺序排列。要求执行效率高。并说明如何改善执行效率。(该函数必须自己实现,不能使用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);

?>

103、请举例说明在你的开发过程中用什么方法来加快页面的加载速度

答:要用到服务器资源时才打开,及时关闭服务器资源,数据库添加索引,页面可生成静态,图片等大文件单独服务器。使用代码优化工具啦

Mysql部分

104、创建poll表,用于记录单选投票用户的数据

字段包括id[ Autoincreace ] , ip , time , iid(用户选则的选项,int型)

写出create上述table的完整sql语句

drop table if exists poll;

/*==============================================================*/

/* Table: poll */

/*==============================================================*/

create table poll

(

id int unsigned not null auto_increment,

ip varchar(15) not null,

time datetime not null,

iid int not null,

primary key (id)

)

105、写出将一个选择2号选项的ip为127.0.0.1的用户在当前时间的投票记录到数据库的SQL

insert into poll (ip,time,iid) values('127.0.0.1',now(),2);

106、写出满足下边条件的SQL语句

  item表的结构为id(就是poll表中的iid) ,descp(用户选择的选项的文字)

  请查询并返回10条记录,包括ip和用户选择的选项的文字

107、现在因为投票人数太多,网站时常出现too many connection的错误,请提供解决方案

方法一:加大MySql的最大连接数

  mysql的最大连接数默认是100, 这个数值对于并发连接很多的数据库应用是远远不够的,当连接请求大于默认连接数后,就会出现无法连接数据库的错误,因此我们需要把它适当调大一些,编辑my.ini

修改max_connections=1000

方法二,不用mysql数据库,改为直接写文件,详细方法参照问题5

若非要用mysql,还可

方法三:由于用mysql语句调用数据库时,在每次之执行语句前,会做一个临时的变量用来打开数据库,所以你在使用mysql语句的时候,记得在每次调用完mysql之后就关闭mysql临时变量

108、在成功解决连接数的问题后,发现程序运行缓慢,经查发现是mysql并发太多,表被锁定的现象严重,请提供解决方案

对于访问量大的,本来就不推荐使用数据库,可以考虑直接写到文本中,根据预测的访问量,先定义假若是100个文件文件名依次为1.txt,2.txt…100.txt,每有用户投票的时候,随机往其中的一个文件中写入投票信息。统计的时候,再对所有文本文件中的数据进行分析。必要的时候,再导入数据库

drop table if exists item;

/*==============================================================*/

/* Table: item */

/*==============================================================*/

create table item

(

id int not null,

descp varchar(200) not null,

primary key (id)

);

select A.ip,b.descp

from poll A,item B

where A.id=B.id

limit 10

109、因为用户实在太多,所以又分配给你两台服务器,你会如何来安排这3台服务器?

对于服务器分配,其实有好几种方案(建议采用LINUX主机),先列出一个解决方案。

1.考虑到电信,网通(南北差异)互访问速度慢的问题,可以让电信的用户走电信的线,网通的走网通的线。大致可以这样分配,国内南方用户(电信用户)拥有一台服务器A;北方用户(网通用户)拥有一台服务器B。国外的用户也可以考虑给一台服务器C。用户访问的时候,首先访问的是针对国外的服务器,那台机器是电信网通的用户访问速度都差不多的(可以考虑就租用香港或是什么地方的),经过服务器C判断后直接跳到相应的服务器。统计时三台机器的数据合起来。

110、现在开始要求同一ip不能重复投票,请指出如何对数据表进行相应的修改

ALTER TABLE `phpinterview`.`poll` ADD unique INDEX `IX_poll_ip`(`ip`);

111、原有数据已经有很多重复ip的数据了,所以我们把它导出为一个txt,格式和上边的poll一致,用TAB键间隔,请写一段程序,删除ip有重复的记录,并统计每个投票选项的投票数

//读取文本并放入数组

$apoll = file("c:\1.txt");

//对每一行数据进行分割,从而获取了一个二维数组

for ($i=0;$i

{

$poll[$i] = split(" ",$apoll[$i]);

}

//获取IP、出现的次数数据

$arrIP=array();

for($i=0;$i

{

$arrIP[$poll[$i][1]]=isset($arrIP[$poll[$i][1]])?$arrIP[$poll[$i][1]]+1:1;

}

//获取选项、投票个数

$arrRes=array();

for($i=0;$i

{

if($arrIP[$poll[$i][1]]==1)

{

$arrRes[$poll[$i][3]]=isset($arrRes[$poll[$i][3]])?$arrRes[$poll[$i][3]]+1:1;

}

}

var_dump($arrRes);

?>

mysql5.0测试版:

/*========================得到测试数据c: .txt=========*/

SELECT *

into outfile 'c: .txt'

FROM `testok`;

/*========================载入临时表=========*/

create TABLE phpinterview.testok(id int,ip varchar(15),time datetime,iid int);

LOAD DATA INFILE 'c: .txt'

into table testok;

/*=========================删除ip有重复的记录=========*/

delete A from testok A,(select ip from testok B group by ip having count(*) >1) B

where A.ip=B.ip

/*================统计每个投票选项的投票数==============================*/

select iid,count(*) from testok B group by B.iid

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

表名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);

代码

drop table if exists user;

/*==============================================================*/

/* Table: user */

/*==============================================================*/

create table user

(

`Name` varchar(20),

Tel varchar(16),

Content varchar(255),

`Date` date

)

insert into user(name,tel,content,`date`) values('张三','13333663366','大专毕业','2006-10-11');

insert into user(name,tel,content,`date`) values('张三','13612312331','本科毕业','2006-10-15');

insert into user(name,tel,content,`date`) values('张四','021-55665566','中专毕业','2006-10-1');

select * from user where name='张三';

代码

header("content-type:text/html; charset=gbk");

$mysql_db=mysql_connect("localhost","root","");

@mysql_select_db("phpinterview",$mysql_db);

echo "

";

mysql_query("set names gbk");

$result=mysql_query("select Name,Tel,Content,Date from user where Name='张三'") or die("错误:".mysql_error());

while($row=mysql_fetch_array($result,MYSQL_BOTH))

{

echo "

";

}

mysql_free_result($result);

echo "

".$row["Name"]."".$row["Tel"]."".

$row["Content"]."

".$row["Date"]."

"

?>

113、如何使用下面的类,并解释下面什么意思?

class test{

function Get_test($num){

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

return $num;

}

}

/**

* 使用md5加密数据...

*

*/

class test{

function Get_test($num){

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

return $num;

}

}

$a=new test();

echo $a->Get_test("123");

?>

114、用javascipt打印“上海爱吉”

<script type="text/javascript">

document.write("上海吉它");

</script>

115、写出SQL语句的格式: 插入,更新,删除

代码

select expression

from tablename

where condition

group by columns asc

with rollup

order by column asc

limit offset,rowcount;

insert into tablename(columname) values(exp);

update tablename set columnname=exp where condition order by column limit rowcount;

delete from tablename where condition order by column limit rowcount;

116、某内容管理系统中,表message有如下字段

id 文章id

title 文章标题

content 文章内容

category_id 文章分类id

hits 点击量

创建上表,写出MySQL语句

CREATE TABLE message(id iNT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, title VARCHAR(200)NOT NULL DEFAULT‘’,content TEXT, category_id INT UNSIGNED NOT NULL DEFAULT 0, hits INT UNSIGNED NOT NULL DEFAULT 0)engine=InnoDB default charset=utf8

117、同样上述内容管理系统:表comment记录用户回复内容,字段如下

comment_id 回复id

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

comment_content 回复内容

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

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

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

118、上述内容管理系统,表category保存分类信息,字段如下

category_id int(4) not null auto_increment;

categroy_name varchar(40) not null;

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

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

drop table if exists Comment;

drop table if exists category;

drop table if exists message;

/*==============================================================*/

/* Table: Comment */

/*==============================================================*/

create table Comment

(

comment_id int unsigned not null,

id int unsigned not null,

comment_content text,

primary key (comment_id)

)

type = InnoDB;

/*==============================================================*/

/* Table: category */

/*==============================================================*/

create table category

(

category_id int not null AUTO_INCREMENT,

category_name varchar(40) not null,

primary key (category_id),

key AK_pk_category_id (category_id)

)

type = InnoDB;

/*==============================================================*/

/* Table: message */

/*==============================================================*/

create table message

(

id int not null,

title varchar(120) not null,

content text not null,

category_id int unsigned,

hit int unsigned,

primary key (id)

)

type = InnoDB;

select A.id,A.title,A.hits,IFNULL(B.num,0)

from message A left join (select id,count(*) as num from comment B group by id) B

on A.id=B.id

order by B.num desc;

 mysql_connect("localhost","root","") or die("db conn error:".mysql_error()); mysql_select_db("phpinterview") or die("db error".mysql_error()); $result=mysql_query("select category_id,category_name from category"); while($row=mysql_fetch_array($result)) { echo "".$row["category_name"].""; } ?> 

119、内容管理系统:用户提交内容后,系统生成静态HTML页面;写出实现的基本思路

直接通过php写入文件,或使用模板来替换标签

120、简单描述用户修改以发布内容的实现流程和基本思路

更新内容,替换静态文件

121、写出以下程序的输出结果

$b=201;

$c=40;

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

echo $a;

?>

122、写出以下程序的输出结果

$str="cd";

$$str="hotdog";

$$str.="ok";

echo $cd;

?>

hotdogok

123、有一表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)

?>

124、给你三个数,写程序求出其最大值。

$var1=1;

$var2=7;

$var3=8;

$max=$var1>$var2?$var1:$var2;

$max=$max>$var3?$max:$var3;

echo $max;

125、写出发贴数最多的十个人名字的SQL,利用下表:

members(id,username,posts,pass,email)

SELECT username,count(*) as num FROM `members` group by username desc order by count(*) desc limit 10

10)如何通过javascript判断一个窗口是i已经被屏蔽。

<script>

var result = window.open("/somepage.aspx");

if(result==null)

{

alert("浏览器不允许弹出窗口");

}

</script>

126、写出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[&rsquo;PHPSESSID&rsquo;];(PHPSESSID可用session_name()函数来修改)

用户A接着访问,这个session id($_COOKIE[&rsquo;PHPSESSID&rsquo;])就会在A每次访问Y的时候传送到站点Y。

在站点Y上,会有这么一个目录,是用来保存SESSION的实际数据的。站点Y接收到session id,然后通过session id,来获得与SESSION数据的关联,并返回SESSION数据。

127、防止SQL注射漏洞一般用 addslashes 函数。

128、请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用?
传值只是把某一个变量的值传给了另一个变量,而引用则说明两者指向了同一个地方。
129、在PHP中error_reporting这个函数有什么作用?
设定php脚本的错误报告级别,说实话,我没怎么用过,我现在用的是C#开发,。
130、请用正则表达式(Regular Expression)写一个函数验证电子邮件的格式是否正确。
/*
检查邮件地址是否为邮件地址,返回逻辑值
*/
functionCheckMailAdr($str){
return(eregi("^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$",$str));
}
131、简述如何得到当前执行脚本路径,包括所得到参数。
说明:例如有一个脚本 www.domain.com,传给他的参数有参数1,参数2,参数3…。传递参数的方法有可能是GET有可能是POST,

那么现在请写出类似:http://www.domain.com/script.php?参数1=值1&参数2=值2.....的结果
关于前执行脚本路径感觉有点歧义:若是得到该脚本在服务器上的绝对路径用 $_SERVER[&lsquo;APPL_PHYSICAL_PATH&rsquo;].若是该脚本的URL则可以用获取
获取所有参数:可以用以下方法:
//获取post的数据
while(list($var, $value) = each($HTTP_POST_VARS))
{
echo"$var = $value n";
}
//获取get方式的数据
while(list($var, $value) = each($HTTP_GET_VARS))
{
echo"$var = $value n";
}

132,有一个一维数组,里面存储整形数据,请写一个函数,将他们按从大到小的顺序排列。要求执行效率高。并说明如何改善执行效率(该函数必须自己实现,不能使用php函数)
可以用冒泡排序

functionBubbleSort($str)
{
for($i=0;$i {
for($j=count($str)-2;$j>=$i;$j--)
{
if($str[$j+1]<$str[$j])
{
$tmp= $str[$j+1];
$str[$j+1]=$str[$j];
$str[$j]=$tmp;
}
}
}
return$str;
}
$str= array(3,6,1,5,9,0,4,6,11);
print_r(BubbleSort($str));
?>

132、负载均衡 

目前主要有三种网络负载平衡转发技术,分别是网络地址转换、直接路由和IP隧道技术,采用不同的方法将客户端发送的包转发到目的服务器上,并确保目的服务器的返回包可以顺利到达客户端。
  ● 网络地址转换


  网络地址转换模式

在目标网络地址转换(DNAT)模式下,提供服务的IP被定义在平衡服务器上,应用服务器只需要定义各自的内部IP地址,但是必须将负载平衡服务器定义为缺省路由,以保证返回客户端的包经过负载平衡服务器,完成第二次地址转换后再送回客户端。

  原理:
  1. 客户发出服务请求
  2. 负载平衡服务器接收到请求,将数据包中目的IP地址改为选中的应用服务器IP地址,然后重新发出数据包
  3. 应用服务器收到后,将应答包发回给负载平衡服务器
  4. 负载平衡服务器收到应答包后将其中的源地址改回成服务IP,发回客户端
  缺点是网络地址转换的性能扩展能力有限,因为请求包和应答包都必须通过平衡服务器,当服务器的节点数量达到20或更多时,平衡服务器可能成为整个系统的瓶颈。因此,这种方式主要适用于网络负载不是很高的场合。

  ● 直接路由
   和那种请求包和应答包都必须通过平衡服务器的网络地址转换不同,平衡服务器在直接路由模式下,将请求调度到不同的实际服务器,实际服务器直接将结果发回 客户端。在大多数应用中,请求的字节数远小于应答的字节数,所以与网络地址转换相比平衡服务器能处理更多的请求。采用直接路由能更大程度提高平衡服务器的 最大节点数和网络吞吐量。甚至于平衡服务器使用100M全双工的网卡,系统的最大数据吞吐量仍可以超过1Gbps。

  直接路由的特点是运用网络分层原理,通过将目标IP包封装在指定MAC地址以太网数据包中欺骗TCP堆栈,因此实际服务器和负载平衡服务器必须在同一个物理网段中,并且在应用服务器上必须将服务IP定义在loopback虚拟网卡上。

  

原理:
  1. 客户发出服务请求
  2. 负载平衡服务器接收到请求,将数据包中网卡物理地址(MAC)改为选中的应用服务器的MAC地址,然后重新发出数据包
  3. 目标应用服务器收到后,将应答包通过路由器直接发回客户端(不经过负载平衡服务器)

直接路由是最高效,网络延时最小的负载平衡技术,但是,为达到MAC地址的欺骗,负载平衡服务器和所有应用服务器必须在同一个物理网段。而且,现在出现操作系统缺省是关闭这种特性的,如FreeBSD,必须显示打开相应的内核开关才可以。不过,目前的主流操作系统,都可以满足直接路由的需求,如WindowsLinux、AIX、Solaris、FreeBSD等。


直接路由转换模式


  ●IP隧道

  与直接路由的方法类似,区别仅仅在于不是通过MAC欺骗来转发数据包,而是通过建立负载平衡服务器和应用服务器之间的IP隧道来完成。

  因为这些服务器的连接是通过IP隧道,平衡服务器和实际服务器可以在不同的局域网甚至是广域网。缺点是所有服务器必须使用IP隧道(IP封装)协议,比直接路由的效率要低,而且,不是所有的操作系统都支持。

133、索引

索引的原理;索引的意义;什么情况下不易用索引,

134、int varchar char text 的最大值和在gbk和ntf_8中所占字符数

135、xss是什么?怎么预防

136、include与require的区别

137、192.168.0.1用二进制和十进制分别如何表示

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

139、执行程序段将输出__0__。

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

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

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

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

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

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

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

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

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

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

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


打赏我,让我更有动力~

收藏   0 | Support  0 | Against  0
Login | Register Can Publish Content

精美音乐推荐

最近热帖
window + php 安装redis扩展 0
返回顶部