PHP试题-1
社招笔试题-2014精简版
PHP系统部分
- POST和GET有何区别?
1、GET方式通过URL提交数据,数据在客户端URL中可见;POST方式,数据放置在
HTML HEADER
内提交。
2、GET将表单中de数据按key=value
的形式,追加到URL后面,且两者使用“?”连接,而各个变量间使用 “&”连接;Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到所指向URL。
3、GET方式提交的数据最多只能有1024字节(1kb),而POST没有此限制。
4、安全性问题。如(1)中所说,Get 请求的参数会显示在地址栏,而 Post 不会。因此如果数据是中文且非敏感数据,可使用 get;如果用户输入的数据非中文字符且包含敏感数据,建议使用 POST。
5、特殊字符转义问题,GET请求会导致某些特殊字符无法正常传递到后端,如&#+
,需要前端显示转义特殊字符。
- 如何通过php的环境变量获取发起请求的客户端 网页地址 和 IP 地址?
$_SERVSR[‘REQUEST_URI’]
$_SERVER[‘REMOTE_ADDR’]
- PHP的当前脚本名称(不包括路径和查询字符串)记录在预定义变量____中;链接到当前页面的URL记录在预定义变量____中。
$_SERVER['PHP_SELF'];
$_SERVER["HTTP_REFERER"];
- 命令行调用php程序,如何传递参数、获取环境参数。
传参:bin/php –f xxxx.php arg1 arg2 arg3
获取:使用$argv获取参数,$argv[1] , $argv[2] , $argv[3]
- HTTP的状态码 401、302 的含义是什么;如果想返回“找不到文件”的提示,可使用 header 函数设置,其语句是什么?
1、
401:Unauthorized 客户端试图未经授权访问受密码保护的页面
302:临时重定向,not Found, 类似于301,但新的URL应该被视为临时性替代,而非永久性。
2、
header("HTTP/1.0 404 Not Found");
PHP语法部分
- 语句 include 和 require 都能把另外一个文件包含到当前文件中,它们的区别是____;为了避免多次包含同一文件,可以用语句____来代替它们。
include() 产生一个警告而require() 则导致一个致命错误。
Include_once() 和 require_once()
- 用PHP打印出前一天的时间,格式是:2011-1-10 10:17:57。
echo date('Y-m-d H:i:s', strtotime('-1 day'));
- 写一个程序,远程抓取图片,并存取在本地服务器。并且被抓取的服务器有对
refer
做控制,例如refer必须要求是http://www.xxx.com/*
)。
提供一个思路:
抓取函数可使用:file_get_contents() 、fopen、curl
refer限制:需要mock对应的header信息规避反爬,然后匹配出<img> 标签,存取到本地。
- 请说明在php.ini中safe_mode开启之后对PHP系统函数的影响
system,passthru,exec,shell_exec,popen,phpinfo
等等大部分的文件操作函数
- 数组函数 arsort(), sort(),krsort(), ksort() 的作用和应用场景。
Sort: 对数组值做正向排序
Arsort: 对数组进行逆向排序并保持索引关系
Ksort:对数组按照键名排序
Krsort:对数组按照键名逆向排序
- 类的属性可以序列化后保存到 session 中,从而以后可以恢复整个类,这要用到的函数。
serialize(), unserialize()
序列化、反序列化
- 写一个函数,实现字符串翻转。
// 1,直接使用现有函数:strrev($str);
strrev("Hello world!"); // 输出 "!dlrow olleH" ;
// 2. 简单实现方式
function myfunc_strrev($tmpstr){
if (empty($tmpstr)) {
return '';
}
$tmpArr = str_split($tmpstr);
krsort($tmpArr);
return implode('', $tmpArr);
}
// 3. 复杂实现方式
function myfunc_strrev2($tmpstr){
if (empty($tmpstr)) {
return '';
} elseif (strlen($tmpstr) === 1) {
return $tmpstr;
} else {
$tmpLen = strlen($tmpstr);
$retstr = '';
for ($i=1; $i <= $tmpLen; $i++) {
$retstr .= substr($tmpstr, -$i, 1);
}
return $retstr;
}
}
- 写出如下程序的输出结果
<?php
$str1 = null;
$str2 = false;
echo $str1==$str2 ? '相等' : '不相等';
$str3 = '';
$str4 = 0;
echo $str3==$str4 ? '相等' : '不相等';
$str5 = 0;
$str6 = '0';
echo $str5===$str6 ? '相等' : '不相等';
?>
答案:相等 相等 不相等(
===
,全等判断模式会判断变量类型)
MYSQL部分
- SQL 中left join, right join和inner join的含义和区别是什么。
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行
- mysql_fetch_row() 和 mysql_fetch_array()的区别。
mysql_fetch_array() 是 mysql_fetch_row() 的扩展版本。除了将数据以数字索引方式储存在数组中之外,还可以将数据作为关联索引储存,用字段名作为键名。
另有一点必须指出,用 mysql_fetch_array() 并不明显比用 mysql_fetch_row() 慢,而且还提供了更多的值。
另外还可以使用,mysql_fetch_assoc()
和用mysql_fetch_array()
加上第二个可选参数 MYSQL_ASSOC 完全相同。它仅仅返回关联数组。
-
mysql中explain的详细用法,结合空间耗时长的SQL语句进行分析说明。
TODO:思路:看其对explain用法的理解程度。 -
用户图片表(图片id,用户id,相册id,图片名称,图片描述,上传时间,审核状态),请完用SQL完成以下需求:
创建用户图片表,图片id为主键(字段名用英文);
插入一条数据;
把表中用户id为1001的用户的图片审核状态修改为0;
查出用户id为1001的用户最近上传的10张图片;
查出用户id为1001的用户一共上传过多少张图片;
查出用户id为1001的用户图片数最多的相册;
假设以上sql是业务中常用的sql,写出为该表创建索引的语句。
思路:考察基本的SQL语法(表设计、建表、查询、索引建立)
(1) create table user_pic (
pic_id int(10) unsigned NOT NULL auto_increment,
user_id int(10) unsigned NOT NULL,
album_id int(10) unsigned NOT NULL,
pic_name varchar(100) NOT NULL,
pic_desc varchar(255) default '',
up_time int(10) unsigned NOT NULL,
status tinyint(2) unsigned NOT NULL default '1',
PRIMARY KEY (pic_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
图片描述字段内容需要根据内容大小考虑单独拆表。
(2) INSET INTO user_pic(user_id,album_id,pic_name,pic_desc,up_time,status) VALUES(1,2,'aaa','图片描述',10012312312,1);
(3) UPDATE user_pic SET status = 0 WHERE user_id=1001;
(4) SELECT pic_id,pic_name,pic_desc FROM user_pic WHERE user_id=1001 AND stauts=1 ORDER BY up_time DESC LIMIT 10 ;
(5) SELECT count() as c FROM user_pic WHERE user_id=1001 AND stauts=1;
(6) SELECT album_id,count() AS c FROM user_pic WHERE user_id=1001 AND status=1 GROUP BY album_id ORDER BY c DESC LIMIT 1;
(7) 创建uid_stauts_uptime(user_id,stauts,up_time)联合索引,
uid_stauts_album(user_id,stauts,album_id)联合索引
Linux部分
- 输入文件的最后5行到另一个文件中。
tail –n 5 a.txt > b.txt
-
查找文件中包含hello的行。
Grep “hello” a.txt -
查找和删除当前目录下所有目录名为CVS的子目录的命令。
find ./ -name CVS -exec rm -rf {} ; -
Vi编辑器中,如何替换指定的字符串。
:%s/aaaaa/bbbb/g
或者使用Visual 的模式、手动寻找替换等
设计、编程部分
- 设计一个Feed系统,主要数据包括用户、最新动态、评论及转发功能,要求系统有很高的实时性,能够支持千万级以上的访问量,如何设计存储架构,能够使用户方便的访问自身及好友最新动态及其评论?当出现突发事件时如何处理?如何实现搜索功能?
思路:
Feed就是一条twitter或一条好友动态。该功能面临的挑战是:每天产生成千上万条数据,数据推送的需要实时性等,做网站其实最大的难点就是对海量数据和高并发的处理。
最常见的是这3种:推模式、拉模式、推拉结合模式。
- 使用PHP实现二分查找算法,参数是一个数组。
//$k为要查找的关键字(注:待查找的数组元素为奇数个)
function bin_sch($array, $low, $high, $k)
{
if ($low <= $high)
{
$mid = intval(($low+$high)/2);
if ($array[$mid] == $k)
{
return true;
}
elseif ($k < $array[$mid])
{
return bin_sch($array, $low, $mid-1, $k);
}
else
{
return bin_sch($array, $mid+1, $high, $k);
}
}
return false;
}