php常见面试题(未完待更)

一、    时间
1.获取当前时间
date_default_timezone_set('PRC');
echo date('Y-m-d H:i:s');
 
2.获取前一天此时时间
date_default_timezone_set('PRC);
echo date('Y-m-d H:i:s',strtotime('-1 day'));
 
3.cookie和seeion的区别与联系
区别:
①cookie数据存放在用户的浏览器上,session数据存放在服务器上。
②cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,所以考虑到安全应当使用session。
③session会在一定时间内保存在服务器上。当服务器访问增多时,可能产生的SESSION 文件会比较多,这时可以设置分级目录进行 SESSION 文件的保存,效率会提高很多,设置方法为:session.save_path="N;/save_path",N 为分级的级数,save_path 为开始目录。
④单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
⑤所以个人建议:将登陆信息等重要信息存放为SESSION,其他信息如果需要保留,可以放在COOKIE中
 
联系:
①session是通过cookie来工作的,Session数据保存在服务器端的文件(默认保存)或数据库中,客户端通过访问cookie或者URL来获得session_id ,而session和cookie之间是通过$_COOKIE['PHPSESSID']来联系的,通过$_COOKIE['PHPSESSID']可以知道session的id,之后通过它来获得服务端的数据
②因为session_id是唯一记录到数据库中的,所以,在购物网站中通常将用户加入购物车的商品联通session_id记录到数据库中,当用户再次访问是,通过session_id就可以查找到用户上次加入购物车的商品。
③存储session id的方式:i. get或post   ii.cookie(应用广泛)
 
4.多台web服务器如何共享session?
解决办法:第一步,必须做到多台服务器共享客户端的 SESSION ID,第二步,还必须共享服务器端的 SESSION数据
 
第一步:要共享客户端的session id,只需要对 COOKIE 的域(domain)进行特殊地设置即可,默认情况下,COOKIE 的域是当前服务器的域名/IP 地址,而域不同的话,各个服务器所设置的 COOKIE 是不能相互访问的。
 
第二步,共享服务器端的session数据实现方式
 
方法一:
① 将session数据存放到数据库中,使得各个服务器可以对其访问   注意:由于经常会对表进行删除操作,所以使用optimize table 表名,用该语句进行sql优化,对表进行碎片整理,去除空洞
②问题:如果网站的访问量很大的话,SESSION 的读写会频繁地对数据库进行操作,这样效率就会明显降低。考虑到 SESSION 数据一般不会很大,可以尝试用C/Java 写个多线程的程序,用 HASH 表保存 SESSION 数据,并通过 socket 通信进行数据读写,这样 SESSION 就保存在内存中,读写速度应该会快很多。另外还可以通过负载均衡来分担服务器负载。(用一个低端电脑建个数据库专门存放web服务器的session,或者,把这个专门的数据库建在文件服务器上,用户访问web服务器时,会去这个专门的数据库check一下session的情况,以达到session同步的目的。)
方法二:
在获取session数据将其放到cookie中,其他服务器使用时先检查客户端是否存在该session,若有再取出(该方法容易被用户禁用且容易被伪造存在安全隐患)
方法三:(推荐使用)
    利用memacache同步session,它把web服务器的内存组合为一个内存池,这样其他的服务器都可以访问(缺点:内存块有大小之分,容易产生内存碎片)
 
5.http协议中的post和get有何区别?
①GET用于获取信息,POST可用于更新修改信息
②GET放在URL中,因此不安全,而POST传输数据对于用户来说是不可见的,所以相对安全
③在ajax: post不被缓存,get被缓存,所以一般在请求结尾加Math.random();
④SERVER端接受:因为在submit提交的时候是按不同方式进行编码的,所以服务端在接受的时候会按照不同的方式进行接受编码方式:如果传递数据是非-ASCII,那么GET一般是不适应的,所以在传递的时候会做编码处理
 
6.php中web上传文件的原理是什么,如何限制上传文件的大小?
打开php.ini,
参数 设置 说明
file_uploads on      是否允许通过HTTP上传文件的开关。默认为ON即是开
upload_tmp_dir     文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹
upload_max_filesize 8m 望文生意,即允许上传文件大小的最大值。默认为2M
post_max_size 8m 指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M
 
说明
一般地,设置好上述四个参数后,在网络正常的情况下,上传<=8M的文件是不成问题
但如果要上传>8M的大体积文件,只设置上述四项还一定能行的通。除非你的网络真有100M/S的上传高速,否则你还得继续设置下面的参数。
max_execution_time 600 每个PHP页面运行的最大时间值(秒),默认30秒
max_input_time 600 每个PHP页面接收数据所需的最大时间,默认60秒
memory_limit 8m 每个PHP页面所吃掉的最大内存,默认8M
把上述参数修改后,在网络所允许的正常情况下,就可以上传大体积文件了
 
7.遍历一个文件夹下所有文件夹与文件
<html>
    <head>
        <title>遍历文件夹及文件</title>
        <meta http-equiv="Content-type"content="text/html;charset=utf-8">
    </head>
<?php
 function showDirectoryFile($path){
    $handle = opendir($path);
    while($file = readdir($handle)){
        if($file=="."||$file=="..") continue;
        $newFilePath = $path.DIRECTORY_SEPARATOR.$file;
        if(is_dir($newFilePath)){
 
            echo "文件夹:".$newFilePath."<br>";
            showDirectoryFile($newFilePath);
        }
        if(is_file($newFilePath))
            echo '文件'.$newFilePath."<br>";
            echo '<br>';       
    }
    closedir($handle);
}
showDirectoryFile("C:\wamp\www");
?>
</html>
 
8.计算两个日期的时间差
$a='2012-12-31';
    $b='2013-1-3';
    echo floor((strtotime($b)-strtotime($a))/(24*60*60));
 
9.取出路径后缀
    //方法一:explode(分隔符,字符串)
    $url='www.test.com/index.php';
    $arr=explode('.',$url);
    $postion=count($arr)-1;
    echo $arr[$postion].'<br>';
    echo end($arr);
 
    //方法二:pathinfo() 返回一个关联数组包含有 path 的信息,包括以下的数组单元:dirname,basename 和 extension。
    print_r(pathinfo($url,PATHINFO_EXTENSION ));//能处理特殊情况
    $info=pathinfo($url);
    echo $info['extension'];
    //方法三:strrchr()函数的作用是:
    //查找一个字符串在另一个字符串中 末次 出现的位置,并返回从字符串中的这个位置起,一直到字符串结束的所有字符;
    //如果未能找到指定字符,那么函数将返回False。
    echo substr(strrchr($url,'.'),1);//echo substr($url,strrpos($url,'.')+1);
    echo substr($url,strrpos($url,'.')+1);
 
9.PHP如何防止sql注入
方法一:使用预编译语句,绑定变量
$query=”insert into myCity  (Name, CountryCode, District) values(?,?,?)”;
$stmt=$mysqli->prepare($query);
$stmt->blind_param(“sss”,$var1,$var2,$var3);
$var1=’jack’;
$var2=’china’;
$var3=’sdkjfdd’;
$stmt->execute();
 
方法二:使用存储过程(先将sql语句定义在数据库中且尽量避免存储中使用动态的sql)
 
方法三:输入过滤和编码处理
 
方法四:检查数据类型
 
方法五:使用安全编码函数
 
方法六:从数据库角度来说,要使用最小权限原则
 
10.简述MVC
    MVC设计模式:
M 模型 是应用程序中用于处理数据逻辑的那部分,V视图 是应用程序中用于处理数据显示的那部分,C控制器 是应用程序中用于处理用户交互的那部分
MVC框架:
强制使应用程序的的输入、处理、输出分开,M 表示企业数据和业务逻辑,多个视图可以同一个模式,减少了代码的重复性。V 表示用户交互的界面,是一种输出方式且能有用户操作。C 表示接受用户的输入并调用模型和视图完成用户的需求。
 
11.echo(),print(),print_r()的区别
echo 可以打印多个字符串类型
print()只能打印一个字符串类型
print_r() 可以打印复合型 数组,对象等
其中echo与print是PHP语句没有返回值,print_r是PHP函数有返回值
 
12.字符串反转
<?PHP
    
    function getRev($str,$encoding='utf-8'){
        $result = '';
        $len = mb_strlen($str);
        for($i=$len-1; $i>=0; $i--){
            $result .= mb_substr($str,$i,1,$encoding);
        }
        return $result;
    }
    $string = 'OK你是正确的Ole';
    echo getRev($string);

?>
 
13.复选框的type属性值:checkbox
 
14. mysql_info() 函数返回最近一条查询的信息。
 
15.array_push() 函数向第一个参数的数组尾部添加一个或多个元素(入栈),然后返回新数组的长度。
 
16.事务是什么?
事务是执行一个或一组操作时,这些操作在数据库中作为一个整体全部执行或者全部不执行,它具有原子性(也就是说一个事务中的所有操作不可分离)、一致性(必须使数据库处于一致性)、孤立性(未完成的事务不能被其他的用户所见)、持续性(事务一旦提交,就是永久且持续的)。
 
17.Mysql问题
① 某内容管理系统中,表message有如下字段
id 文章id
title 文章标题
content 文章内容
category_id 文章分类id
hits 点击量

创建上表,写出MySQL语句
 

2. 同样上述内容管理系统:表comment记录用户回复内容,字段如下
comment_id 回复id
id 文章id,关联message表中的id
comment_content 回复内容
 


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

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

用一个SQL语句完成上述查询,如果文章没有回复则回复数量显示为0
 
select message.id,message.title,message.hits,count(comment.id) as comment  from message,comment where message.id=comment.id group by comment.id order by c omment desc;
 
posted @ 2016-03-11 23:12  Shaunlan  阅读(410)  评论(0编辑  收藏  举报