第一篇:PHP程序员面试题
北京融入网络科技有限公司
PHP工程师面试题
1、请写一个实现中文字串截取无乱码的方法。(超出部分用’…..’替换)。
2、ThinkPHP框架中,下列定义有什么不同?
$userModel = M(“User”);
$userMode l= D(“User”);
3、如果让你模拟登陆微信公众平台并设置微信的开发模式中的URL和Token,你会如何去做?(思路或代码皆可)。
4、谈谈对你对PHP的认识或你擅长的技术。
5、假设有一个博客系统,数据库存储采用mysql,用户数量为1000万,预计文章总数为10亿,每天有至少10万的更新量,每天访问量为5000万,对数据库的读写操作的比例超过10:1,你如何设计该系统,以确保其系统高效,稳定的运行?
提示:可以从数据库设计,系统框架,及网络架构方面进行描述,可以自由发挥。
6、你经常去那些网站?有没有自己的博客或git 开源项目。
/ 1
第二篇:PHP程序员面试题
PHP程序员面试题
一、选择题
1、下列不属于PHP的开始结束标记的是:()
A、
B、?>
C、<%%>
D、<>
2、下列程序的输出结果为()
function test($a){
$a=’456’;
}
$a=’123’;
test($a);
echo $a++;
?>
A、456
B、123
C、124
D、会报错
4、下列代码的输出结果为()
function test($i)
{
return++$i+5;
}
echo test(1);
?>
A、6
B、7
C、8
D、空
5、下列代码的输出结果为()
$a=’123’;
$b=&$a;
$a=’789’;
$b=’456’;
echo $a;
?>
A、123
B、456
C、789
D、空
二、简答题:
1、试写一个PHP脚本对数组进行排序,要求将数字数组中所有奇数放在左边,0放在中间,偶数放在右
边。如数组:array(23, 94, 0, 2, 56, 10, 77, 231, 75, 48)
2、表uesr,有如下几个字段:id,username,userpwd,regtime。
(1)、试写出查询该表所有记录的sql语句
(2)、要将id为5的记录中,username字段的值更新为“小王”,请写出sql语句
(3)、要删除id为10的记录,请写出sql语句
(4)、现在要新增一条记录。username的值为:小李;userpwd的值为:123456;regtime的值为:2012-09-01。请写出sql语句
3、试写一个PHP函数遍历一个文件夹【注:只需输出该目录的文件和子目录,无须对子目录再进行遍历】
4、请根据你的理解设计一个站内信系统的数据库,并简要说明字段意义和脚本实现细节
5、请使用PHP写一个文件上传脚本,要求只能上传gif/jpeg图像,并且图像大小不能超过1024KB。
三、附加题
试述你对程序员职业的理解以及你的工作习惯和为人处事的态度。【提示:回答本题时应该实事求是,尽量向面试官表现真实的自我】
第三篇:PHP程序员面试题经典及答案集锦
都是经典
基础题: 1.表单中 get与post提交方法的区别? 答:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息.2.session与cookie的区别? 答:session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放
cookie:用来存储连续訪問一个頁面时所使用,是存储在客户端,对于Cookie来说是存储在用户WIN的Temp目录中的。
两者都可通过时间来设置时间长短
3.数据库中的事务是什么? 答:事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。
简述题:
1、用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2分)答:echo date('Y-m-d H:i:s', strtotime('-1 days'));
2、echo(),print(),print_r()的区别(3分)答:echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用)print()只能打印出简单类型变量的值(如int,string)print_r()可以打印出复杂类型变量的值(如数组,对象)echo 输出一个或者多个字符串
3、能够使HTML和PHP分离开使用的模板(1分)答:Smarty,Dwoo,TinyButStrong,Template Lite,Savant,phemplate,XTemplate
5、使用哪些工具进行版本控制?(1分)答:cvs,svn,vss;
6、如何实现字符串翻转?(3分)答:echo strrev($a);
7、优化MYSQL数据库的方法。(4分,多写多得)答:
1、选取最适用的字段属性,尽可能减少定义字段长度,尽量把字段设置NOT NULL,例如'省份,性别',最好设置为ENUM
2、使用连接(JOIN)来代替子查询: a.删除没有任何订单客户:DELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)b.提取所有没有订单客户:SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)c.提高b的速度优化:SELECT FROM customerinfo LEFT JOIN orderid customerinfo.customerid=orderinfo.customerid WHERE orderinfo.customerid IS NULL
3、使用联合(UNION)来代替手动创建的临时表
a.创建临时表:SELECT name FROM `nametest` UNION SELECT username FROM `nametest2`
4、事务处理: a.保证数据完整性,例如添加和修改同时,两者成立则都执行,一者失败都失败
mysql_query(“BEGIN”);mysql_query(“INSERT INTO customerinfo(name)VALUES('$name1')”;mysql_query(“SELECT * FROM `orderinfo` where customerid=”.$id“);mysql_query(”COMMIT“);
5、锁定表,优化事务处理: a.我们用一个 SELECT 语句取出初始数据,通过一些计算,用 UPDATE 语句将新值更新到表中。
包含有 WRITE 关键字的 LOCK TABLE 语句可以保证在 UNLOCK TABLES 命令被执行之前,不会有其它的访问来对 inventory 进行插入、更新或者删除的操作 mysql_query(”LOCK TABLE customerinfo READ, orderinfo WRITE“);mysql_query(”SELECT customerid FROM `customerinfo` where id=“.$id);mysql_query(”UPDATE `orderinfo` SET ordertitle='$title' where customerid=“.$id);mysql_query(”UNLOCK TABLES“);
6、使用外键,优化锁定表
a.把customerinfo里的customerid映射到orderinfo里的customerid, 任何一条没有合法的customerid的记录不会写到orderinfo里 CREATE TABLE customerinfo(customerid INT NOT NULL, PRIMARY KEY(customerid))TYPE = INNODB;CREATE TABLE orderinfo(orderid INT NOT NULL, customerid INT NOT NULL, PRIMARY KEY(customerid,orderid), FOREIGN KEY(customerid)REFERENCES customerinfo(customerid)ON DELETE CASCADE)TYPE = INNODB;注意:'ON DELETE CASCADE',该参数保证当customerinfo表中的一条记录删除的话同时也会删除order 表中的该用户的所有记录,注意使用外键要定义事务安全类型为INNODB;
7、建立索引: a.格式:(普通索引)-> 创建:CREATE INDEX <索引名> ON tablename(索引字段)修改:ALTER TABLE tablename ADD INDEX [索引名](索引字段)创表指定索引:CREATE TABLE tablename([...],INDEX[索引名](索引字段))(唯一索引)-> 创建:CREATE UNIQUE <索引名> ON tablename(索引字段)修改:ALTER TABLE tablename ADD UNIQUE [索引名](索引字段)创表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引字段))(主键)-> 它是唯一索引,一般在创建表是建立,格式为: CREATA TABLE tablename([...],PRIMARY KEY[索引字段])
8、优化查询语句
a.最好在相同字段进行比较操作,在建立好的索引字段上尽量减少函数操作
例子1: SELECT * FROM order WHERE YEAR(orderDate)<2008;(慢)SELECT * FROM order WHERE orderDate<”2008-01-01“;(快)例子2: SELECT * FROM order WHERE addtime/7<24;(慢)SELECT * FROM order WHERE addtime<24*7;(快)例子3: SELECT * FROM order WHERE title like ”%good%“;SELECT * FROM order WHERE title>=”good“ and name<”good“;
8、PHP的意思(送1分)答:PHP是一个基于服务端来创建动态网站的脚本语言,您可以用PHP和HTML生成网站主页
9、MYSQL取得当前时间的函数是?,格式化日期的函数是(2分)答:now(),date()
10、实现中文字串截取无乱码的方法。(3分)答:function GBsubstr($string, $start, $length){ if(strlen($string)>$length){ $str=null;$len=$start+$length;for($i=$start;$i<$len;$i++){ if(ord(substr($string,$i,1))>0xa0){ $str.=substr($string,$i,2);$i++;}else{ $str.=substr($string,$i,1);} } return $str.'...';}else{ return $string;} }
11、您是否用过版本控制软件? 如果有您用的版本控制软件的名字是?(1分)
12、您是否用过模板引擎? 如果有您用的模板引擎的名字是?(1分)答:用过,smarty
13、请简单阐述您最得意的开发之作(4分)答:信息分类
14、对于大流量的网站,您采用什么样的方法来解决访问量问题?(4分)答:确认服务器硬件是否足够支持当前的流量,数据库读写分离,优化数据表, 程序功能规则,禁止外部的盗链,控制大文件的下载,使用不同主机分流主要流量
15、用PHP写出显示客户端IP与服务器IP的代码1分)答:打印客户端IP:echo $_SERVER[‘REMOTE_ADDR’];或者: getenv('REMOTE_ADDR');打印服务器IP:echo gethostbyname(” 语言中,页面头部的 meta 标记可以用来输出文件的编码格式,以下是一个标准的 meta 语句
请使用 PHP 语言写一个函数,把一个标准 HTML 页面中的类似 meta 标记中的 charset 部分值改为 big5
请注意:
1.需要处理完整的 html 页面,即不光此 meta 语句
2.忽略大小写
3.' 和 “ 在此处是可以互换的
4.'Content-Type' 两侧的引号是可以忽略的,但 'text/html;charset=gbk' 两侧的不行
5.注意处理多余空格
3.写一个函数,算出两个文件的相对路径
如 $a = '/a/b/c/d/e.php';
$b = '/a/b/12/34/c.php';
计算出 $b 相对于 $a 的相对路径应该是../../c/d将()添上 答:function getRelativePath($a, $b){ $returnPath = array(dirname($b));$arrA = explode('/', $a);$arrB = explode('/', $returnPath[0]);for($n = 1, $len = count($arrB);$n < $len;$n++){ if($arrA[$n]!= $arrB[$n]){ break;} } if($len$n, '..'));}
$returnPath = array_merge($returnPath, array_slice($arrA, $n));return implode('/', $returnPath);} echo getRelativePath($a, $b);填空题: 1.在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量__$_SERVER['PHP_SELF']__中;而链接到当前页面的URL记录在预定义变量__$_SERVER['HTTP_REFERER']__ 中
2.执行程序段将输出__0__。
3.在HTTP 1.0中,状态码 401 的含义是____;如果返回“找不到文件”的提示,则可用 header 函数,其语句为____。
4.数组函数 arsort 的作用是__对数组进行逆向排序并保持索引关系__;语句 error_reporting(2047)的作用是__报告所有错误和警告__。5.PEAR中的数据库连接字符串格式是____。
6.写出一个正则表达式,过虑网页上的所有JS/VBS脚本(即把scrīpt标记及其内容都去掉):preg_replace(” //si“, ”newinfo“, $script);7.以Apache模块的方式安装PHP,在文件http.conf中首先要用语句____动态装载PHP模块,然后再用语句____使得Apache把所有扩展名为php的文件都作为PHP脚本处理。
LoadModule php5_module ”c:/php/php5apache2.dll“ , AddType application/x-httpd-php.php, 8.语句 include 和 require 都能把另外一个文件包含到当前文件中,它们的区别是____;为了避免多次包含同一文件,可以用语句__require_once||include_once__来代替它们。
9.类的属性可以序列化后保存到 session 中,从而以后可以恢复整个类,这要用到的函数是____。
10.一个函数的参数不能是对变量的引用,除非在php.ini中把__allow_call_time_pass_reference boolean__设为on.11.SQL中LEFT JOIN的含义是__自然左外链接__。如果 tbl_user记录了学生的姓名(name)和学号(ID),tbl_score记录了学生(有的学生考试以后被开除了,没有其记录)的学号(ID)和考试成绩(score)以及考试科目(subject),要想打印出各个学生姓名及对应的的各科总成绩,则可以用SQL语句____。
12.在PHP中,heredoc是一种特殊的字符串,它的结束标志必须____。编程题: 13.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。答: function my_scandir($dir){ $files = array();if($handle = opendir($dir)){ while(($file = readdir($handle))!== false){ if($file!= ”..“ && $file!= ”.“){ if(is_dir($dir.”/“.$file)){ $files[$file] = scandir($dir.”/“.$file);}else { $files[] = $file;} } } closedir($handle);return $files;} } 14.简述论坛中无限分类的实现原理。答:
function Get_Category($category_id = 0,$level = 0, $default_category = 0){ global $DB;$sql = ”SELECT * FROM category ORDER BY categoryID DESC“;$result = $DB->query($sql);while($rows = $DB->fetch_array($result)){ $category_array[$rows[categoryParentID]][$rows[categoryID]] = array('id' => $rows[categoryID], 'parent' => $rows[categoryParentID], 'name' => $rows [categoryName]);} if(!isset($category_array[$category_id])){ return ”“;} foreach($category_array[$category_id] AS $key => $category){ if($category['id'] == $default_category){ echo ”/n“;} else { echo ”>“.$category['name'].”/n“;} Get_Category($key, $level + 1, $default_category);} unset($category_array[$category_id]);} /* 函数返回的数组格式如下所示: Array([1] => Array([id] => 1 [name] => 一级类别 [level] => 0 [ParentID] => 0)[4] => Array([id] => 4 [name] => 二级类别 [level] => 1 [ParentID] => 1)[9] => Array([id] => 9 [name] => 哈哈 [level] => 2 [ParentID] => 4)[3] => Array([id] => 3 [name] => 二级类别 [level] => 1 [ParentID] => 1)[8] => Array([id] => 8 [name] => aqqqqqd [level] => 2 [ParentID] => 3)[2] => Array([id] => 2 [name] => 二级类别 [level] => 1 [ParentID] => 1)[7] => Array([id] => 7 [name] => 234234 [level] => 2 [ParentID] => 2)[6] => Array([id] => 6 [name] => 333332 [level] => 2 [ParentID] => 2)[5] => Array([id] => 5 [name] => 三级类别 [level] => 2 [ParentID] => 2)[10] => Array([id] => 10 [name] => 66333666 [level] => 3 [ParentID] => 5))*/ //指定分类id,然后返回数组
function Category_array($category_id = 0,$level=0){ global $DB;$sql = ”SELECT * FROM category ORDER BY categoryID DESC“;$result = $DB->query($sql);while($rows = $DB->fetch_array($result)){ $category_array[$rows['categoryParentID']][$rows['categoryID']] = $rows;} foreach($category_array AS $key=>$val){ if($key == $category_id){ foreach($val AS $k=> $v){ $options[$k] = array('id' => $v['categoryID'], 'name' => $v['categoryName'], 'level' => $level, 'ParentID'=>$v['categoryParentID']);$children = Category_array($k, $level+1);if(count($children)> 0){ $options = $options + $children;} } } } unset($category_array[$category_id]);return $options;} ?> array('1' => array('id' => 1, 'parent' => 0, 'name' => '1111'), '2' => array('id' => 2, 'parent' => 0, 'name' => '2222'), '4' => array('id' => 4, 'parent' => 0, 'name' => '4444')), '1' => array('3' => array('id' => 3, 'parent' => 1, 'name' => '333333'), '5' => array('id' => 5, 'parent' => 1, 'name' => '555555')), '3' => array('6' => array('id' => 6, 'parent' => 3, 'name' => '66666'), '7' => array('id' => 7, 'parent' => 3, 'name' => '77777')), '4' => array('8' => array('id' => 8, 'parent' => 4, 'name' => '8888'), '9' => array('id' => 9, 'parent' => 4, 'name' => '9999')));if(!isset($arr[$category_id])){ return ”“;}
foreach($arr[$category_id] AS $key => $cate){ if($cate['id'] == $default_category){ $txt = ”/n“;}else{ $txt1 = ”>“.$cate['name'].”/n“;} $val = $txt.$txt1;echo $val;self::Get_Category($key, $level + 1, $default_category);} }
function getFlush($category_id = 0,$level = 0, $default_category = 0){
ob_start();self::Get_Category($category_id ,$level, $default_category);$out = ob_get_contents();ob_end_clean();return $out;} } $id =$_GET['id'];echo ”";?>
第四篇:PHP程序员面试题
PHP方面:
1:echo print print_r的区别
Echo是PHP语句,print与print_r是函数,语句没有返回值,函数可以有返回值。Print只能打印简单类型变量的值。
Print_r可以打印复杂变量值(数组或对象)
Echo 输出一个或者多个字符串。
2:mysql_fetch_array()与mysql_fetch_row()区别
mysql_fetch_array()返回根据从结果集取得的行生成的数组,如果没有更多行,返回false除了将数据以字段做索引外,还可以用字段名作为索引。
mysql_fetch_row()返回从结果集中取得一行作为枚举数组,返回一个数字索引的数组,偏移量从0开始。
mysql_fetch_array()是mysql_fetch_row()的扩展版本。
3:PHP面向对象中 _set()与_construct的作用
_set()——-用于为属性设置值,_get()获取属性的值
_construct——-在一个类中只能声明一个构造方法,只有在每次创建对象的时候回去调用一次构造方法,不能主动的调用这个方法,所以通常用它执行一些有用的初始化任务。4:PHP中session与cookie的区别
Cookie是保存在客户端的信息,是一种在远程浏览器储存数据并以此来跟踪和识别用户的机制。PHP的http协议的头信息里发送cookie,因此setcookie()函数必须在其他信息输出前调用,和header()函数的限制类似。
Session是保存在服务器端的信息,从这个角度,session比cookie更安全。当会话创建时,服务器返回客户端一个加密的session_id 以标识用户身份,浏览器关闭时,session会销毁,从而session存的值就没有了。
5:如何设置cookie并指定有效的时间
Bool setcookie(string name,string value,int expire,string path,string domain,bool secure,bool httponly)
Name :cookie变量名
Value :cookie 变量值
Expire:有效期结束的时间
Path:有效目录
Domain:有效域名,顶级或唯一
Secure:如果值为1,则cookie只能在https连接上有效,如果为默认值0,http和https都可以
Php设置cookie
$value = 'something from somewhere';
setcookie(“TestCookie”, $value);/* 简单cookie设置 */
setcookie(“TestCookie”, $value, time()+3600);/* 有效期1个小时 */
setcookie(“TestCookie”, $value, time()+3600, “/~rasmus/”, “.example.com”, 1);/* 有效目录 /~rasmus,有效域名example.com及其所有子域名 */
?>
使用header()设置cookie;
header(―Set-Cookie: name=$value[;path=$path[;domain=xxx.com[;]]‖);
后面的参数和上面列出setcookie函数的参数一样.Cookie的机制原理:
a)服务器通过随着响应发送一个http的Set-Cookie头,在客户机中设置一个cookie(多个cookie要多个头).b)客户端自动向服务器端发送一个http的cookie头,服务器接收读取.HTTP/1.x 200 OK
X-Powered-By: PHP/5.2.1Set-Cookie: TestCookie=something from somewhere;path=/
Expires: Thu, 19 Nov 2007 18:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0Pragma: no-cache
Content-type: text/html
这一行实现了cookie功能,收到这行后
Set-Cookie: TestCookie=something from somewhere;path=/
浏览器将在客户端的磁盘上创建一个cookie文件,并在里面写入:
TestCookie=something from somewhere;/
这一行就是我们用setcookie(‗TestCookie‘,'something fromsomewhere‘,'/‘);的结果.也就是用header(‗Set-Cookie: TestCookie=something fromsomewhere;path=/‘);的结果.6:PHP面向对象中的访问控制
Public 表示全局,类内部外部子类都可以访问
Private 表示私有,只有本类内部可以调用
Protected 表示受保护的,只有本类或子类或父类可以访问
7:什么是PHP的MVC,MVC的作用及原理
MVC是一个设计模式,它强制性的使应用程序的输入,处理,输出分开,使用MVC应用程序本分成了三个核心部分:模型,视图,控制器,它们各自处理自己的任务。
MVC的原理:首先控制器接受用户的请求,并决定应该调用用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,然后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。
基本原理:表现层(V)的请求发送到控制器(C),控制器根据请求类型调用业务层(M),最终调用表现层显示。
8:PHP中includerequire 的区别
这两种结构在处理失败之外有不同,include产生一个警告,而require则导致一个致命的错误,换句话说,如果你想在遇到丢失文件时停止处理页面就用require。Include就不是这样,脚本会继续执行。
Require的使用方法如require(―Myfile.php‖);这个表式通常放到PHP程式的最前面,PHP执行前,就会读入require所指定引入的档案,使它变成PHP程式网页的一部分。
Include使用方法和上面相同,这个程式一般放到流程控制的处理区段,php程式网页在读到include的档案时,才将它读进来,这种方式,可以把程式执行时的流程简单化。
当页面执行到require()时,如果require是一个PHP、HTML页面的话,这时就会马上转到去执行该页面了。而include,一般是用于include进来一些inc文件。比如说可以将你的网站的页头和页眉作为一个inc文件,这样在每个PHP文件里面再include进来。include实际只是将你要include的文件嵌入到当前页面当中。而require则是马上去执行你所请求的页面。
——————————————————————————–
incluce在用到时加载
require在一开始就加载
_once后缀表示已加载的不加载
php系统在加载php程序时有一个伪编译过程,可使程序运行速度加快。但incluce的文档仍为解释执行
include的文件中出错了,主程序继续往下执行
require的文件出错了,主程序也停了
所以包含的文件出错对系统影响不大的话(如界面文件)就用include,否则用requireinclude_once()函数,require_once()函数会先检查目标档案的内容是不是在之前就已经导入过了,如果是的话,便不会再次重复导入同样的内容
9:计算两个时间差 2009.5.122009.5.20
$regist1 = ―05/12/2006″;
$regist2 = ―10/05/2007″;
list($month1,$day1,$year1)= explode(―/‖,$regist1);
list($month2,$day2,$year2)= explode(―/‖,$regist2);
$regist1 = mktime(0,0,0,$month1,$day1,$year1);
$regist2 = mktime(0,0,0,$month2,$day2,$year2);$time_difference = $regist2-$regist1;
10:你了解的协议有哪些?HTTP协议的错误提示代表什么?
SMTP(Simple Mail Transfer Protocal)称为简单邮件传输协议,目标是向用户提供高效、可靠的邮件传输。
POP的全称是 Post Office Protocol,即邮局协议,用于电子邮件的接收,它使用TCP的110端口,现在常用的是第三版,所以简称为 POP3
IMAP是Internet Message Access Protocol的缩写,顾名思义,主要提供的是通过Internet获取信息的一种协议。
HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616。
IE提示 HTTP 403 – 禁止访问
IE提示 HTTP 403.9 – 禁止访问:连接的用户过多
IE提示 HTTP 404 – 无法找到文件
IE提示 HTTP 500 – 内部服务器错误
第五篇:php程序员面试题(附答案)
PHP经典面试题(连载4).1 请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用?
答: 传值只是把某一个变量的值传给了另一个变量,而引用则说明两者指向了同一个地方。在PHP中error_reporting这个函数有什么作用?
答: The error_reporting()function sets the error_reporting directive at runtime.PHP has many levels of errors, using this function sets that level for the duration(runtime)of your script.3 请用正则表达式(Regular Expression)写一个函数验证电子邮件的格式是否正确。答: