php基础面试题

本文来自:http://bbs.51cto.com/thread-686966-1.html
1、用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2分)
<?php
//echo date('Y-m-d H:i:s',time()-60*60*24
echo date("Y:m:d H:i:s",strtotime("-1 day"));
?>


2、echo(),print(),print_r()的区别(3分)

echo是语言结构,无返回值;print功能和echo基本相同,不同的是print是函数,有返回值;print_r是递归打印,用于输出数组对象

3、能够使HTML和PHP分离开使用的模板(1分)
so much,其实PHP本身就是一种模版引擎,我用过的是smarty,常见的还有PHPLib,FastTemplate,Savant这里有个模板引擎列表:http://www.sitepoint.com/forums/showthread.php?t=123769


4、使用哪些工具进行版本控制?(1分)
CVS和SVN,SVN号称下一代CVS,功能强大,不过CVS是老牌,市占率很高.我一直用SVN,题目是问用什么工具,呃,这个可能需要这么回答:CVS Server on Apache作服务端,WinCVS作客户端;Subversion on Apache/DAV 做服务端,TortoiseSVN做客户端,或者Subclipse做客户端


5、如何实现字符串翻转?(3分)
<?php
function reverse($var)
{
$res="1";
for($i=0,$j=strlen($var);$i<$j;$i++)
{
$res=$var[$i].$res;
//echo $var[$i]."...";
}
return $res;
}
$tmpvar="abcde";
$res=reverse($tmpvar);
echo $res;
?>

---------------------------------------------------------------

6、优化MYSQL数据库的方法。(4分,多写多得)

(1).数据库设计方面,这是DBA和Architect的责任,设计结构良好的数据库,必要的时候,去正规化(英文是这个:denormalize,中文翻译成啥我不知道),允许部分数据冗余,避免JOIN操作,以提高查询效率
(2).系统架构设计方面,表散列,把海量数据散列到几个不同的表里面.快慢表,快表只留最新数据,慢表是历史存档.集群,主服务器Read & write,从服务器read only,或者N台服务器,各机器互为Master
(3).(1)和(2)超越PHP Programmer的要求了,会更好,不会没关系.检查有没有少加索引
(4).写高效的SQL语句,看看有没有写低效的SQL语句,比如生成笛卡尔积的全连接啊,大量的Group By和order by,没有limit等等.必要的时候,把数据库逻辑封装到DBMS端的存储过程里面.缓存查询结果,explain每一个sql语句
(5).所得皆必须,只从数据库取必需的数据,比如查询某篇文章的评论数,select count(*) ... where article_id = ? 就可以了,不要先select * ... where article_id = ?然后msql_num_rows.
只传送必须的SQL语句,比如修改文章的时候,如果用户只修改了标题,那就update ... set title = ? where article_id = ?不要set content = ?(大文本)
(6).必要的时候用不同的存储引擎.比如InnoDB可以减少死锁.HEAP可以提高一个数量级的查询速度

7、PHP的意思(送1分)

Hypertext Preprocessor 个人网页超文本预处理器 (服务器端使用的脚本语言)

8、MYSQL取得当前时间的函数是?,格式化日期的函数是(2分)

mysql> select now(); 
Date_Format('2009-01-28','%Y-%m-%d')  

9、实现中文字串截取无乱码的方法。(3分)

---------------------------------------------------------------
$length) { $str=''; $len=$start+$length; $i = $start; while($i<$len) { if(ord(substr($string, $i, 1))>=128) { $str.=substr($string, $i, 3); $i = $i+ 3; } else { $str.=substr($string, $i, 1); $i ++; } } return $str; } else { return $string; } } ?> 
10、您是否用过版本控制软件? 如果有您用的版本控制软件的名字是?(1分)
SVN SVS 
11、您是否用过模板引擎? 如果有您用的模板引擎的名字是?(1分)
smarty
12、请简单阐述您最得意的开发之作(4分)

13、对于大流量的网站,您采用什么样的方法来解决访问量问题?(4分)

可以根据需要以下方法
1、    PHP缓存
2、    生成html静态页面
3、    使用主辅数据库,把数据库的读写分开
4、    使用负载均衡器和多台服务器


-----------------------------------------------------------------

14、用PHP写出显示客户端IP与服务器IP的代码1分)

<?php 
$ip=gethostbyname ("");
echo $ip; 
?>

15、语句include和require的区别是什么?为避免多次包含同一文件,可用(?)语句代替它们? (2分)
include():这个函式容许你在脚本中把同一个档案插入多次,若果档案不存在,它会发出系统警告并继续执行脚本。
include_once():它跟 include() 的功能相似,正如它的名字所示,在脚本的执行期间,有关档案只会被插入一次。
require():跟 include() 差不多,它也是用来在脚本中插入其他档案,但若果档案不存在,它会发出系统警告,这个警告会引致致命错误令脚本中止执行


16、如何修改SESSION的生存时间(1分).

方法一:
将php.ini 中session.gc_maxlifetime 设置为 9999(默认为 1440)重启 apache 即可
方法二:
$savePath = "./session_save_dir/";
$lifeTime = 24 * 3600;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
方法三:
setcookie() 或session_set_cookie_params($lifeTime)


17、有一个网页地址, 比如PHP研究室主页: http://www.phpv.net/index.html,如何得到它的内容?($1分)

$content=file_get_contents('http://www.windsfly.cn/index.asp');

18、在HTTP 1.0中,状态码401的含义是(?);如果返回“找不到文件”的提示,则可用 header 函数,其语句为(?);(2分)

401表示未授权;header("HTTP/1.0 404 Not Found");

19、在PHP中,heredoc是一种特殊的字符串,它的结束标志必须?(1分)

heredoc的语法是用"<<<"加上自己定义成对的标签,在标签范围內的文字视为一个字符串
<?php
$str = <<<EOD
I saw a dog yesterday.
EOD;
?>
需要注意的是:
1、"<<<"后面的EOD是自己定义的标签名称,必须要成对,而且后面要加上分号表示结束。
2、结束的标签前面最好不要有空格,以免发生错误


20、谈谈asp,php,jsp的优缺点(1分)

21、谈谈对mvc的认识(1分)

MVC本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程 序可以使用不同的表现形式。比如一批统计数据你可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。

-------------------------------------------------------------------

22、写出发贴数最多的十个人名字的SQL,利用下表:members(id,username,posts,pass,email)(2分)

SELECT username,posts FORM members ORDER BY posts DESC LIMIT 10; 

23. 请说明php中传值与传引用的区别。什么时候传值什么时候传引用?(2分)

按值传递:函数范围内对值的任何改变在函数外部都会被忽略
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。
按引用传递则不需要复制值,对于性能提高很有好处。



24. 在PHP中error_reporting这个函数有什么作用? (1分)
error_reporting( ) 用于设置php的侦听错误的级别.[用来配置错误信息回报的等级].

25. 请写一个函数验证电子邮件的格式是否正确 (2分)

<?php
if(isset($_POST['action']) && $_POST['action']=='submitted')
{
    $email=$_POST['email'];
    if(!preg_match("/^(?:w+.?)*w+@(?:w+.?)*w+$/",$email))
    {
        echo "电子邮件检测失败";
    }
    else 
    {
        echo "电子邮件检测成功";
    }
}
else

?>



26. 简述如何得到当前执行脚本路径,包括所得到参数。(2分)

$url_this = "http://".$_SERVER ['HTTP_HOST'].$_SERVER['PHP_SELF'];
echo $url_this;
则显示 :    http://localhost/lu.php
引用:
28、JS表单弹出对话框函数是?获得输入焦点函数是? (2分)
弹出对话框: alert(),prompt(),confirm()
获得输入焦点 focus()


29、JS的转向函数是?怎么引入一个外部JS文件?(2分)

window.location
<script language="JavaScript" src="test.js">  

30、foo()和@foo()之间有什么区别?(1分)

@可以屏蔽错误!

31、如何声明一个名为”myclass”的没有方法和属性的类? (1分)

class myclass{};

32、如何实例化一个名为”myclass”的对象?(1分)

$newClass = new myclass();

33、你如何访问和设置一个类的属性? (2分)

$newClass = new myclass();
$testVar=$newClass->test;
$newClass->test="my string";

34、mysql_fetch_row() 和mysql_fetch_array之间有什么区别? (1分)
mysql_fetch_row -- 从结果集中取得一行作为枚举数组
mysql_fetch_array --  从结果集中取得一行作为关联数组,或数字数组,或二者兼有

--------------------------------------------------------------------

35、GD库是做什么用的? (1分)

GD库主要是用来做图片处理用的。

36、指出一些在PHP输入一段HTML代码的办法。(1分)

echo "<table></table>";
print("<table></table>");

37、下面哪个函数可以打开一个文件,以对文件进行读和写操作?(1分)
(a) fget() (b) file_open() (c) fopen() (d) open_file()

38、下面哪个选项没有将 john 添加到users 数组中?(c)(d) (1分)
(a) $users[] = ‘john’;
(b) array_add($users,’john’);
(c) array_push($users,‘john’);
(d) $users ||= ‘john’;

39、下面的程序会输入是否?(1分)
$num = 10;
function multiply(){
$num = $num * 10;
}
multiply();
echo $num;
?>
否,局部变量
40、使用php写一段简单查询,查出所有姓名为“张三”的内容并打印出来 (2分)
表名 UserName Tel Content Date
张三 13333663366 大专毕业 2006-10-11
张三 13612312331 本科毕业 2006-10-15
张四 021-55665566 中专毕业 2006-10-15
请根据上面的题目完成代码:
$mysql_db=mysql_connect("local","root","pass");
@mysql_select_db("DB",$mysql_db);

$result = mysql_query('select * from `user` where `name`=\'张三\'');
while ($row = mysql_fetch_array($result)) {
echo 'name:'.$row['name'].'tel:'.$row['tel'].'<br />';
}
$mysql_db=mysql_connect("local","root","pass");
@mysql_select_db("DB",$mysql_db);
$result=mysql_query("select * from User where Name='张三'");
while($row=mysql_fetch_array($result))
{
echo $row['Name'].$row['Tel'].$row['Content'].$row['Date'];
echo "<br>";
}

41、如何使用下面的类,并解释下面什么意思?(3)
class test{
function Get_test($num){
$num=md5(md5($num)."En");
return $num;
}
}
双重md5加密
$testObject = new test();
$encryption = $testObject->Get_test("xiaotian_ls");

42、写出 SQL语句的格式 : 插入 ,更新 ,删除 (4分)
表名 UserName Tel Content Date
张三 13333663366 大专毕业 2006-10-11
张三 13612312331 本科毕业 2006-10-15
张四 021-55665566 中专毕业 2006-10-15
(a) 有一新记录(小王 13254748547 高中毕业 2007-05-06)请用SQL语句新增至表中
(b) 请用sql语句把张三的时间更新成为当前系统时间
(c) 请写出删除名为张四的全部记录

(a) 有一新记录(小王 13254748547 高中毕业 2007-05-06)请用SQL语句新增至表中
INSERT INTO User('Name','Tel','Content','Date') VALUES('小王','13254748547','高中毕业','2007-05-06')
(b) 请用sql语句把张三的时间更新成为当前系统时间
UPDATE User SET Date=DATE_FORMAT(NOW(),'%Y-%m-%d') WHERE Name='张三'
(c) 请写出删除名为张四的全部记录
DELETE FROM User WHERE Name='张四'

43、请写出数据类型(int char varchar datetime text)的意思; 请问varchar和char有什么区别(2分)

int 代表整数
char 字符型  varchar 可变字符型  text 文本型  ntext 多行文本  datetime  是日期,可以精确到毫秒 

44、MySQ自增类型(通常为表ID字段)必需将其设为(?)字段(1分)

auto_increment

45、写出以下程序的输出结果 (1分)
$b=201;
$c=40;
$a=$b>$c?4:5;
echo $a;
?>
三元表达式 4 
46、检测一个变量是否有设置的函数是否?是否为空的函数是?(2分)
isset($a)   empty($a)
-----------------------------------------------------------------------------

47、取得查询结果集总数的函数是?(1分)

count()

48、$arr = array('james', 'tom', 'symfony'); 请打印出第一个元素的值 (1分)
print $arr[0];

49、请将41题的数组的值用','号分隔并合并成字串输出(1分)
print $arr[0].","$arr[1].","$arr[2] ;//^_^
$arr1 = implode(",",$arr);

50、$a = 'abcdef'; 请取出$a的值并打印出第一个字母(1分)

print substr($a, 0, 1);

51、PHP可以和sql server/oracle等数据库连接吗?(1分)

可以

52、请写出PHP5权限控制修饰符(3分)
private    protected    public

53、请写出php5的构造函数和析构函数(2分)

__construct __destruct
引用:
填空题

1.在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量 $_SERVER['PHP_SELF'];中;而链接到当前页面的URL记录在预定义变量$_SERVER["HTTP_REFERER"];中。

2.执行程序段将输出 0。 

3.在HTTP 1.0中,状态码 401 的含义是__未授权__;如果返回“找不到文件”的提示,则可用 header 函数,其语句为 header("HTTP/1.0 404 Not Found");。

4.数组函数 arsort 的作用是 对数组进行逆向排序并保持索引关系 ;语句 error_reporting(2047)的作用是 All errors and warnings 。

5.PEAR中的数据库连接字符串格式是 没弄明白 。

6.写出一个正则表达式,过虑网页上的所有JS/VBS脚本(即把scrīpt标记及其内容都去掉): /<[^>].*?>.*?<\/>/si 。

7.以Apache模块的方式安装PHP,在文件http.conf中首先要用语句 LoadModule php5_module "D:/xampp/apache/bin/php5apache2.dll" 动态装载PHP模块,然后再用语句 AddType application/x-httpd-php-source .phps AddType application/x-httpd-php .php .php5 .php4 .php3 .phtml 使得Apache把所有扩展名为php的文件都作为PHP脚本处理。

8.语句 include 和 require 都能把另外一个文件包含到当前文件中,它们的区别是 发生异常时include产生警告require产生致命错误 ;为了避免多次包含同一文件,可以用语句 require_once()/include_once() 来代替它们。

9.类的属性可以序列化后保存到 session 中,从而以后可以恢复整个类,这要用到的函数是 serialize() /unserialize() 。

10.一个函数的参数不能是对变量的引用,除非在php.ini中把 allow_call_time_pass_reference 设为on.

11.SQL中LEFT JOIN的含义是 自然左外连接 。如果 tbl_user记录了学生的姓名(name)和学号(ID),tbl_score记录了学生(有的学生考试以后被开除了,没有其记录)的学号(ID)和 考试成绩(score)以及考试科目(subject),要想打印出各个学生姓名及对应的的各科总成绩,则可以用SQL语句 select name , count(score) as sum_score from tbl_user left join tbl_score on tbl_user.ID=tbl_score.ID group by tbl_user.ID 。

12.在PHP中,heredoc是一种特殊的字符串,它的结束标志必须 结束标识符所在的行不能包含任何其它字符除";" 。

  编程题


1. 写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名
例如: http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出 php 或 .php

<?php 
$p = 'http://www.windsfly.cn/blog/index.php?id=223';
function getPos($p) {
$pos = strrpos($p,'.'); //strrpos()找出字元最后一次出现的位置
$ex = substr($p,$pos+1,3);
return $ex;
}
echo getPos($p);
?>



2. 写一个函数,算出两个文件的相对路径
如 $a = '/a/b/c/d/e.php';
$b = '/a/b/12/34/c.php';
计算出 $b 相对于 $a 的相对路径应该是 ../../c/d将()添上


<?php
$a = '/c/d/d/e.php';
$b = '/a/c/d/e.php';
$aArr = explode('/',dirname($a));
$bArr = explode('/',dirname($b));
$aLen = count($aArr);
$bLen = count($bArr);
$maxLen = max($aLen,$bLen);
for($i = 1; $i < $maxLen; $i++){
    if($aArr[$i] != $bArr[$i] && isset($aArr[$i])){
        if(isset($bArr[$i]))$bUrl[]=$bArr[$i];
        $relativePath .= "../";
    }else{
        $bUrl[]=$bArr[$i];
    }
}
echo $relativePath.implode('/',$bUrl).'/'.basename($b);
?>
    
3.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。

my_scandir($dir)
{
    $files = array();
    if ( $handle = opendir($dir) )
    {
        while ( ($file = readdir($handle)) !== false )
        {
            if ( $file != ".." && $file != "." )
            {
                if ( is_dir($dir . "/" . $file) )
                {
                    $files[$file] = rec_scandir($dir . "/" . $file);
                }
                else
                {
                    $files[] = $file;
                }
            }
        }
        closedir($handle);
        return $files;
    }
}

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