北京某企业2019年PHP面试题

北京某企业2019年PHP面试题如下

1.echo、print_r、print、var_dump的区别,平时你经常用哪些,为什么这么用

echo 和 print 的区别

共同点:首先echo 和 print 都不是严格意义上的函数,他们都是语言结构;他们都只能输出 字符串,整型跟int型浮点型数据。不能打印复合型和资源型数据;

而区别是:echo 可以连续输出多个变量,而print只能一次输出一个变量。print打印的值能直接复制给一个变量,如 $a = print "abc123";

而echo 不可以,它没有像函数的行为,所以不能用于函数的上下文。在使用时,echo() 函数比 print()速度稍快。

var_dump()和print_r()的区别

共同点:两者都可以打印数组,对象之类的复合型变量。

区别:print_r() 只能打印一些易于理解的信息,且print_r()在打印数组时,会将把数组的指针移到最后边,使用 reset() 可让指针回到开始处。 而var_dump()不但能打印复合类型的数据,还能打印资源类型的变量。且var_dump()输出的信息则比较详细,一般调试时用得多。

平时用var_dump()较多,因为能输出任何类型的数据,不会报错

2.有以下五个数组$arr1=array(2,3);$arr2=array(3,5);$arr3=array(5,1);$arr4=array(4,2);$arr5=array(1,3);对数组进行如下操作:

a.将五个数组合并成一个数组$arrs;

b.对合并后的数组进行去重;

c.对去重后的数组进行排序;

d.将数组按‘,’拆分成字符串,并输出字符串$str;

a.$arrs = array_merge($arr1,$arr2,$arr3,$arr4,$arr5); var_dump($arrs);

b.$new_arrs = array_unique($arrs); var_dump($new_arrs);

c.sort($new_arrs);var_dump($new_arrs);

 d.$str = implode(',',$new_arrs);var_dump($str);

3.PHP如何获取客户端的IP(要求取得一个int)和服务器端的IP的代码

$ip = $_SERVER["REMOTE_ADDR"];  或者:getenv('REMOTE_ADDR'); 

 转化为int  $intIP =  ip2long($ip);

 $_SERVER["SERVER_ADDR"];

 gethostbyname('www.baidu.com');

4.Linux怎样查找以.txt结尾的文件

find . -name "*.txt"

5.Linux如何查找文件名包含abc关键字的文件

find /etc -name "*abc*"

6.以递归无限级的形式创建文件夹,文件夹格式为‘./public/年/月/日’

function mdir($dir)
{
    if(is_dir($dir) || @mkdir($dir,0777)){
        echo $dir.":dir创建成功"."\n";
    }else{
        $tmp=explode('/', $dir);
        array_pop($tmp);
        $newdir=implode('/', $tmp);
        mdir($newdir);
        if(@mkdir($dir,0777)){
            echo $dir.":dir创建成功!"."\n";
        }
    }
}
mdir('./public/2019/11/28');

7.简单谈谈sql优化

  • 合理的使用缓存来减少对数据库的查询。如利用mybatis的一级缓存,来减少相同sql的查询。
  • 不使用select * from 得查询,加大数据库的压力,使用什么字段,返回什么字段。
  • 避免使用not in 或 <> 不等于的查询,因为会查询全表。
  • 我们自己写的sql很清楚知道,返回的数据有多少。当我们只需要有一个结果返回时,利用limit 1.查出1条后面的就不在查了。减少与数据库的交互。
  • 对于我们经常能够查询的字段(列)或经常与其他表做条件的列,添加索引。(组合索引和单列索引)。
  • 避免使用模糊查询like,‘%数据%’的查询,就算改查询列有索引,索引会失效,而‘数据%’不会使索引失效。
  • 将查询条件更加精确化,提高了查询的速率。
  • in操作的原理是先进性子查询操作,再进行主查询操作(适合主查询是大表,子查询是小表)。
  • exists操作的原理是先进行主查询操作,再到子查询中进行过滤(适合主查询是小表,子查询是大表)。

8.innodb和myisam的区别有哪些

  • 1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
  • 2. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败; 
  • 3. InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。
  • 4. InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
  • 5. Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;5.7以后的InnoDB支持全文索引了
  • 6. MyISAM表格可以被压缩后进行查询操作
  • 7. InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁
  • 8、InnoDB表必须有主键(用户没有指定的话会自己找或生产一个主键),而Myisam可以没有
  • 9、Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI。Innodb:frm是表定义文件,ibd是数据文件; Myisam:frm是表定义文件,myd是数据文件,myi是索引文件

9.你们的数据库支持emoji表情吗,如果不支持,应该怎样做

mysql存储emoji表情的时候,就会报错,如下:
Error updating database. Cause: java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x98\x8A\xF0\x9F…’ for column ‘这是我表中的字段’ at row 1

初步定位是我的数据库是utf8编码,不支持emoji表情,需要改成utf8mb4编码
具体原因:
emoji表情需要4个字节存储
mysql的utf8编码的一个字符最多3个字节,所以不够了就报错

解决如下
1.mysql将字符集 utf8改utf8mb4:
ALTER TABLE 你的表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

2.修改数据源配置

    
    
    
    
    
    

10.如何防止短信盗刷

  •  提交修改是再加一个验证码的 验证(个人比较看好这种方案);
  •  限制同一个账户 一天修改手机号的次数
  •  在修改之前,再重新登录用户名和密码

11.写一个加密接口,可简述

// md5加密数据 添加sign

function md5Encryption($post_data)

{

    $post_data['time_stamp'] = time();

    ksort($post_data);

    $post_data['sign'] = md5( implode('#', $post_data) . '58coin' );

    //print_r($post_data);

    return $post_data;

}   

 

// 验证 md5加密数据sign

function checkMd5Encryption($post_data)

{

    // 验证有效期【60秒】

    if( ($post_data['time_stamp']+60) < time() ):

        echo json_encode(['code'=>400,'msg'=>'overtime!', 'data'=>'']);

        die;

    endif;

    // 验证签名

    $sign = $post_data['sign'];

    unset($post_data['sign']);

    ksort($post_data);

    if($sign != md5( implode('#', $post_data) . '58coin' ) ):

        echo json_encode(['code'=>400,'msg'=>'sign error!', 'data'=>'']);

        die;

    endif;

}

12.谈谈你对复合索引的理解

对复合索引,按照字段在查询条件中出现的频度建立索引。在复合索引中,记录首先按照第一个字段排序。对于在第一个字段上取值相同的记录,系统再按照第二个字段的取值排序,以此类推。因此只有复合索引的第一个字段出现在查询条件中,该索引才可能被使用,因此将应用频度高的字段,放置在复合索引的前面,会使系统最大可能地使用此索引,发挥索引的作用。

13.有一个商城,是买卖实体的店铺,请你设计一下订单表或订单关联表

详见:https://www.2cto.com/database/201803/733490.html

14.一个数据库中有两个表学生信息表user和学生成绩表score表

1)user表中存放学生的id、name等信息,score表中存放id、userid、subject(课程)、score(成绩)等信息

2)user表中的id和score表中的userid相对应,均存放用户Id

写出以下sql语句:

查询出平均分在60分以上的学生的id和name

select user.name,user.id,avg(score) as avg_score
    from user,score
    where user.id=score.userid
    group by user.id,user.name 
        having avg(score) >= 60

注:题目为企业真实php面试题,由于本人技术水平有限,有些答案不太准确,仅作为参考,有不妥之处见谅,欢迎在下方评论区给出最优答案

你可能感兴趣的:(PHP,PHP面试题)