北京某企业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优化
8.innodb和myisam的区别有哪些
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面试题,由于本人技术水平有限,有些答案不太准确,仅作为参考,有不妥之处见谅,欢迎在下方评论区给出最优答案