php面试题总结

## 乐居
一、

1、有如下HTML:<img title=’aaaa’ sina_title=’bbbb’ id=’img1′>
1)用js取得________方法取得该对象;
2)用________属性取得属性title的属性值;
3)用________方法取得属性sina_title的属性值;

(1) document.getElementById(‘img1′);
(2) document.getElementById(‘img1′).getAttribute(‘title’);
(3) document.getElementById(‘img1′).getAttribute(‘sina_title’);
2、php中对数组序列化和反序列化的函数分别是______和_______; serialize,unserialize
3、rawurlencode和urlencode函数的区别是__________________;    它们两个都会把URL中的非英文字符进行转义,替换成”%”后跟两位十六进制数,不同的是:rawurlencode 遵守是94年国际标准备忘录RFC 1738,对空格的转义是’%20′;而urlencode的编码实现的是传统做法,和POST表单数据一样会把空格转义成”+”号

4、php中过滤HTML的函数是_______,转义的函数是____________;  strip_tags,  htmlentities转换所有的html标记,htmlspecialchars只格式化& 、’、 “、 <、> 这几个特殊符号。使用htmlentities不指定编码的话遇到中文会乱码
5、写出用正则把HTML中的js脚本过滤掉; 关于正则:正则表达式 – 教程 | 菜鸟教程

<?php
header("Content-type:text/html;charset=utf-8");
 $str = '<script type="text/javascript" src="dd.js"></script>
测试php正则匹配掉js代码测试php正则匹配掉js代码测试php正则匹配掉js代码测试php正则匹配掉js代码测试php正则匹配掉js代码测试php正则匹配掉js代码
<script type="text/javascript" src="123.js"></script>
<script type="text/javascript">
 var aa = "sdsds";
 alert(aa);
</script>
测试php正则匹配掉js代码';
 

 $preg = "/<script[\s\S]*?<\/script>/i";  //里面的?表示尽可能少重复,也就是匹配最近的一个</script>。  [\s\S]匹配所有。\s 是匹配所有空白符,包括换行,\S 非空白符,不包括换行。
 //$preg="/<script.*<\/script>/i";  //不能匹配到换行符,那么多行js就匹配不掉了
 $newstr = preg_replace($preg,"",$str,3);    //第四个参数中的3表示替换3次,默认是-1,替换全部
 echo $newstr;
?>


6、SQL中LEFT JOIN的含义是______________;  左联接,首先将左表中所有数据取出,然后再将满足where条件中的右表数据取出来。当此行的数据并不满足where条件,则返回空。

7、写出三个调用系统命令的函数;即:参数是string $command的函数   php 执行系统命令函数_whatday的专栏-CSDN博客_php执行系统命令函数

system ( string $command , int &$return_var = ? ) : string
exec ( string $command , array &$output = ? , int &$return_var = ? ) : string
passthru ( string $command , int &$return_var = ? ) : void
popen ( string $command , string $mode ) : resource   同 proc_open()
shell_exec ( string $cmd ) : string    同 反引号 `
    echo `whoami`;  echo shell_exec("whoami");

pcntl_exec()

8、josn处理数组的函数是;json_encode,json_decode
9、php中判断变量是否被设置是函数是_______;判断是否为空的是___________;isset,empty
10、error_reporting(“E_ALL”)和ini_set(“display_errors”, “on”)的区别_________;  前者是设置错误显示等级,E_ALL代表提示全部错误(包括notice,warnning和error)。后者是设置让php显示错误,后者的权限大于前者,后者是OFF的话,前者就算是E-ALL也没用。
11、PHP写出显示客户端IP的预定义变量________;提供来路url的是__________; $_SERVER['REMOTE_ADDR'],$_SERVER['HTTP_REFERER']
12、php把utf-8转换成gbk的函数是___________;iconv(‘UTF-8′,’GBK’,$str);
13、php中分割字符串成数组的函数__________,连接数组成字符串的是_______;explode,implode
14、php中类的静态方法怎么使用_____________________________________;在类外部,使用:类名后面跟双冒号,再后面是方法名,类似classname::staticFucntion(),由于静态方法不属于某个对象,而是隶属于整个类,所以要用类名来调用它。

二、
1、如下错误:mysql server not go away,的原因是什么?(大概这是这样)

应该是mysql has gone away吧?
一般情况下是由于max_allowed_packet设置的值过小导致的,max_allowed_packet用来控制缓冲区的包大小,有时在导入数据的时候,此值过小就容易造成缓冲区容量不够。将my.ini或my.cnf中的此值设置大一些即可解决。
还有一种可能是连接数据库时使用了单例模式,多次操作数据库但都使用的是同一个连接,由于mysql处理每个线程也是队列模式,当前一个操作还没执行完毕并且间隔小于wait_timeout所设置的值时就容易出现此问题,解决办法是将wait_timeout的值设置大一些。
2、mysql的静态表和动态表的区别,MyISAM和InnoDB的区别.

静态表是当一个表中没有采用varchar,blob,text这种可变长字段时,此表就是静态表,反之,如果一个表内存在至少一个可变长字段时,或者如果一个表被用ROW_FORMAT=DYNAMIC选项来创建,此表就为动态表。
myisam与innodb的区别在于,myisam不支持事务处理,因为其不用去做commit操作,所以操作起来速度会比innodb较快。innodb在安全性方面要好于myisam,由于支持事务处理,insert,update,delete,select。等操作在默认autocommit=0时,会将每一个操作都当作一个事务,可以进行rollback。如果autocommit=1时,每一个操作后它都会自动提交此事务,会造成执行的效率很慢,大概会比myisam慢10倍。
3、$a = 1; $b = & $a;
unset($a),$b是否还是1,为什么?
unset($b),$a是否还是1,为什么?

都等于1。

在php中,引用赋值不同于指针的感念,他只是将另一个变量名指向了某个内存地址。此题中:$b = &$a;只是将$b这个名字也指向了$a变量所指向的内存地址。unset时只是释放了这个名字的指向,并没有释放内存中的值。另一方面讲unset($a),其实也并未真正立刻释放内存中的值,也只是释放了这个名字的指向而已,该函数只有在变量值所占空间超过256字节长的时候才会释放内存,并且只有当指向该值的所有变量(比如有引用变量指向该值)都被销毁后,地址才会被释放。

三、
1、写出至少三个函数,取文件名的后缀,如文件’/as/image/bc.jpg’,得到 jpg或者.jpg。

function myGetExtName1( $path ){
 //取出最后一个出现.这个字符的索引位置
 $begin = strrpos($path,’.');
 //取出整个字符串长度
 $end = strlen($path);
 //从最后一个.的索引的位置截取到字符串的总长度后的结果返回
 return $begin?substr($path,$begin,$end):’该文件没有扩展名’;
}

function myGetExtName2( $path ){
 return preg_match_all(‘//.[^/.]+/is’,$path,$m)?$m[0][count($m[0])-1]:’该文件没有扩展名’;
}

function myGetExtName3( $path ){
 //找到最后一个出现.字符的索引位置并将其后面的所有字符一起返回
 return strrchr($path,’.')?strrchr($path,’.'):’该文件没有扩展名’;
}
2、写一个函数,算出两个文件的相对路径如 $a = ‘/a/b/c/d/e.php’; $b = ‘/a/b/12/34/c.php’; 计算出 $b 相对于 $a 的相路径。
$a = ‘/a/b/c/d/e.php’;
$b = ‘/a/b/12/34/c.php’;

//求$b相对于$a的相对路径
function getRelativelyPath($a,$b){
 //拆分成数组
 $a = explode(‘/’,$a);
 $b = explode(‘/’,$b);
 $path = ”;

 //将两个数组的索引重置
 $c = array_values(array_diff($a,$b));
 $d = array_values(array_diff($b,$a));
 
 //去除掉a路径的文件名
 array_pop($c);

 //将a路径中的目录名替换为..
 foreach($c as &$v) $v = ‘..’;
 
 //合并两个数组
 $e = array_merge($c,$d);

 //拼接路径
 foreach($e as &$v)
  $path .= $v.’/';

 return rtrim($path,’/');
}
3、用二分法(也叫折半查找法)查找某元素,对像可以是有序数组。

//二分法查找一个数组中是否存在某值
function binSearchWithArray($array,$searchValue){
 global $time;
 if(count($array)>=1){
  $mid = intval(count($array)/2);
 
  echo ‘第’,$time++,’次<br/>’;
  echo ‘当前数组:’;print_r($array);echo ‘<br/>’;
 
  echo ‘查找位置索引:’,$mid,’<br/>’;
  echo ‘值:’,$array[$mid],’<br/><br/>’;

  if($searchValue == $array[$mid]){
   $time–;
   return $searchValue.’被找到了,于第’.$time.’次,索引为’.$mid.’<br/>’;
  }
  elseif($searchValue < $array[$mid]){
   $array = array_slice($array,0,$mid);
   return binSearchWithArray($array,$searchValue);
  }
  else{
   $array = array_slice($array,$mid+1,count($array));
   return binSearchWithArray($array,$searchValue);
  }
 }

 return $searchValue.’没找到<br/>’;
}

$time = 1;

//要查找的数组
$array = array(1,5,8,101,13,19,25,50,60,199,35);
//要查找的值
$searchValue = 13;

//对数组排序,二分法的关键
sort($array);

echo ‘要查找的值为:’,$searchValue,’<br/><br/>’;
echo binSearchWithArray($array,$searchValue);
————————————————
 

## 其他

### 1、array_map  array_walk的区别  

定义:array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。array_map(myfunction,array1,array2,array3...),array_walk() 函数对数组中的每个元素应用用户自定义函数。在函数中,数组的键名和键值是参数。 array_walk(array,myfunction,userdata…)

array_filter — 使用回调函数过滤数组的元素array_walk(array,myfunction)

$a=array(
        array('name'=>'hah','sex'=>'女','age'=>19),
        array('name'=>'嘎嘎','sex'=>'男','age'=>20),
        array('name'=>'呵呵','sex'=>'女','age'=>19),
);
$b = [];
array_map(function($v) use(&$b){
    $b[] = [$v['name'],$v['age']];
}, $a);
print_r($b);
array_map( function(&$v){
    unset($v['name']);
},$a);
print_r($a);
array_walk($a, function(&$v){
    unset($v['name']);
});
print_r($a);

区别小结 : (1)array_walk是用于用户自定义的函数,所以想用array_walk($aIds, "trim");去掉数据元素中的空格是达不到目的的,只能用array_walk($aIds, create_function('&$val', '$val = trim($val);'));    想完成这个需求其实更加合适用$aNewIds = array_map("trim", $aIds);来实现。  (2)array_map用法是array_map(函数名,数组),参数是值,把通过回调处理后的数据返回得到新数组,而不会改变原数组数据。而array_walk的用法是array_walk(数组,函数名),参数是引用,回调函数直接作用于传入的数据,会改变原数组值

异同点
 array_filter() 重点在于过滤(而不是新增)某个元素,当你处理到一个元素时,返回过滤后的数组
 array_map() 重点在于遍历一个数组或多个数组的元素,返回一个新的数组
 array_walk() 重点在于遍历数组进行某种操作
 array_map() 可以处理多个数组,因此函数参数在前,数组参数在后,可以根据实际情况放入多个数组参数
 array_filter() 和 array_walk()对一个数组进行操作,数组参数在前,函数参数在后

关于数据库:

一 大数据量

1、索引 合理设计表结构 使用适合的数据库引擎

合理的字段类型

2、分库分表  分表主键如何选择,分表后的跨表查询怎么解决

3、读写分离主从

二 怎样解决主从延迟问题

三 数据库引擎种类和区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值