PHP面试题(2)

21、 有一个一维数组,里面存储整形数据,请写一个函数,将他们按从大到小的顺序排列。要求执行效率高。并说明如何改善执行效率。(该函数必须自己实现,不能使用php函数)

<?php
/*快速排序*/
 $arr=array(3,1,5,7,10,9);
 function quick_sort($arr){
     $len=count($arr);
     if($len<=1){
         return $arr;
     }
     $base_num=$arr[0];
     $left_array=array();
     $right_array=array();
     for($i=1;$i<$len;$i++){
         if($base_num<$arr[$i]){
             $left_array[]=$arr[$i];
         } else{
             $right_array[]=$arr[$i];
         }

     }
     $left_array=quick_sort($left_array);
         $right_array=quick_sort($right_array);
         return array_merge($left_array,array($base_num),$right_array);
 }
 print_r(quick_sort($arr));
?>

  <?php
          /*插入排序*/
          $arr=array(3,1,5,0,7,2);
          function insert_sort($arr){
              for($i=1,$len=count($arr);$i<$len;$i++)
              {
                  $a=$arr[$i];
              for($j=$i-1;$j>=0;$j--)
              {
                  if($a>$arr[$j])
                  {
                      $arr[$j+1]=$arr[$j];
                      $arr[$j]=$a;
                  }
                  else{
                      break;
                  }
              }
              }
             return $arr; 
          }

          print_r(insert_sort($arr));
        ?>

<?php
/*冒泡排序*/
$arr=array(3,10,5,14,9,20);
function bubble_sort($arr){

    for($j=0,$len=count($arr);$j<$len-1;$j++){

    for($i=$len-1;$i>$j;$i--)
    {
        if($arr[$i-1]<$arr[$i]){
            $a=$arr[$i-1];
            $arr[$i-1]=$arr[$i];
            $arr[$i]=$a;
        }


    }
    }
    return $arr;
}
print_r(bubble_sort($arr));


?>

<?php
//选择排序
  $arr=array(3,1,5,0,7,2);
function select_sort($arr){
    for($i=0,$len=count($arr);$i<$len-1;$i++){
        $p=$i;
        for($j=$i+1;$j<$len;$j++){
            if($arr[$p]<$arr[$j]){
                $p=$j;
            }

            }
           if($i!=$p){
                $a=$arr[$p];
                $arr[$p]=$arr[$i];
                $arr[$i]=$a; 
        }

    }
    return $arr;

}
print_r(select_sort($arr));

?>

22、写出如下程序的输出结果

<?php
$str1=null;
$str2=false;
echo $str1==$str2 ? '相等':'不相等';
//相等
$str3 = "";
$str4 = 0;
echo $str3==$str4 ? '相等' : '不相等';
//相等
$str5 = 0;
$str6 = '0';
echo $str5===$str6 ? '相等' : '不相等';
//不相等
?>

23、写出如下程序的输出结果

$a1 = null;
$a2 = false;
$a3 = 0;
$a4 = "";
$a5 = '0';
$a6 = 'null';
$a7 = array();
$a8 = array(array());

echo empty($a1) ? 'true' : 'false';//true
echo empty($a2) ? 'true' : 'false';//true
echo empty($a3) ? 'true' : 'false';//true
echo empty($a4) ? 'true' : 'false';//true
echo empty($a5) ? 'true' : 'false';//true
echo empty($a6) ? 'true' : 'false';//false
echo empty($a7) ? 'true' : 'false';//true
echo empty($a8) ? 'true' : 'false';//false
?>

24、写出如下程序的输出结果

<?php

$count = 5;
function get_count(){
static $count = 0;
return $count++;
}

echo $count; //5
++$count;
echo get_count();//0
echo get_count();//1
?>

25、写出如下程序的输出结果

<?php

$test = 'aaaaaa';
$abc = & $test;
unset($test);
echo $abc;//’aaaaaa’
echo $test;//不输出
?>

26、写出如下程序的输出结果

<?php

$GLOBALS['var1'] = 5;
$var2 = 1;
function get_value(){
global $var2;//等价于$var2=&$GLOBAL['var2']
$var1 = 0;
//unset($var2);
return $var2++;
}
get_value();//返回值不能直接输出
echo $var1; //5
echo $var2; //2,global在自定义函数中声明全局变量,直接影响外部变量
?>

27、写出如下程序的输出结果

<?php
function get_arr($arr){
unset($arr[0]);
}
$arr1 = array(1, 2);
$arr2 = array(1, 2);

get_arr(&$arr1);
get_arr($arr2);

echo count($arr1);//1
echo count($arr2);//2
?>
输出结果(仅限于5.3之前,之后是会报错无法输出结果的):12

释义:
第一个get_arr()使用到了取引用符&,并且将$arr1传入。这样子,传入了$arr1的引用,在get_arr()内部相当于直接操作了$arr1数组,而该数组删除了数组首位的值,所以长度只有1。

而第二个get_arr()并没有使用引用,当你将$arr2传入时,相当于将$arr2复制了一份传入,get_arr()函数处理的只是$arr2的拷贝,所以他只是删除了$arr2拷贝的首位值,对$arr2本身没有影响

28、PHP代码如下:

<?php
$a="hello";
$b=&$a;
unset($b);
$b="world";
echo $a.$b;
?>//helloworld

29、用PHP写一段代码,实现不使用第3个变量,交换$a、$b的值,$a、$b的初始值自己定。

<?php
$a="lang";
$b="qiang";
$$a=$b;
$b=$a;
$a=$$a;
?>

30、 根据题目要求,用PHP写出代码。
表名User
ID Name Tel Content Date
1 张三 13333663366 大专毕业 2006-10-11
3 张三 13612312331 本科毕业 2006-10-15
5 张四 020-5566556 中专毕业 2006-10-15
4 王五 13521212125 大专毕业 2006-12-25
2 …………
6 …………
假设数据库连接如下:

$mysql_db=mysql_connect(“local”,”root”,”pass”);
@mysql_select_db(“DB”,$mysql_db);
(1)查询出所有Name等于“张三”的记录,并输出。
(2)按ID升序查询,只返回排序后的前3条记录,并输出。

(1)

$result=mysqli_query($mysql_db,"select * from User where Name='张三'");
while($row=mysqli_fetch_array($result))
{
    echo $row['ID'];
    echo $row['Name'];
    echo $row['Tel'];
    echo $row['Content'];
    echo $row['Date'];

}

(2)

$result=mysqli_query($mysql_db,"select * from User order by ID asc limit 0,3");
while($row=mysqli_fetch_array($result))
{
    echo $row['ID'];
    echo $row['Name'];
    echo $row['Tel'];
    echo $row['Content'];
    echo $row['Date'];

}

31、javascript能否定义二维数组,如果不能你如何解决?
javascript不支持二维数组定义,可以用arr[0] = new array()来解决

32、假设a.html和b.html在同一个文件夹下面,用javascript实现当打开a.html五秒钟后,自动跳转到b.html。

<script>
function go2b(){
window.location = “b.html”;
window.close();
}
setTimeout( “go2b()”,5000 ); //5秒钟后自动执行go2b()
</script>

33、利用CSS样式表定义已访问的超链接字体大小为14pt,颜色为red。
a:visited { font-size: 14pt; color: red; }

34、写出 SQL语句的格式 : 插入 ,更新 ,删除 (4分)
表名User
Name Tel Content Date
张三 13333663366 大专毕业 2006-10-11
张三 13612312331 本科毕业 2006-10-15
张四 021-55665566 中专毕业 2006-10-15

(a) 有一新记录(小王 13254748547 高中毕业 2007-05-06)请用SQL语句新增至表中
mysql_query(“INSERT INTO User (name,tel,content,date) VALUES
(‘小王’,’13254748547′,’高中毕业’,’2007-05-06′)”)

(b) 请用sql语句把张三的时间更新成为当前系统时间
$nowDate = date(“Ymd”);
mysql_query(“UPDATE `user` SET date=’”.$nowDate.”‘ WHERE name=’张三’”);

(c) 请写出删除名为张四的全部记录
mysql_query(“DELETE FROM `user` WHERE name=’张四’”);

35、MySQL存储过程的优点?
某选项可以多次调用、修改,网络负载降低

36、写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名

<?php
function getExt($url){
$arr = parse_url($url);
//返回Array ( [scheme] => http [host] => localhost [path] => /Myproject/mianshi.php ) 

$file = basename($arr['path']);//返回mianshi.php 
$ext = explode(".",$file);//以“.”分割
return $ext[1];
}
print_r(getExt("http://localhost/Myproject/mianshi.php"));
?>

37、(1)表单中 get与post提交方法的区别?
答:get方法是通过URL请求来传递用户的输入,而post是实体数据,可以通过表单提交大量信息。get方式的提交你需要用Request.QueryString来取得变量的值,而post方式提交时,你必须通过Request.Form来访问提交的内容。

(2)session与cookie的区别?
答:①cookie数据存放在客户的浏览器上,session数据放在服务器上;
②cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session;
③session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE;
④单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
所以个人建议:
将登陆信息等重要信息存放为SESSION,其他信息如果需要保留,可以放在COOKIE中。

(3)数据库中的事务是什么?
答:事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。

38、写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。

<?php
function my_scandir($dir)
{
     //定义一个数组
$files = array();
//检测是否存在文件
        if(is_dir($dir)){
 //打开目录
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; //返回文件夹数组
}
}
}
echo "<pre>";
print_r(my_scandir("D:\WWW"));
?>

38.使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组

//二分查找(数组里查找某个元素)
function bin_sch($array, $low, $high, $k){

if ($low <= $high){

$mid = intval(($low+$high)/2);

if ($array[$mid] == $k){

return $mid;

}elseif ($k < $array[$mid]){

return bin_sch($array, $low, $mid-1, $k);

}else{

return bin_sch($array, $mid+1, $high, $k);

}

}

return -1;

}

//顺序查找(数组里查找某个元素)

function seq_sch($array, $n, $k){

$array[$n] = $k;

for($i=0; $i<$n; $i++){

if($array[$i]==$k){

break;

}

}

if ($i<$n){

return $i;

}else{

return -1;

}

}

39.下面代码的运行结果

    <?php  
        class a{  
            function a($x=1) {  
                $this->myvar=$x;  
            }  
        }  
        class b extends a{  
            var $myvar;  
            function b($x=2) {  
                $this->myvar=$x;  
                parent::a();      
            }  
        }  
        $obj=new b;  
        echo $obj->myvar;  //1
    ?>  

40.下面的脚本输出值为多少:
A.5 B.2 C.10 D.NULL

<?php
class my_class{   
        var $value;  
    }  
    $a=new my_class;  
    $a->my_value=5;  
    $b=$a;  
    $b->my_value=10;  
    echo $a->my_value;// 10,$b=$a的赋值,仅仅是建立一个链接,赋值后对$b的修改会影响$a

?>

41.Person类实例化(new)一个对象$p,那使用对象$p调用Person类中getInfo方法:

A.$p->getInfo()                B.this->getInfo() C.$p::getInfo()                D.$p=>getInfo()

A,常用的考察PHP类定义调用方法的问题

42.写出验证手机号,邮箱是否合法的正则表达式

^[1][358][0-9]{9}\$  第一位必须是1,第二位只能是358,后面9位可以是任意组合
^([a-zA-Z0-9-_])+@[a-zA-Z0-9-_]+(.[a-zA-Z0-9-_]{2,4})+\$

43.PHP如何实现静态化
站点能够在用户訪问之前就通过一定的程序来生成静态页面,当用户去訪问该页面的时候,因为訪问的是静态页面,所以訪问速度会比訪问动态页面速度快的多,这样的过程我们称之为静态化。
PHP实现静态化通常先要开启自带的缓存机制,即函数ob_start(),然后ob_get_contents()函数来获取缓存中的内容,将输出内容放入一个html文件里以便下次直接访问,最后函数ob_end_clean(),用来清空缓存中的内容而且关闭。
44.什么是CSRF攻击,XSS攻击?如何防范?点击
XSS定义的主语是“脚本”,是一种跨站执行的脚本,也就是javascript脚本,指的是在网站上注入我们的javascript脚本,执行非法操作。
CSRF定义的主语是”请求“,是一种跨站的伪造的请求,指的是跨站伪造用户的请求,模拟用户的操作。

防御XSS攻击可以通过以下两方面操作:
1,对用户表单输入的数据进行过滤,对javascript代码进行转义,然后再存入数据库;
2,在信息的展示页面,也要进行转义,防止javascript在页面上执行。
CSRF攻击的防御可以通过以下两方面操作:
1,所有需要用户登录之后才能执行的操作属于重要操作,这些操作传递参数应该使用post方式,更加安全;
2,为防止跨站请求伪造,我们在某次请求的时候都要带上一个csrf_token参数,用于标识请求来源是否合法,csrf_token参数由系统生成,存储在SESSION中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值