php面试题汇总(一)基础知识点

1. 表单中get与post提交方法的区别? 

答: get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息。

2. Cookie和session的区别,禁止了cookie后session能正常使用吗?session的缺点是什么?session在服务器端是存在哪里的?是共有的还是私有的?

COOKIE保存在客户端,用户通过手段可以进行修改,不安全,单个cookie允许的最大值是3k。而SESSION保存在服务器端,相对比较安全,大小没有限制。禁用了cookie之session不能正常使用。

Session的缺点:保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗。

Session保存在服务器端的文件或数据库中,默认保存在文件中,文件路径由php配置文件的session.save_path指定。

Session文件是公有的。

3. 用PHP打印出前一天的时间,格式是2018-5-10 22:21:21

答:echo date('Y-m-d H:i:s', strtotime('-1 days')); 

4. echo(),print(),print_r()的区别

答:echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值。
echo:输出一个或者多个字符串
print():只能打印出简单类型变量的值(如int,string)
print_r():可以打印出复杂类型变量的值(如数组,对象)

5. 用PHP写出显示客户端IP与服务器IP的代码
6. 写一个你常用的Web服务器体系结构,说说你的理解。
7. Web安全都需要考虑哪些
8. http协议使用哪些协议字段控制缓存?
9. Include 与 require的区别,require和require_once的效率哪个高?

PHP在遇到include时就解释一次,如果页面中出现10次include,php就解释10次,而php遇到require时只解释一次,即使页面出现多次require也只解释一次,因此require的执行表率比include高。

Php使用require包含文件时将被包含的文件当成当前文件的一个组成部分,如果被包含的文件中有语法错误或者被包含的文件不存在,则php脚本将不再执行,并提示错误。

Php使用include包含文件时相当于指定了这个文件的路径,当被包含的文件有语法错误或者被包含的文件不存在时给出警告,不影响本身脚本的运行。

Include在包含文件时可以判断文件是否包含,而require则不管任何情况都包含进来。

Require的效率比require_once的效率更高,因为require_once在包含文件时要进行判断文件是否已经被包含。

10. 写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。
function scan_dir($dir) {
    $files = array();
    if($handle = opendir($dir)) { //opendir:打开目录句柄
        while(($file = readdir($handle)) !== false) { //readdir:从目录句柄中读取条目
            if($file != ".." && $file != ".") { //排除根目录
                if(is_dir($dir."/".$file)) { //如果是子文件夹,就进行递归
                    //scandir -列出指定路径中的文件和目录
                    $files[$file] = scan_dir($dir."/".$file);
                } else { 
                    $files[] = $file;
                } 
            }
        }
        closedir($handle);
        return $files;
    }
}

echo "<pre>";
print_r(scan_dir("."));
echo "</pre>";

//通过php函数对目录进行遍历
function loopDir($dir){
    $handle = opendir($dir);
    while (false !== ($file = readdir($handle))) {
        if($file != '.' && $file != '..'){
            echo filetype($dir.'/'.$file).': ' . $file ."\n";
            if(filetype($dir.'/'.$file) == 'dir'){
                loopDir($dir.'/'.$file);
            }
        }
    }
}
loopDir('.');
11. “try catch”使用场景有哪些?
12. 数据缓存在什么场景下可以使用?又在什么情况下慎用?
13. 面对数据库的查询效率越来越差,怎么解决?
14. SQL注入攻击的原理?怎么防止sql注入?

1、过滤掉一些常见的数据库操作关键字:select,insert,update,delete,and,*等

或者通过系统函数:addslashes(需要被过滤的内容)来进行过滤。

2、在PHP配置文件中

Register_globals=off;设置为关闭状态 //作用将注册全局变量关闭。

比如:接收POST表单的值使用$_POST['user'],如果将register_globals=on;直接使用$user可以接收表单的值。

3、SQL语句书写的时候尽量不要省略小引号(tab键上面那个)和单引号

4、提高数据库命名技巧,对于一些重要的字段根据程序的特点命名,取不易被猜到的

5、对于常用的方法加以封装,避免直接暴漏SQL语句

6、开启PHP安全模式

Safe_mode=on;

7、打开magic_quotes_gpc来防止SQL注入

Magic_quotes_gpc=off;默认是关闭的,它打开后将自动把用户提交的sql语句的查询进行转换,把'转为',这对防止sql注入有重大作用。

因此开启:magic_quotes_gpc=on;

15. 写一个函数,取出一个N维数组中所有键名为name对应的键值,组成一个新数组。
function getRes($str,$arr) {
    static $result = []; //static: 函数体中的静态变量在函数调用的时候只会被初始化一次
    foreach($arr as $k=>$val){
        if(!is_array($val)){
            if($k==$str){
                $result[]=$val;
            }
        }else{
            getRes($str,$val);
        }
    }
    return $result;
}
$arr = ['name'=>'admin','subject'=>['name'=>'root','age'=>23,'cate'=>['name'=>'test','sex'=>1]]];
print_r('name',$arr);
/*
Array
(
    [0] => admin
    [1] => root
    [2] => test
)
*/
16. 用PHP写一个双向队列

队列是一种线性表,按照先进先出的原则进行。单向队列:只能从头进,从尾出;双向队列:头尾都可以进出。

<?php
class Deque {
    public $queue = array();
    public $length = 0;
    // 头部入队
    public function frontAdd($val){
        return array_unshift($this->queue, $val);
        $this->getLength();
    }
    // 头部出队
    public function frontRemove(){
        return array_shift($this->queue);
        $this->getLength();
    }
    // 尾部入队
    public function rearAdd($val){
        return array_push($this->queue, $val);
        $this->getLength();
    }
    
    // 尾部出队
    public function rearRemove(){
        return array_pop($this->queue);
        $this->getLength();
    }
    // 清空队列
    public function clear(){
        unset($this->queue);
    }
    // 获取长度
    public function getLength(){
        $this->length = count($this-queue);
    }
}
$goods = new Deque();
$goods -> frontAdd("T-shirt");
$goods -> rearAdd("suit");
echo '<pre>';
print_r($goods);
echo '</pre>';

运行结果:
// 0
// Deque Object
// (
//     [queue] => Array
//         (
//             [0] => T-shirt
//             [1] => suit
//         )
//     [length] => 2
// )
17. 1,1,2,3,5,8,13,21,34...求第30位的数是多少,请用伪代码描述实现方法。
$arr = [1,1];
for($i=2; $i<30; $i++){
    $arr[$i] = $arr[$i-1] + $arr[$i-2];
}
print_r($arr);

运行结果:
// Array ( [0] => 1 [1] => 1 [2] => 2 [3] => 3 [4] => 5 [5] => 8 [6] => 13 [7] => 21 [8] => 34 [9] => 55 [10] => 89 [11] => 144 [12] => 233 [13] => 377 [14] => 610 [15] => 987 [16] => 1597 [17] => 2584 [18] => 4181 [19] => 6765 [20] => 10946 [21] => 17711 [22] => 28657 [23] => 46368 [24] => 75025 [25] => 121393 [26] => 196418 [27] => 317811 [28] => 514229 [29] => 832040 ) 
18. 请写一个函数,实现以下功能: 字符串“open_door” 转换成 “OpenDoor”、”make_by_id” 转换成 ”MakeById”。
function strHandle($str){
    $arr = explode('_', $str);
    $result = '';
    foreach($arr as $val){
        $result .= ucfirst($val);
    }
    return $result;
}

echo strHandle('open_door'); 
// OpenDoor
19. 不使用php函数,用方法写一个反转字符串的函数。

比如:$str='abcdefg',操作后变成$str='gfedcba';

// 方法一:
function str_rev($str){
    for($i=0; true; $i++){
        if(!isset($str[$i])){
            break;
        }
    }
    $result = '';
    for($j=$i-1; $j>=0; $j--){
        $result .= $str[$j];
    }
    return $result;
}

// 方法二:
$str = 'strlen,substr,count';
$res = '';
$i = 0;
while(isset($str[$i]) && $str[$i] != null) {
    $res = $str[$i++].$res;
}
echo $res;
// tnuoc,rtsbus,nelrts
20. 写一个函数,要求不使用array_merge完成多个数组的合并。
// 方法一:
function arr_mer(){
   $arrays = func_get_args();
   $res_arr = [];
   foreach($arrays as $arr){
       if(is_array($arr)){
           foreach($arr as $val){
               $res_arr[] = $val;
           }
       }
   }
   return $res_arr;
}
print_r(arr_mer([1,3,5],[2,4],[6,8]));
// Array ( [0] => 1 [1] => 3 [2] => 5 [3] => 2 [4] => 4 [5] => 6 [6] => 8 )

// 方法二:
function merge(){
   $num = func_num_args()-1; // 数组个数
   $a = func_get_args(); // 所有数组

   for($i=0; $i<=$num; $i++){
       if(is_array($a[$i])){
           for($j=0,$len=count($a[$i]); $j<$len; $j++){
               $arr[] = $a[$i][$j];
           }
       } else {
           die('not a array');
       }
   }
   return $arr;
}
10 人推荐

声明:本文原创发布于加藤非博客,转载请注明出处:加藤非博客 jiatengfei.com 。如有侵权,请联系本站删除。

加藤非博客
请先登录再发表评论
  • 最新评论

  • 总共0条评论