【总结】PHP常见面试题汇总(三)

目录:
1、php如何在文章列表中任意位置或固定位置插入新的文章?比如:3、6位置
2、php如何删除两个数组中有交集的元素?
3、php如何在数组头部和尾部及任意位置插入元素?
4、php如何将二位数组按某一个或多个字段值(升序/降序)排序?数字索引被重置,关联索引保持不变
5、php如何实现APP版本号的比对?
6、php如何获取视频封面图?
7、php中的六种加密解密算法
8、php如何方式SQL注入?
9、php如何将模板标签替换为指定内容?
10、php如何获取当前页面的完整url?
11、php如何强制下载文件?
12、php截取字符串长度(含中文)
13、php如何获取客户端真实IP?
14、php如何记录日志信息到文件中?
15、php如何防止重复提交表单?令牌方式

1、如何在文章列表中任意位置或固定位置插入新的文章?比如:3、6位置

input->get_post("pageNumber",true);//上拉、下拉次数

$contentList = $this->article_model->getArticleByCategory2($cateId, 0, $offset);//$offset=8
$contentList = $this->_getContentList($contentList);//文章列表

$cache_num = 10;	//缓存最新的10条新文章到mc
$size = 2;			//每次从mc获取2篇新文章
$max_times = $cache_num/$size;//5次取完

if($pageNumber <= $max_times){//下拉上拉次数小于等于5的情况,比如:"1、2、3、4、5、..."
	$offset_1 = ($pageNumber - 1) * $size;//查询的开始位置,比如:"0、2、4、6、8"
}else{
	if($pageNumber % $max_times){//下拉上拉次数大于5并且不能被5整除的情况,比如:"6、7、8、9、11、..."
		$num = $this->article_model->getPublishCountArticleByCategory($cateId);//获取mc中数据量
		if($num >= $cache_num){//mc中新文章大于等于10篇的情况
			$offset_1 = ($pageNumber % $max_times - 1) * $size;//轮询
		}else{//mc中新文章小于10篇的情况
			$offset_1 = $max_times * 2;//不轮询
		}
	}else{//下拉上拉次数大于5并且正好能被5整除的情况,比如:"10、15、20、25、30、..."
		$num = $this->article_model->getPublishCountArticleByCategory($cateId);//获取mc中数据量
		if($num >= $cache_num){//mc中新文章大于等于10篇的情况
			$offset_1 = $cache_num - $size;//轮询
		}else{//mc中新文章小于10篇的情况
			$offset_1 = $max_times * 2;//不轮询
		}
		
	}
}

$publishList = $this->article_model->getPublishArticleByCategory($cateId, $offset_1,$size,$cache_num);//随机获取两条新文章
$publishList = $this->_getPublishList($publishList);//从mc中获取2篇新文章插入到文章列表中
$content_count = count($contentlist);
$publish_count = count($publishlist);
if(!empty($publishList)){//3、6位置是预留位置
    if( ($content_count >= 3) && ($publish_count >= 1) ){
		$publishList_new[0] = $publishList[0];//组装成一个二维数组
		array_splice($contentList,3-1,0,$publishList_new);//第3的位置(索引为3-1)插入第1篇新文章
	}

	if( ($content_count >= 6) && ($publish_count >= 2) ){
		$publishList_new[0] = $publishList[1];//组装成一个二维数组
		array_splice($contentList,6-1,0,$publishList_new);//第6的位置(索引为6-1)插入第2篇新文章
	}
}

?>

2、如何删除两个数组中有交集的元素?

foreach($content_list_temp_recommend as $k=>$v){
	$kk=array_search($v['aid'], $aid_arr_temp);//$v['aid']必定是$aid_arr_temp数组内元素之一的情况
	$msg.=$aid_arr_temp[$kk].",";
	if($kk !== false){//只要不是false就是找到了
		unset($aid_arr_temp[$kk]);//删除后,索引键保持不变
	}
}
$aid_arr=  array_values($aid_arr_temp);//经过array_values()函数处理过后,索引键重新分配。

3、如何在数组头部和尾部及任意位置插入元素?

①插入元素
array_unshift();//在数组头部插入一个或多个元素  
array_push();//在数组尾部插入一个或多个元素 
array_splice($arr,$start,0,$arr1);//在数组的第$start+1个位置插入新元素(指的是头部和中部任意位置,但不包括尾部),注意:参数3一定要是0
②删除元素
array_shift();//删除数组中首个元素,并返回删除后的值
array_pop();//删除数组的最后一个元素(出栈),并返回删除后的值

4、如何将二位数组按某一个或多个字段值(升序/降序)排序?数字索引被重置,关联索引保持不变

$arr=array(
	array('id'=>1,'name'=>'will','age'=>23),
	array('id'=>2,'name'=>'myth','age'=>32),
	array('id'=>3,'name'=>'allen','age'=>27),
	array('id'=>4,'name'=>'martin','age'=>23)
);

foreach($arr as $k=>$v){
	$tag1[]=$v['age']; //age排序字段
	$tag2[]=$v['id'];  //id排序字段
}
//相当于 select * from $arr order by $tag1 DESC,$tag2 ASC;//特点:$tag1、$tag2、$arr数组的元素个数必须要一致
array_multisort($tag1,SORT_DESC,$tag2,SORT_ASC,$arr);//根据年龄从大到小排列,年龄相同则按id升序排列

echo "
";print_r($arr);exit;
?>

3, 'name' => 'asdfsdf'),
	array('id' =>1, 'name' => '12'),
	array('id' =>4, 'name' => '10sdf'),
	array('id' =>2, 'name' => 'ada'),
	array('id' =>5, 'name' => 'aasdfbc')
);

arrSortByField($list,'name','strlen');//按照 "name" 列的值长度进行排序
echo "
";print_r($list);
arrSortByField($list,'id');//按照 "id" 列的值大小进行排序
echo "
";print_r($list);


?>

5、APP版本号的比对

 $updateVersion['minVersion']){
            return false;
        }

        if($currentVersion['fixVersion'] < $updateVersion['fixVersion']){
            return true;
        }
    }

    return false;
}

function getVersion($version){
    $result = array();
    if(strstr($version,".")){
        $data = explode(".",$version);
        $result['mainVersion'] = $data[0];
        if(isset($data[1])){
            $result['minVersion'] = $data[1];
        }else{
            $result['minVersion'] = 0;
        }

        if(isset($data[2])){
            $result['fixVersion'] = $data[2];
        }else{
            $result['fixVersion'] = 0;
        }
    }

    return $result;
}


echo "
";print_r(_diffVersion("2.0.0","2.0.01"));//true-需要升级  false-不升级

?>

6、获取视频封面图

 $v) {
			$destFilePath = $filename.$v.".jpg";
            $command = "/usr/bin/ffmpeg -i {$file} -y -f image2 -ss {$v} -vframes 1 -s 640x360 {$destFilePath}";
			exec($command);
			//chmod($filename.$v."jpg",0644);
			$destUrlPath = str_replace("/data/images/", "http://img.baidu.cn/", $destFilePath);
			$selected = $k == 0 ? "1" : "0";//默认将第一张图片作为封面图
			array_push($result,array($destUrlPath,$selected));
		}

		return $result;
    }

$fileUrl="http://img.baidu.cn/14221916FLVSDT1.mp4"
getCoverImages($fileUrl);//截取第8、15、25秒为封面图

?>

7、php加密解密:php加密和解密函数通常可以用来加密一些有用的字符串存放在数据库里或作为各个子系统间同步登陆的令牌,并且通过解密算法解密字符串,该函数使用了base64和MD5加密和解密。

①第一种加密解密算法

②第二种加密解密算法:

③第三种加密解密算法:

④第四种加密解密算法:

"; 
echo $decrypt."
"; ?>
⑤第五种加密解密算法:discuz中使用的加密解密算法

项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理。最常见的应用在用户登录以及一些API数据交换的场景。最常见的应用在用户登录以及一些API数据交换的场景。加密解密原理一般都是通过一定的加密解密算法,将密钥加入到算法中,最终得到加密解密结果。

 0) &&  substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {   
            return substr($result, 26);   
        } else {   
            return '';   
        }   
    } else {   
        // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因   
        // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码   
        return $keyc.str_replace('=', '', base64_encode($result));   
    }   
} 

$str = 'abcdef'; 
$key = 'www.helloweba.com'; 
echo authcode($str,'ENCODE',$key,0); //加密 
$str = '56f4yER1DI2WTzWMqsfPpS9hwyoJnFP2MpC8SOhRrxO7BOk'; 
echo authcode($str,'DECODE',$key,0); //解密 

?>
⑥第六种加密解密算法:

8、php如何方式SQL注入?我们在查询数据库时,出于安全考虑,需要过滤一些非法字符防止SQL恶意注入

9、php如何将模板标签替换为指定的内容?

 '','{/b}' => '','{br}' => '
'); echo stringParser($string,$replace_array); ?>
10、php如何获取当前页面的url?如:"https://www.baidu.com/index.php?username=xiaoqiang"
11、php如何强制下载文件?

12、php截取字符串长度(含中文)

 $sublen) return join('', array_slice($t_string[0], $start, $sublen))."..."; 
        return join('', array_slice($t_string[0], $start, $sublen)); 
    }else{ 
        $start = $start*2; 
        $sublen = $sublen*2; 
        $strlen = strlen($string); 
        $tmpstr = ''; 
 
        for($i=0; $i<$strlen; $i++){ 
            if($i>=$start && $i<($start+$sublen)){ 
                if(ord(substr($string, $i, 1))>129){ 
                    $tmpstr.= substr($string, $i, 2); 
                }else{ 
                    $tmpstr.= substr($string, $i, 1); 
                } 
            } 
            if(ord(substr($string, $i, 1))>129) $i++; 
        } 
        if(strlen($tmpstr)<$strlen ) $tmpstr.= "..."; 
        return $tmpstr; 
    } 
} 

$str = "jQuery插件实现的加载图片和页面效果"; 
echo cutStr($str,16);//结果:jQuery插件实现的加载图片和...

?>
13、php如何获取客户端真实IP?

14、php如何记录日志信息到文件中?

15、php如何防止重复提交表单?

我们提交表单的时候,不能忽视的一个限制是防止用户重复提交表单,因为有可能用户连续点击了提交按钮或者是攻击者恶意提交数据,那么我们在提交数据后的处理如修改或添加数据到数据库时就会惹上麻烦。

那么如何规避这中重复提交表单的现象出现呢?我们可以从很多方面入手,首先从前端做限制。前端JavaScript在按钮被点击一次后禁用,即disabled,这个方法简单的防止了多次点击提交按钮,但是缺点是如果用户禁用了javascript脚本则失效。第二,我们可以在提交后做redirect页面重定向,即提交后跳转到新的页面,主要避免F5重复提交,但是也有不足之处。第三,就是数据库做唯一索引约束。第四,就是做session令牌验证。

我们现在来了解下简单的利用session token来防止表单重复提交的方法。

我们在表单中加一个input隐藏域,即type="hidden",其value值用来保存token值,当页面刷新的时候这个token值会变化,提交后判断token值是否正确,如果前台提交的token与后台不匹配,则认为是重复提交。

 
    
以上是一个简单的防止重复提交表单的例子,仅供参考。那么实际项目开发中,会对表单token做更复杂的处理,即我们说的令牌验证。可能要做的处理有:验证来源域,即来路,是否为外部提交;匹配要执行的动作,是添加、修改or删除;其次最重要的是构建token,token可以采用可逆的加密算法,尽可能复杂,因为明文还是不安全的。令牌验证的具体算法可以参考各大PHP框架,如ThinkPHP提供了很好的令牌验证功能。

你可能感兴趣的:(【php面试题汇总】)