php笔试面试题大全

2020年02月04日 阅读数:970
这篇文章主要向大家介绍php笔试面试题大全,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。
 这是一部史上最全的面试题库,根据本人多年面试经验汇总,面试多了,问来问去总逃不出这些问题.固然这是php的基础部分,我发现越是多年的phper,基础部分遗忘的就越多,经验越丰富,针对的问题不是零碎的语法点,而是对于实际问题的解决.对于实际问题的解决,每一个公司的侧重点不同,这里就不详谈.

看完这些题,妈妈不再用担忧个人面试了javascript

冲击月薪18k(税后),你应该具有哪些技能?
1.熟悉设计模式,单例,工厂,策略,观察者能根据实际场景写出代码
2.熟悉框架tp,yii,larval,symfony, Phalcon7;至少读过其中之一的源码
3.熟悉memcache,redis的使用,特别是redis,熟悉redis的主从配置;熟悉mongodb
4.熟练掌握mysql,视图,触发器,sql语句优化,表设计,sql注入,锁,事物,并发,分表,mysql性能调优,mysql主从和集群搭建
5.熟悉lamp,lnmp安装配置及调优,反向代理,服务器集群,性能优化,高可用
6.熟悉h5
7.node.js及js的几个前端框架jquery,vue.js,angular.js,rect.js
8.网站安全,xss,csrf,ddos攻击
9.cdn原理
10.图片压缩
11.python基础
12.了解php扩展开发
13.http协议,socket编程
14.php swoole编程
1.apache和nginx的区别
最核心的区别在于apache是同步多进程模型,一个链接对应一个进程;nginx是异步的,多个链接(万级别)能够对应一个进程
nginx处理动态请求是鸡肋,通常动态请求要apache去作,nginx只适合静态和反向
(1) nginx相对于apache的优势: 
轻量级,一样起web 服务,比apache 占用更少的内存及资源 
抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能 
高度模块化的设计,编写模块相对简单 
社区活跃,各类高性能模块出品迅速啊 
(2)apache 相对于nginx 的优势: 
rewrite ,比nginx 的rewrite 强大 
模块超多,基本想到的均可以找到 
少bug ,nginx 的bug 相对较多  超稳定 
2. php各框架优缺点:
1)ci

 优势:php

  1. 配置简单,所有的配置使用PHP脚原本配置,执行效率高;具备基本的路由功能,可以进行必定程度的路由;具备初步的Layout功能,可以制做必定程度的界面外观;数据库层封装的不错,具备基本的MVC功能css

  2. 快速简洁,代码很少,执行性能高,PHP框架简单,容易上手,学习成本低,文档详细;自带了不少简单好用的library,框架适合小型应用html

  缺点:前端

  1. 把Model层简单的理解为数据库操做vue

  2. PHP框架略显简单,只可以知足小型应用,略微不太可以知足中型应用须要java

  评价:node

  整体来讲,拿CodeIgniter来完成简单快速的应用仍是值得,同时可以构造必定程度的layout,便于模板的复用,数据操做层来讲封装的不错,而且CodeIgniter没有使用不少太复杂的设计模式,执行性能和代码可读性上都不错。至于附加的 library 也还不错,简洁高效。python


2)

1. CakePHP是最相似于RoR的PHP框架,包括设计方式,数据库操做的Active Record方式;设计层面很优雅,没有自带多余的 library,全部的功能都是纯粹的框架,执行效率还不错;数据库层的 hasOne, hasMany 功能很强大,对于复杂业务处理比较合适;路由功能,配置功能还不错;自动构建脚手架(scaffold)很强大;适合中型应用;基本实现过了MVC每一层;具备自动操做命令行脚本功能;mysql

  2. 文档比较全,在国内推广的比较成功,大部分都知道CakePHP,学习成本中等

  缺点:

  1. CakePHP很是严重的问题是把Model理解为数据库层操做,严重影响了除了数据库以外的操做能力

  2. CakePHP的cache功能略显薄弱,配置功能稍嫌弱;CakePHP不适合大型应用,只适合中型应用,小型应用来讲略微的学习成本高了点

  评价:

  整体来讲CakePHP框架表明了PHP框架很重要的一个时代和表明,而且目前发挥着很重要的做用,很多本身写的框架都模仿了CakePHP的方式,是个里程碑式的产品;CakePHP透露着RoR的敏捷开发方式和把数据库操做认为是惟一Model的设计思想,做为开发快速应用和原型是绝好的工具;一样,用来作Web2.0网站的开发框架,也是值得选择的。

优势:

  1. 官方出品,自带了很是多的 library,框架自己使用了不少设计模式来编写,架构上很优雅,执行效率中等;MVC设计中,比较简洁,具备路由功能,配置文件比较强大(可以处理XML和php INI),各类 library 很强大,是全部PHP框架中各类功能最全面的,包括它不只是一个PHP框架,更是一个大类库(取代PEAR),这是它的主要特点;可以直观的支持除数据库操做以外的Model层(比 CodeIgniter 和 CakePHP 强),而且可以很轻易的使用Loader功能加载其余新增长的Class;Cache功能很强大,从前端Cache到后端Cache都支持,后端Cache支持Memcache、APC、SQLite、文件等等方式;数据库操做功能很强大,支持各类驱动(适配器)

  2. 文档很全,在国内社区很成熟,而且目前很多Web 2.0网站在使用,学习成本中等

  缺点:

  1. MVC功能完成比较弱,View层简单实现(跟没实现同样),没法很强大的控制前端页面

  2. 没有自动化脚本,建立一个应用,包括入口文件,所有必须本身手工构建,入门成本高

  3. Zend Framework 做为一个中型应用框架问题不大,也可以勉强做为大型应用的PHP框架,可是做为一个很成熟的大型PHP框架来讲,还须要一些努力

  评价:

  做为官方出品的框架,Zend Framework的野心是能够预见的,想把其余框架挤走,同时封装不少强大的类库,可以提供一站式的框架服务,而且他们的开发团队很强大,彻底足够有能力开发很强大的产品出来,因此基本能够肯定的是Zend Framework前途无量,若是花费更多的时间去完善框架。一样的,Zend Framework架构自己也是比较优雅的,说明Zend官方是有不少高手的,设计理念上比较先进,虽然有一些功能实现的不够完善,好比View层,自动化脚本等等,这些都有赖于将来的升级。整体来讲Zend Framework是最值得期待的PHP框架,固然,你目前要投入你的项目中使用也是彻底没问题的


优势:

1.完整实现了MVC三层,封装了全部东西,包括 $_POST,$_GET 数据,异常处理,调试功能,数据检测;包含强大的缓存功能,自动加载Class(这个功能很爽),强大的i18n国家化支持;具备很强大的view层操做,可以零碎的包含单个多个文件;很是强大的配置功能,使用yml配置可以控制全部框架和程序运行行为,强大到让人无语;可以很随意的定义各类本身的class,而且symfony可以自动加载(auto load)这些class,可以在程序中随意调用;包含强大的多层级项目和应用管理:Project --> Application --> Module --> Action,可以知足一个项目下多个应用的须要,而且每层能够定义本身的类库,配置文件,layout;很是强大的命令行操做功能,包括创建项目、创建应用、创建模块、刷新缓存等等;

  2. Symfony绝对是开发大型复杂项目的首选,由于使用了Symfony,将大大节约开发成本,而且多人协做的时候,不会出现问题,在Project级别定义好基础Class之后,任何模块都可以重用,大大复用代码

  缺点:

  1. 数据库操做model采用了重量级的propel和creole,不过在我测试的版本中已经把他们移到了addon里,可用可不用

  2. 缓存功能没法控制,每次开发调试老是缓存,须要执行 symfony cc, symfony rc 来清除和重建缓存;

  3. 效率不是很高,特别是解析模板和读取配置文件的过程,花费时间很多;

  4. 学习成本很高,而且国内没有成熟的社区和文档,连中文手册都没有,相应的要掌握全部功能,须要花费比较多的时间

  评价:

  Symfony绝对是企业级的PHP框架,惟一可以貌似可以跟Java领域哪些强悍框架抗衡的东西;强悍的东西,天然学习复杂,可是相应的对项目开发也比较有帮助,天然是推荐复杂的项目使用Symfony来处理,以为是值得,后期的维护成本比较低,复用性很强。相应的若是使用Symfony的应该都是比较复杂的互联网项目,那么相应的就要考虑关于数据库分布的问题,那么就须要抛弃Symfony自带的数据库操做层,须要本身定义,固然了,Symfony支持随意的构造model层。

3. php运行的3种模式

三种运行方式:mod_php五、cgi、fast-cgi

(1. 经过HTTPServer内置的模块来实现,

例如Apache的mod_php5,相似的Apache内置的mod_perl能够对perl支持;

 

(2. 经过CGI来实现

这个就比如以前perl的CGI,该种方式的缺点是性能差,由于每次服务器遇到这些脚本都须要从新启动脚本解析器来执行脚本而后将结果返回给服务器,另外一方面就是不太安全,

该方式几乎不多使用了

 

(3. 最新出现一种叫作FastCGI。

所谓FastCGI就是对CGI的改进。它通常采用C/S结构,通常脚本处理器会启动一个或者多个daemon进 程,每次HTTPServer遇到脚本的时候,直接交付给FastCGI的进程来执行,而后将获得的结果(一般为html)返回给浏览器。

该种方法的问题存在一个小问题是当遇到大流量的频繁请求的话,脚本处理器的daemon进程可能会超负荷从而变得很慢,甚至发生内存泄漏;

可是比较起Apache的内置模块的方式的优势是因为Server和脚本解析器彻底分开各负其责,所以服务器再也不臃肿,能够专心地进行静态文件响 应或者将动态脚本解析器的结果返回给用户客户端。

因此比较起Apache的内置模块方式,有时候性能要提升不少。

有人测试可能会达到 Apache+mod_php的5~10倍。

3.1. FastCGI经常使用模式:

lightppd+spawn-fcgi

nginx+PHP-FPM

4.memcache与redis的区别
(1  Redis不只仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等 数据结构 的存储。

(2  Redis支持数据的备份,即master-slave模式的数据备份。

(3  Redis支持数据的持久化,能够将内存中的数据保持在磁盘中,重启的时候能够再次加载进行使用。

抛开这些,能够深刻到Redis内部构造去观察更加本质的区别,理解Redis的设计。

在Redis中,并非全部的数据都一直存储在内存中的。这是和Memcached相比一个最大的区别。Redis只会缓存全部的 key的信息,若是Redis发现内存的使用量超过了某一个阀值,将触发swap的操做,Redis根据“swappability = age*log(size_in_memory)”计 算出哪些key对应的value须要swap到磁盘。而后再将这些key对应的value持久化到磁盘中,同时在内存中清除。这种特性使得Redis能够 保持超过其机器自己内存大小的数据。固然,机器自己的内存必需要可以保持全部的key,毕竟这些数据是不会进行swap操做的。同时因为Redis将内存 中的数据swap到磁盘中的时候,提供服务的主线程和进行swap操做的子线程会共享这部份内存,因此若是更新须要swap的数据,Redis将阻塞这个 操做,直到子线程完成swap操做后才能够进行修改。
5.用户访问网站的基本流程
详见http://blog.csdn.net/yonggeit/article/details/72857630

//1.当前时间格式化打印//date_timezone_set('PRC');//设置中国时区//date_timezone_set("Etc/GMT-8");// 比林威治标准时间快8小时,是咱们的北京时间echo date('Y-m-d H:i:s');
echo '<hr/>';
//2.//字符串转数组:print_r(str_split("Hello Shanghai"));
echo '<hr/>';
//字符串截取:substr($str,1,10);mb_substr()mb_strcut()mb_substr是按字来切分字符,而mb_strcut是按字节来切分字符,一个utf8中文字符占三个字节echo mb_substr('这样一来个人字符串就不会有乱码^_^'07'utf-8');//输出:这样一来个人字echo '<hr/>';
echo mb_strcut('这样一来个人字符串就不会有乱码^_^'07'utf-8');//输出:这样一echo '<hr/>';
//分隔成数组:print_r(explode(' ',"Hello Shanghai"));
echo '<hr/>';
//字符串替换:echo str_replace("world","Shanghai","Hello world!");
echo '<hr/>';
//正则替换echo preg_replace('/\s+/''','foo   o');//剥离空白字符echo '<hr/>';
//数组转字符串:print_r(implode(array('a'=>'aaa','b'=>'bbb')));
echo '<hr/>';
//3.字符串查找strpos,strrpos$str = '/web/a/b/index.html';
$index = strrpos($str,'/');
//截取网址文件部分echo substr($str,$index+1);//包含索引位置到结尾部分echo basename($str);//取文件名echo '<hr/>';
//截取网址路径部分echo substr($str,0,$index);
echo dirname($str);//取路径名echo '<hr/>';
//日期反转$date = '18/02/2016';
echo preg_replace('/(\d+)\/(\d+)\/(\d+)/','$3/$2/$1',$date);
echo '<hr/>';
//写一个函数,尽量高校的从一个url里提取文件扩展名$url = 'http://www.test.com.cn/abc/dsg/del.inc.php';
$path = pathinfo($url);
//var_dump(parse_url($url));echo $path['extension'];// ["basename"]=> string(11) "del.inc.phpecho '<hr/>';
//复杂状况$url1 = 'http://www.test.com.cn/abc/dsg/del.inc.php?id=6';
$arr = parse_url($url1);
$path1=$arr['path'];
$arr2 = pathinfo($path1);
//print_r($arr2);echo $arr2['extension'];

echo '<hr/>';
/** *字符串函数join() implode() 的别名,返回由数组组成的字符串

strlen($str)

addslashes($str)在预约义字符前加/;预约义字符是:单引号(')双引号(")反斜杠(\NULL,也可在php.ini中设置magic_quotes_gpc=onget_magic_quotes_gpc()检测字符串是否通过转义,

strpos() 函数用于检索字符串内指定的字符或文本。若是找到匹配,则会返回首个匹配的字符位置。若是未找到匹配,则将返回 FALSE

strtolower()  //全部大写转小写;

strtoupper — 将字符串转化为大写

ucfirst — 将字符串的首字母转换为大写

lcfirst()  把字符串的首字符转换为小写

ucwords — 将字符串中每一个单词的首字母转换为大写

strstr($str,search,before_search)(别名strchr — 默认返回$search以及以后的部分,若before_searchtrue则返回以前的部分。若是想要不区分大小写,请用 stristr()

chop($str,$charlist)   删除$charlist指定的字符串,若charlist 参数为空,则移除如下字符:"\0" - NULL,"\t" - 制表符,"\n" - 换行,"\x0B" - 垂直制表符,"\r" - 回车," " - 空格。

chunk_split($str,length,end)   把字符串分割为一系列更小的部分,默认以默认是 \r\n,可经过end指定分隔符,length几位一分隔,默认是 76

localeconv()   返回本地数字及货币格式信息number_format()    以千位分组来格式化数字

ltrim($str,$charlist)  移除$charlist指定字符串若省略第二参数则移除"\0" - NULL"\t" - 制表符,"\n" - 换行,"\x0B" - 垂直制表符,"\r" - 回车," " - 空格*//** 

.数组函数

sizeof()   count() 的别名

pos()  current() 的别名

implode()   join()的别名,将数组分隔成字符串

array_reduce($arr,fun) 经过使用用户自定义函数,将数组转化为字符串。

array_rand($arr,n)随机取出数组的一个键

array_unshift($arr)向前插入数组元素,能够传入多个,返回插入的个数

array_push($arr)从尾部插入数组元素,返回插入个数

array_shift($arr)从前面弹出数组元素,从前面出栈,每次删除一个

array_pop($arr)从后面弹出数组元素,从后面出栈,每次删除一个

unset($arr[2]); 删除指定数组元素

array_flip($arr);交换数组的键和值

array_unique() 删除数组中的重复值

array_count_values()   用于统计数组中全部值出现的次数。

array_intersect()  比较数组,返回交集(只比较键值)。

array_intersect_assoc()    比较数组,返回交集(比较键名和键值)。

array_intersect_key()  比较数组,返回交集(只比较键名)

array_filter()用回调函数过滤数组中的元素。

array_reverse()    以相反的顺序返回数组。

array_search() 搜索数组中给定的值并返回键名。

array_combine($arr1,$arr2)将第一个数组的值做为第二个数组的键合并为一个数组array_merge_recursive() 函数把一个或多个数组合并为一个数组。该函数与 array_merge() 函数的区别在于处理两个或更多个数组元素有相同的键名时。array_merge_recursive() 不会进行键名覆盖,而是将多个相同键名的值递归组成一个数组。

array_map()把数组中的每一个值发送到用户自定义函数,返回新的值。

array_slice($arr,2)    去掉数组前2个元素,返回数组剩余的部分

$a=array("red","green","blue","yellow","brown");
print_r(array_slice($a,1,2));//Array ( [0] => green [1] => blue )
$a=array("red","green","blue","yellow","brown");
print_r(array_slice($a,-2,1));//Array ( [0] => yellow )

$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
$a2=array("a"=>"purple","b"=>"orange");
array_splice($a1,0,2,$a2);
print_r($a1);//Array ( [0] => purple [1] => orange [c] => blue [d] => yellow )
$a1=array("0"=>"red","1"=>"green");
$a2=array("0"=>"purple","1"=>"orange");
array_splice($a1,1,0,$a2);
print_r($a1);//Array ( [0] => red [1] => purple [2] => orange [3] => green )

array_product()    计算数组中全部值的乘积//数组排序

7.sort() - 以升序对数组排序

8.rsort() - 以降序对数组排序

9.asort() - 根据值,以升序对关联数组进行排序

10.ksort() - 根据键,以升序对关联数组进行排序

11.arsort() - 根据值,以降序对关联数组进行排序

12.krsort() - 根据键,以降序对关联数组进行排序

13.shuffle()   将数组打乱

 预约义数组* __FILE__:当前文件在服务器的什么地址上面;

__LINE__:对应的行号;

__FUNCTION__当前函数名;

__CLASS__:当前的类名

__METHOD__:当前的方法;

PHP_OS: 当前操做系统的版本;

PHP_VERSION: 当前的PHP的版本;

超全局数组

$_SERVER['HTTP_REFERER'];  //上级来源

$_SERVER['HTTP_ACCEPT_LANGUAGE']; //字符集

$_SERVER['HTTP_HOST'];  //当前服务器的IP地址

$_SERVER['REMOTE_ADDR'];  //哪台主机访问,没有获取IP记录的,只有它.

$_SERVER["SERVER_ADMIN"];     //管理员邮箱

 防止sql注入:

 1.$SERVER['HTTP_REFERER']判断提交来源;

2.开启addslashesmagic_quotes_gpc 

3.使用预处理(PDO*//** 

防盗链*

1.利用apachenginxrewrite重写功能基于来源作判断

2.经过$SERVER['HTTP_REFERER'];判断*

 $urlar=parse_url($_SESSION['HTTP_REFERER']); 

 if($_SERVER['HTTP_HOST']   !=   $urlar["host"]   &&   $urlar["host"]   !=   "202.102.110.204"   &&   $urlar["host"]   !=   "http://blog.163.com/fantasy_lxh/")   {    

   header("location:   login.php");   

exit; 

  } 

php写出一个安全的用户登陆系统须要注意哪些方面

1.加验证码*

2.三次失败锁定

3.密码不能ctrl+Vhtml加οncοpy="return false;" οnpaste="return false;" oncut="return false;" 

4.密码使用小键盘

5.动态口令卡

// echo false;结果为空

echo true;//1

echo '<hr/>';
echo ord('a');//转化为ASCll

echo '<hr/>';

echo chr(97);//ascll码转化为string

echo '<hr/>';
$arr=array('a'=>'aaaaa','b'=>'bbbbb');
echo "A is {$arr['a']}";//对于双引号内的数组引用若是下标加了引号则该变量必定要加{},不然会报错

//静态变量的值每次执行后会保存在内存中,不会自动销毁

echo '<hr/>';
//heredoc技术

//session.use_trans_sid=1;(当客户端禁用cookie时,浏览器自动带上session_id,其余页面根据session_id取值)

echo '<hr/>';
/** 把字符串转换成数组可以使用函数有str_split()(每一个字符做为一个数组元素)explode()//每一个单词做为一个数组元素,preg_split() 

把数组转换在字符串implode(),join()array_reduce($arr,fun)    经过使用用户自定义函数,将数组转化为字符串。

写一个函数将open_door转化成OpenDoor

function _Ucwords($str){
return str_replace(' ','',ucwords(str_replace('_',' ',$str)));

//或者

return strtr(ucwords(str_replace('_',' ',$str)),array(' '=>''));
}
echo _Ucwords('open_door');
echo '<hr/>';
//或者function Ucword($str){
    $arr = explode('_',$str);
foreach($arr as $k=>$v){
        $arr[$k]=ucfirst($v);
    }
return implode($arr);
}
echo Ucword('get_by_id');

echo '<hr/>';
//12345657678转化成12345657678$number='12345657678';
number_format($number);
//或者function my_number_format($number){
    $num=strrev($number);//反转字符串$arr=str_split($num,3);
    $num=strrev(implode(',',$arr));
//也能够写做$num=strrev(join(',',$arr));join()implode的别名}

echo '<hr/>';
// HELLO WORLD转化为Hello Word$bar = '!HELLO WORLD';
$bar = ucwords(strtolower($bar));
echo $bar;
echo '<hr/>';
echo '<hr/>';
echo '<hr/>';
/** 文件目录操做*///经过 PHP 函数的方式对目录进行遍历,写出程序

function dirList($path){
    $arr =scandir($path);
foreach($arr as $file){
if($file !='.' && $file !='..'){
            $pathNext =$path.'/'.$file;
echo $pathNext;
if(is_dir($pathNext)){
                dirList($pathNext);
            }else{
echo '<p>'.$pathNext.'</p>';
            }
        }
    }

}
$path='D://WWW';
dirList($path);
echo '<hr/>';
$a=array("red","green","blue","yellow","brown");
$random_keys=array_rand($a,3); //随机取n个键

var_dump($random_keys);
var_dump($a[$random_keys[1]]);

echo '<hr/>';
$str = "Shanghai";
echo chunk_split($str,2,'-');//Sh-an-gh-ai-


echo '<hr/>';
$str = 'sdgdg"sdsds"\//gh.ghnullNULL\'\'';
echo addslashes($str);
echo($str);

echo '<hr/>';
$str='i am da niu and you?';
echo strstr($str,'am');//am da niu and you?

echo '<hr/>';
sql语句

// A(id,sex,par,c1,c2),B(id,age,c1,c2)两张表,其中 A.id  B.id 关联, 如今要求写一条SQL 语句,将  age>50 的记录的 c1c2 更新到 表中统一记录中的 c1c2 字段中。

$sql="update A,B set A.c1=B.c1,A.c2=B.c2 where A.id=B.id and B.age>50";

1.login表中选出name字段包含admin字段的前十条结果* select * from login where name like '%admin%' limit 10 order by id; 

*2通配符:咱们使用likenot like加上一个带通配符的字符串就能够了。共有两个通配符_(单个字符)&(多个字符)select concat(first_name,' ,last_name) as name,where last_name like W%'; //找到以W或w开头的人where last_name like W%'; //找到名字里面W或w开头的人*

 3.使用扩展正则*SELECT * FROM `sunup_user` where username REGEXP 'test[0-9]+';

 .匹配任何单个的字符;

一个字符类[...]匹配在方括号内的任何字符。例如,[abc]匹配abc。为了命名字符的一个范围,使用一个-[a-z]” 匹配任何小写字母,而[0-9]匹配任何数字;

“ 匹配零个或多个在它前面的东西。例如,x*匹配任何数量的x字符,[0-9]*匹配的任何数量的数字,而.*匹配任何数量的任何东西。正则表达式是区分大小写的,可是若是你但愿,你能使用一个字符类匹配两种写法。例如,[aA]匹配小写或大写的a[a-zA-Z]匹配两种写法的任何字母。若是它出如今被测试值的任何地方,模式就匹配(只要他们匹配整个值,SQL模式匹配)。为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用^或在模式的结尾用$。为了说明扩展正则表达式如何工做,上面所示的LIKE查询在下面使用REGEXP重写:为了找出以b开头的名字,使用^匹配名字的开始而且[bB]匹配小写或大写的bmysql> SELECT * FROM pet WHERE name REGEXP "^[bB]"; 

4.变量:变量的命名规格是:@name赋值语法是 @name:=value ( pascal?) 使用起来也简单:select @birth:=birth from presidentwhere last_name ='adsltiger'; //执行完成后咱们就就会有一个@birth变量可用用一下试试:select concat(first_namem,' ,last_name) as name from presidentwhere birth<@birth order by birth; //看看那些人比我大!

mysql重启后索引会回收


1.对象间的赋值默认是引用传值,指向同一个内存空间;只有指向同一内存地址的两个对象才相等;

2.只要在实例化后在类外改变了属性和方法,无论在类内仍是类外调用都是改变后的值;

2.当构造方法__construct()有参数时,在实例化时在对象里传参;

3.__destruct()释放程序资源,(unset操做,关闭文件,数据库)当类执行完成后自动运行;析构函数不能传参;当unset和给对象从新赋值时都会触发;当程序运行完后php会自动销毁变量和对象,释放内存。故实例了几个对象最后就会执行几回__destruct();子类会继承父类的构造方法,若子类也有定义,则会被覆盖;

4.__get($param);当对象调用不存在的属性时自动调用;做用:实现私有属性在类外访问(在__get()内部给返回值);

5.__set($param,$val);给私有属性赋值时不会报错,但调用赋值的属性时得用__get();做用:对私有属性赋值;

6.PHP不容许调用不存在的属性但容许给类中不存在的属性赋值,而不会报错

7.__isset(isset调用的属性名);当给一个属性isset()判断时自动调用此方法;

8.__unset(属性名)当给一个属性使用unset时,自动调用;

9.__call(不存在的方法名,调用不存在的方法时的全部参数(array):调用不存在的方法是执行;做用:实现私有方法的外部调用;call_user_func_array(array(),)

10.__toString();将对象能够以字符串方式输出;

11.__autoload($classname);当实例化一个不存在的类时,程序自动调用该方法;做用:避免类的重复加载;

12.静态属性static,属于整个类,而非某个对象。访问方式 类名::$属性名,还能够用parent:$属性名;子类继承过来的属性和方法用$this$parent均可以访问,但$this优先从子类开始寻找。还可用self:$属性名静态属性不能重写;

13.1)静态属性存在于类空间,普通属性存在于每一个对象中。类声明完毕即存在,不依赖于对象,不实例化也能够访问。不依赖于对象(内存中只有一份)。静态方法中不能含有非静态属性;

2)还能够不用实例化。直接使用类名::方法名(属性名)来调用;

3)在类中静态方法访问静态属性,使用类名::静态属性名便可调用类中的静态属性。

4)在当前类中若是要访问静态成员能够使用self::关键字进行访问。

14.类常量定义 const name="liyong";访问方式:类名::name;只能在类的内部访问;const不能在条件语句中定义常量;const采用一个普通的常量名称,define能够采用表达式做为名称。const 老是大小写敏感,然而define()能够经过第三个参数来定义大小写不敏感的常量使用const简单易读,它自己是一个语言结构,而define是一个方法,用const定义在编译时比define快不少。

15.对象直接相互赋值是引用传递,而想要值传递用clon()方法;在类中定义__coln魔术方法;

16.抽象类不能被实例化,用来规范开发者定义方法的名称;抽象方法不能有方法体;抽象方法必需要在子类中实现(重写/覆盖);抽象类中能够存在非抽象方法,但必须有抽象方法;

17.接口只能声明抽象类和常量;一样不能实例化,只能实现implements,不叫继承;子类必须实现接口的所有方法;一个类能够实现多个接口;做用:用来规范开发,命名规范接口设计原则:尽可能避免臃肿,一个接口完成一件事,把共有的常量方法单独封成接口;

18.对象串行化serialize()//对象转字符串

19.设计模式:单件模式(单例模式Singleton),工厂方法模式(Factory Method),抽象工厂模式(Factory Abstract) 适配器模式(),观察者模式,命令模式,策略模式

20.对象的回收机制:**//** 接口和抽象类的区别:* 1.抽象类能够有抽象的方法,而接口中只能有抽象方法

 2.一个类能够继承多个接口但只能继承一个抽象类接口经过implements实现,抽象类经过extends继承*/

class Human{

public $name='张三';
public $gender=NULL;

public function __destruct() {
echo '发了';
    }
}

$a= new Human();
$b=$c=$d=$a;
echo $a->name,'<br />';
echo $b->name,'<br />';

$b->name='李四';
echo $a->name,'<br />';
echo $b->name,'<br />';
//对象的相互赋值是引用传递,即$a,$b,$c,$d都指向同一个对象因此都会变成李四;unset($a);//注意这里的unset对对象是无效的,由于还有$b,$c,$d指向这块内存空间,只有当他们所有unset后才会触发析构函数;//unset($b);unset($c);unset($d);echo '<hr />';
//-----------------------兄弟连面向对象-------------------------------/** 

 数据库设计时,常遇到的性能瓶颈有哪些,常有的解决方案?

1) 查询速度慢  ,避免全盘扫描,由于全盘扫描会致使大量磁盘 I/O 操做 用 sphinx 来解决

2) 读写过于频繁 读写分离来作

3) 设置主从,并作好冗余备份

4) 数据库压力过大 采用分布式数据库负载均衡来解决

5) memcache 缓存层

6) 连接数据库使用 PDO,或者 mysqli 预处理缓存字段

7) 索引优化

 面向对象基础
声明:[修饰类的关键字]class 类名{ 成员(成员属性:变量;成员方法:函数) } *命名:类名.class.php,方便自动加载*变量和函数名驼峰式命名,类名首字母大写;*$对象引用=new 类名; *变量成员的调用不用$ 

*构造方法就是对象建立完成后第一个调用的方法;*php4中和类名相同的就是构造方法; *php5中,构造方法使用魔术方法__construct(); 

*每一个魔术方法都在不一样时刻为了完成某一个功能自动调用的方法*__destruct();用于关闭资源,作一些清理工做。*例如类内调用的__get(),__set(),__isset(),__unset(),__clone(),__call(),__sleep(),__weakup(),__toString() *类外调用,惟一一个__autoload(); 

.封装:

就是把对象的成员(属性和方法)结合成一个独立的相同单位,并尽量隐藏对象的内部细节*封装可提升安全性*封装使用private(只能在对象内部用$this访问

1.方法的封装主要用于内部的一个主方法借助其余若干小方法工做,这些小方法没有单独存在的意义,就能够用private把这些小方法封装起来

2.属性的封装,只要变量在多个方法中都用到就将该变量声明为成员属性。封装属性为了避免让属性值在实例化后随意读取和更改。类内访问不受影响。封装后能够经过调用共有方法传参来改值,能够在public方法中限制值的范围。可经过方法的return来读取私有属性。

3.若是要设置和取值的属性不少可用魔术方法__set__get来操做。

4__get获取成员属性的值时自动调用,必须有一个参数__get($proname),为传进来的属性名,实例化后获取哪一个私有属性就会把哪一个私有属性传进来,__get方法内使用$this->$proname;来获取(ps:$proname只是一个参数,并非成员属性,故调用时加上$,通过方法就能够判断传进来的成员属性是哪个,从而写程序来控制。

5__set为成员属性设置值时自动调用,有两个参数__set($proName,$proValue),__set方法内使用$this->$proName=$proValue;来设置值。

6__isset($proName)查看私有属性是否存在时自动调用,方法内加上 return isset($this->$proName),禁止判断是否设置可经过判断传进来的属性名return false;便可

7__unset($proName)直接删除对象中私有属性时调用,方法中加上unset($this->$proName); 

.继承

1.父类:基类;    子类:派生类*开放性,可扩充性,增长代码的重用性,提升可维护性*若是两个或两个以上类中有公用的部分,那么公用的部分就能够做为父类;*继承就是在父类的基础上扩展父类的功能;*C++多继承,同一个类能够有多个父类;PHP属于单继承,同一个类只能继承一个父类;但一个类均可以有多个子类;

2.子类声明用extends关键字,格式:class 子类名 extends 父类名{},子类不能继承私有方法

3.成员属性通常先声明,加关键字privateprotectedpublic再用__construct设置值,这样即便是私有属性子类也能够用; *protected类内和子类可用,类外不能用;

4.子类重载父类的方法;重载即方法名相同但参数类型不一样。强类型语言可经过指定参数类型实现。PHP中子类方法名与父类相同则会覆盖父类同名方法,还能够扩展此方法;*在覆盖父类方法的子类中调用父类方法使用父类名::方法名();即对象->成员;类::成员;

5.借助父类初始化:parent:: __construct(属性1,属性2,属性3,........); 

6.注意:子类只能放大权限不能缩小权限,例如父类为public子类必须为public,父类为protected,则子类可为protectedpublic*

.多态

多态:  多态是面向对象的三大特性之一*多态是面向对象设计的重要特性,它展示了动态绑定(dynamic binding)的功能,也称为同名异式Polymorphism)。多态的功能可以让软件在开发和维护时,达到充分的延伸性(extension)。事实上,多态最直接的定义就是让具备继承关系的不一样类对象,能够对相同名称的成员函数调用,产生不一样的反应效果。例如:interface Testfuanction aaa();fuanction bbb();class one implements Test{function aaa(){echo "aaaaaaaaaaaaa";}function bbb(){echo "bbbbbbbbbbbbbbb";}}class Tow implements Test{function aaa(){echo "11111111111111111";}function bbb(){echo "2222222222222222222";}}$a=new Two;$b=new one;$a->aaa();$b->aaa(); * *1抽象类是一种特殊的类,接口是一种特殊的抽象类,多态就是要用到抽象类和接口*抽象类和接口的做用同样,功能有所不一样*抽象方法:若一个类中的方法没有方法体,而直接使用;结束的就是抽象类。方法体就是方法中的{},例如:function test(); *若一个方法是抽象方法,就必须使用abstract关键字修饰,抽象类:若类中存在抽象方法,则该类就是抽象类;*抽象类也须要abstract关键字修饰,其特殊性就在于它有抽象方法;*抽象类不能实例化对象,类内的成员也不能直接被访问。*要想使用一个抽象类就必须用一个类去继承抽象类,子类不能再是抽象类,子类可重写抽象类的方法,给抽象方法加上方法体便可实例化子类。*子类必须实现抽象类中抽象方法,即子类必须有抽象类的方法名。其本质就是定义一些规范让子类按这些规范去实现本身的功能。*目的:将本身写的程序块加入到 原来写好的程序中去;

2.接口是为了解决PHP不能多继承,若使用抽象类则继承抽象类的子类就不能再继承其余类。若既想实现一些规范又想继承其余的类就要使用接口。

3.接口与抽象类的对比:

1做用相同,都不能建立对象,都须要子类去实现

2接口的声明不同

接口被实现的方式不同 ,interface 接口名{  } 

4接口的全部方法必须是抽象方法,但不须要abstract修饰

5接口 的成员属性只能声明常量,用const HOST="localhost";常量可经过  类名::常量  直接访问

6接口中的成员访问权限都必须是public,抽象类中最低的访问权限是protected

7子类实现接口用implements关键字 ,接口之间的继承仍是使用extends*能够使用抽象类去实现接口中的部分方法*若是想让子类能够建立对象,则必须实现接口中的所有抽象方法* *    能够定义一个接口去继承另外一个接口* *    一个类能够去实现多个接口(按多个规范去开发子类)使用逗号分隔多个接口名称* *    一个类能够在继承一类的同时,去实现一个或多个接口(先继承,再实现) 

例如:class Man extends Person implements Woker,StudentsTeachers{   } *    使用implements的两个目的

1. 能够实现多个接口 ,而extends词只能继承一个父类

2. 没有使用extends词,能够去继承一个类, 因此两个能够同时使用** 

1   class 类名{ * *    }//普通类* *

 2   abstract class 类名 { * *    }//抽象类* *   声明方式* 

3  interface 接口名{ * *   } //接口* * * * * *

.PHP中经常使用的关键字和魔术方法

1.final不能修饰成员属性,只能修饰类和方法;使用final修饰的方法不能被继承和重写(覆盖)

2.static能够修饰成员属性和方法,不能修饰类static修饰的成员属性能够被同一类的全部对象共享;静态数据存在内存中的数据段(初始化静态段);静态数据是在类第一次加载时分配到内存中的,之后直接在内存中调用

注意:(1.静态成员直接使用类名去访问,不用建立对象,访问格式 类名::静态成员,例如Parent::go();这种格式还用于覆盖父类方法的子类中调用父类方法使用父类名::方法名() 

(2.若在类中使用静态成员可用self表明本类($this表明本对象),例如self::go(); *静态的成员方法不能访问非静态的成员,由于非静态的成员就必须用对象来访问,$this就表示调用它的对象,而静态成员不用对象来去调用,$this就不能表明哪一个对象

(3.若肯定一个方法不使用非静态的成员则可将这个方法声明为静态方法(不用建立对象直接经过类名就能够访问);

3.const只能修饰成员属性,用于在类中声明常量,与define功能相同,访问方式和静态成员相同。类内使用seif::常量  类外 类名::方法*常量必定要在声明时给初值,存储与数据段*__call$methodName,$arg1,$arg2....) 调用系统中不存在的方法时自动调用,用于处理调用不存在方法时的错误提示。

__toString()return "wwwwwwwwwww";}直接输出对象引用时调用

__clone()能够没参数。与原对象各占一个内存空间,如果把对象引用赋值给一个变量,则这个变量和原对象指向同一个内存地址;*其做用与构造方法相似,用于给克隆方法初始化。其中的$this指的是克隆出来的副本的对象,$that表明本来对象;*用法:$p=new Person;  $p1=clone $p; 

4__autoload($className){include './'.$className.'class.php';}惟一一个不在类中添加的方法;用于在类外部自动加载类,只要用到外部类名就会被自动加载

5__sleep(),序列化时自动调用的方法;能够将一个对象部分串行化。只要这个方法中返回一个数组,数组中有几个成员属性就序列化几个成员属性,若不加这个方法则全部成员都被序列化了,例如function __sleep(){return array(name,age);//将成员属性nameage序列化} *其本质就是规定属性中须要序列化的成员属性* *对象串行化,将一个对象转化成一个二进制串存储于内存中;*用于将对象长时间存储于数据库或文件中,或将对象在多个PHP文件中传输时;*例如:$p=new Person();$str=serialize($p);//将对象转化成二进制串file_put_contents("p.txt",$str)//写入文件$str2=file_get_contents("p.txt");$pp=unserialize($str2)//反序列化.获得的$pp与原对象$p相同;*6__wakeup()是在反序列化时自动调用的方法,为序列化后的对象初始化(有对象诞生就要初始化);* * * * * * * * * * * */

class Person{

var $name;
var $age;
var $sex;
function say() {
echo"说话";
echo $this->name='888';
    }

function run() {
echo "";
    }


}
$p1=new Person;
$p2=new Person;
$p1->say();
echo $p1->name='李勇';
echo $p2->age;

/** * * javascript *//*explore=navigator.userAgent;if(explore.search('MSIE')>=0){    alert('ie 浏览器');}else{    alert('IE')} *//** * linux基础* 1.如何实现天天 点钟从新启动服务器crontab -e分 时 日 月 周00 00 * * * /sbin/init 6 * #!/bin/bash chown root /path/to * //shell遍历目录的脚本#!bin/bash tree chmod 777 tree.sh

1. 什么事面向对象?主要特征是什么? 

面象对象是把天然界的物体和概念直接映射到程序界的一种比较优雅的手段主要特征:抽象、继承、封装、多态  

2. SESSION 与 COOKIE的区别是什么,请从协议,产生的缘由与做用说明

Session是服务器端保存客户端状态信息的方案,通常保存在服务器端内存中,session超时时间在服务器端进行设置。 Cookie是客户端保存信息的方案,通常是以文件的形式进行保存,cookie清空时间是在客户机浏览器设置。  

3. HTTP 状态中302403、 500代码含义? 

302:临时转移成功,请求的内容已转移到新位置 403:禁止访问 500:服务器内部错误 401表明未受权。 

301"   ; Moved Permanently
"302" ; Moved Temporarily
"304" ; Not Modified
"400" ; Bad Request
"401" ; Unauthorized
"403" ; Forbidden

4. Linux 下创建压缩包,解压缩包的命令 

Tar -cvf demo.tar demo Tar -xcf demo.tar  

Gzip demo  guzip demo.gz  gzip -d demo.gz

Bzip2 -k demo. Bunzip demo.bz2

Zip -r demo unzip demo.zip

5. 请写出数据类型(int char varchar datetime text)的意思;请问 varchar 和 char有什么区别? 

Int 整数 char 定长字符 Varchar 变长字符 Datetime 日期型 Text 文本型 Varchar char的区别 char是固定长度的字符类型,分配多少空间,就占用多长空间。 Varchar是可变长度的字符类型,内容有多大就占用多大的空间,能有效节省空间。 因为varchar类型是可变的,因此在数据长度改变的时,服务器要进行额外的操做,因此效率比char类型低

6. MyISAM 和 InnoDB 的基本区别? 

MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快,可是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能

7. 不使用cookie向客户端发送一个cookie. 

理解:session_start()开启时,生成一个常量 SID,当COOKIE开启时,这个常量为空,当COOKIE关闭时,这个常量中存储了PHPSESSID的值。经过在URL后加一个SID参数来传递SESSIONID的值,从而使客户端页面能够使用SESSION里面的值。 当客户端开启COOKIE和服务器端开启SESSION时。 浏览器第一次请求,服务器会向浏览器端发送一个COOKIE里面存储SESSIONID. 当浏览器第二次请求时,会把已存在的COOKIE一块儿提交到服务器端。  

10. isset() 和 empty() 区别,对不一样数据的判断结果,$a=0;$a='0';$a='';$a=false;$a=null; 

Isset()判断是否存在,存在就为真无论是否为假。

Empty()判断是否为空,为空时为真值,不存在也为真值。 

Isset(): true;true;true;true;false Empty():true;true;true;true;true  

12. 如何在页面之间传递变量(至少两种方式) ? get,post  

3、PHP 代码题  

1. 写出匹配URL的正则表达式

/^[a-zA-z]+:\/\/(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?/ 

2. 请写出常见的排序算法,并用PHP实现冒泡排序,将数组$a = array()按照从小到大的方式进行排序。 

$arr=array(233,5,6,75454,32); 

Mao($arr); 

Function mao($arr){ 

    $n=count($arr);

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

        For($j=$n-1;$j>0;$j--){

             If($arr[$j-1]>$arr[$j]){ 

                $t=$arr[$j-1]; 

                $arr[$j-1]=$arr[$j];

                 $arr[$j]=$t;

             } 

            }

     } 

}  

3. 在数据库test中的一个表student,字段是nameclassscore。分别表明姓名、所在班级,分数。 

1) 学出每一个班级中的学生,按照成绩降序排序

2) 查出每一个班的及格人数和不及格人数,格式为:class、及格人数、不及格人数;

 3) PHP写入链接数据库("localhost","msuser","mspass")、执行以上SQL、显示结果、判断错误、关闭数据库的过程; 

1) SELECT * FROM student ORDER BY score desc;

<?php 

$conn=mysql_connect('localhost','root','123456'); 

 @mysql_select_db('test');  

$sql="";  

$result=Mysql_query($sql);

  If($result && mysql_affected_rows()){ ............................. }

  Mysql_close($conn);

请说明 PHP 中传值与传引用的区别。何时传值何时传引用?
答: 传值只是把某一个变量的值传给了另外一个变量,而引用则说明二者指向了同一个地方。
PHPerror_reporting这个函数有什么做用?
答: The error_reporting() 

1 E_ERROR 致命的运行时错误(它会阻止脚本的执行)
2 E_WARNING 运行时警告(非致命的错误)
4 E_PARSE 解析错误 
8 E_NOTICE 注意(事情多是或者可能不是一个问题) 
256 E_USER_ERROR 用户生成的错误消息,由trigger_error()函数生成 
512 E_USER_WARNING 用户生成的警告,由trigger_error()函数生成 
1024 E_USER_NOTICE 用户生成的注意,由trigger_error()函数生成 
2048 E_STRICT 关于兼容性和互操做性的建议 
8191 E_ALL 全部的错误、警告和建议
请用正则表达式(Regular Expression)写一个函数验证电子邮件的格式是否正确。
答:
php
if(isset($_POST['action']) &&
$_POST['action']==’submitted’)
{
$email=$_POST['email'];
if(!preg_match(“/^(w:?+.?)*w+@(?:w+.?)*w+$/”,$email))

{
echo
电子邮件检测失败”;
}
else
{
echo
电子邮件检测成功”;
}
}
else
{
?>

1. 使用PHP描述冒泡排序和快速排序算法,对象能够是一个数组

//冒泡排序(数组排序)

function bubble_sort($array)

{

    $count = count($array);

    if ($count <= 0) return false;

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

            for($j=$count-1; $j>$i; $j){

                if ($array[$j] < $array[$j-1]){

                    $tmp = $array[$j];

                    $array[$j] = $array[$j-1];

                    $array[$j-1] = $tmp;

                   }

            }

        }

    return $array;

}

//快速排序(数组排序)

function quick_sort($array) {

if (count($array) <= 1) return $array;

$key = $array[0];

$left_arr = array();

$right_arr = array();

for ($i=1; $i< $i++){> 

if ($array[$i] <= $key)

$left_arr[] = $array[$i];

else

$right_arr[] = $array[$i];

}

$left_arr = quick_sort($left_arr);

$right_arr = quick_sort($right_arr);

return array_merge($left_arr, array($key), $right_arr);

}

2. 使用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;

}

}

3. 写一个二维数组排序算法函数,可以具备通用性,能够调用php内置函数

//二维数组排序, $arr是数据,$keys是排序的健值,$order是排序规则,1是升序,0降序

function array_sort($arr, $keys, $order=0) {

if (!is_array($arr)) {

return false;

}

$keysvalue = array();

foreach($arr as $key => $val) {

$keysvalue[$key] = $val[$keys];

}

if($order == 0){

asort($keysvalue);

}else {

arsort($keysvalue);

}

reset($keysvalue);

foreach($keysvalue as $key => $vals) {

$keysort[$key] = $key;

}

$new_array = array();

foreach($keysort as $key => $val) {

$new_array[$key] = $arr[$val];

}

return $new_array;

}

题一:

/** 

请以空格做为间隔,拆分字符串Apple Orange Banana Strawberry,组成数组$fruit, 

数组中全部元素都用小写字母,并按照字母前后次序排序 

*/ 

class sort 

private $str; 

public function __construct($str) 

$this->str=strtolower($str); 

private function explodes() 

if(empty($this->str)) return array(); 

$arr=explode(” “,$this->str); 

return is_array($arr)?$arr:array($arr); 

public function sort() 

$explode=$this->explodes(); 

sort($explode); 

return $explode; 

//$str=Apple Orange Banana Strawberry

////$sortob=new sort($str); 

////var_dump($sortob->sort());

复制代码题二:

/** 

对于用户输入一串字符串$string,要求$string中只能包含大于0的数字和英文逗号, 

请用正则 表达式验证,对于不符合要求的$string返回出错信息 

*/ 

class regx 

public static function check($str) 

if(preg_match(/^([1-9,])+$/,$str)) 

return true; 

return false; 

$str=12345,6

if(regx::check($str)) 

echo suc

else 

echo fail

}

复制代码题三:

<?php 

/** 

请写一段程序,在服务器建立一个文件fruit.dat,将试题3中获得的数组写入到改文件中, 

而后写一段程序从文件中读取并还原数组 

* @author zhuwenqiong 

*/ 

class sort 

private $str; 

public function __construct($str) 

$this->str=strtolower($str); 

private function explodes() 

if(empty($this->str)) return array(); 

$arr=explode(” “,$this->str); 

return is_array($arr)?$arr:array($arr); 

public function sort() 

$explode=$this->explodes(); 

sort($explode); 

return $explode; 

class file 

private $sort=null; 

private $filepath; 

public function __construct($arrobj,$path) 

$this->sort=$arrobj; 

$this->filepath=$path; 

private function getresource($filename,$mode) 

return fopen($this->filepath.$filename,$mode); 

private function closeresource($resource) 

fclose($resource); 

public function savefile($filename) 

$arr=$this->sort->sort(); 

$fopen=$this->getresource($filename,a+); 

if(!$fopen){ 

echo 文件打开失败!;exit; 

var_dump($arr); 

foreach($arr as $key=>$value) 

fwrite($fopen,$value.\n); 

$this->closeresource($fopen); 

public function readfile($filename) 

$this->savefile($filename); 

$fopen=$this->getresource($filename,r); 

if(!$fopen){ 

echo 文件打开失败!;exit; 

$arr=array(); 

while(!feof($fopen)) 

$get=fgets($fopen); 

if(!empty($get)) 

$arr[]=str_replace(\n,",$get); 

$this->closeresource($fopen); 

return $arr; 

$file=new file(new sort(Apple Orange Banana Strawberry),E:\\); 

$arr=$file->readfile(fruit.dat); 

var_dump($arr); 

?> 

复制代码题四:

<?php 

/** 

单例模式,建立mysqli数据库连接的单例对象 

* @author zhuwenqiong 

*/ 

class Db 

private static $instance; 

public $handle; 

private function __construct($host,$username,$password,$dbname) 

$this->handle=NULL; 

$this->getcon($host,$username,$password,$dbname); 

public static function getBb() 

self::$instance=new Db(); 

return self::$instance; 

private function getcon($host,$username,$password,$dbname) 

if($this->handle!=NULL){ 

return true; 

$this->handle= mysqli_connect($host,$username,$password,$dbname); 

}

windows平台, Apache Http Server启动失败排错思路是什么?
答:

检查apache使用的80端口是否被占用,若是被占用,先中止占用80端口的服务,而后启动apache服务器
PHP session扩展默认将session数据储存在哪里? D

A)  SQLite DatabaseB)  MySQL DatabaseC)  Shared Memory

D)  File SystemE)  Session Server

 

.若是你想要自动加载类,下面哪一种函数声明是正确的 C

A)  function autoload($class_name)B)  function __autoload($class_name, $file)

C)  function __autoload($class_name)D)  function _autoload($class_name)

E)  function autoload($class_name, $file)

PHP程序使用utf-8编码如下程序输出结果是什么?D
<?php
$str = ’hello你好世界’;

echo strlen($str);

?>

A) 9B) 13C) 18D) 17

 

你所知道的php数组相关的函数?

答:

Array_flip()

Array_pop()

Array_push()

Array_unshift()

End()

Sort()

Rsort()

Usort()

Count()

Key()

Current()

List()

Each()

Foreach()

Array_count_values()

Array_difff()

Arrry_keys()

Array_merge()

Array_pad()

Array_rand()

Array_shift()

Array_unique()

Array_values()

Next()

Prev()

Reset()

 

php读取文件内容的几种方法和函数?

答:

打开文件,而后读取。Fopen() fread()

打开读取一次完成 file_get_contents()

 

如下程序,变量str什么值的状况下输出111? if( ! $str ) { echo 111; }

答:

$str值为:0’0′false,null,”"

说说你对缓存技术的了解?

答:

1缓存技术是将动态内容缓存到文件中,在必定时间内访问动态页面直接调用缓存文件,而没必要从新访问数据库。

2使用memcache能够作缓存。

 

你所知道的设计模式有哪些?

答:

工厂模式、策略模式、单元素模式、观察者模式、命令链模式


说说你对SVN的了解?优缺点? 

答:

SVN是一种版本控制器,程序员开发的代码递交到版本服务器进行集中管理。

SVN的优势:代码进行集中管理,版本控制容易,操做比较简单,权限控制方便。

缺点:不能随意修改服务器项目文件夹。

PHP加速模式/扩展? PHP调试模式/工具?

答:

Zend Optimizer加速扩展

调试工具:xdebug

 

你经常使用到的mysql命令?

答:

Select * from table

Update table set field=’value’ where id=

Delete from where id=

Insert into table values(‘value1′,’value2′)

Create table tablename

Show tables

 

进入mysql管理命令行的命令?

答:

Mysql -u root -p

 


 

show create database mysql; 这个命令的做用?

答:显示建立数据库的sql语句

 

show create table user; 这个命令的做用?

答:显示建立表的sql语句

 

desc user; 这个命令的做用?

答:查询user表的结构

 

explain select * from user; 这个命令的做用?

答:获取select相关信息

 

show processlist; 这个命令的做用?

答:显示哪些线程正在运行

 

SHOW VARIABLES; 这个命令的做用?

答:

显示系统变量和值

 

SHOW VARIABLES like ’%conn%’; 这个命令的做用?

答:显示系统变量名包含conn的值

 

LEFT JOIN 写一个SQL语句?

答:

Select A.id,A.class from A left join B on A.cid=B.id

 

in, not in, exist, not exist的做用和区别?

答:

in在什么中

Not in 不在什么中

Exists 存在

Not exists 不存在

 

怎么找到数据库的配置文件路径?

答:

在数据库安装目录下,my.ini

linux: rpm  -qc mysql

 

简述Linux下安装PHP的过程?

答:

安装软件以前先安装编译工具gccgcc-c++

拷贝源码包,解包解压缩

Cd /lamp/php进入php目录

./configure –prefix=/usr/local/php –with-config-file-path=/usr/local/php/etc指定安装目录和配置文件目录

Make 编译

Make install安装

 

简述Linux下安装Mysql的过程?

答:

Groupadd mysql 添加一个用户组mysql

Useradd -g mysql mysql 添加一个mysql用户指定分组为mysql

Cd /lamp/mysql 进入mysql目录

./configure –prefix=/usr/local/mysql/ –with-extra-charsets=all

Make

Make all

 

简述Linux下安装apache的过程?

答:

Cd /lamp/httpd 进去apache软件目录

./configure –prefix=/usr/local/apache2/ –sysconfdir=/etc/httpd/ –with-included-apr

Make

Make all

 

HTML/CSS/DIV/Javascritp

 

javascript取得一个input的值?取得一个input的属性?

答:

document.getElementById(‘name’).value;

document.getElementById(‘name’).getAttribute('name');

 

 

 

 

Jquery取得一个input的值?取得一个input的属性?

:

$(“input[name='aa']“).val();

$(“input[name='aa']“).attr(‘name’);

 

请您写一段ajax提交的js代码,或者写出ajax提交的过程逻辑。

答:

var xmlhttp;

if(window.XMLHttpRquest)

{

xmlhttp=new XMLHttpRequest();

}

else if(window.ActiveXObject)

{

xmlhttp=new ActiveXObject(‘Microsoft.XMLHTTP’);

}

xmlhttp.open(‘GET’,’1.php?aa=name’,true);

xmlhttp.onreadystatechange=function(){

if(xmlhttp.readyState==4)

{

if(xmlhttp.status==200)

{

var text=xmlhttp.responseText;

}

}

}

xmlhttp.send(null);

 

写出你认为语言中的高级函数

答:

Imagecreate

Imagecolorallocate

Imagesetpixel

Imagettftext

Iconv

Mb_substr

Mysql_connect()

Mysql_select_db

Mysql_query

mysql_fetch_row

Mysql_close

 

简述Cookie的设置及获取过程

答:

设置COOKIE的值:

Setcookie(名称,值,保存时间,有效域);

获取值:$_COOKIE['名称'];

 

面向对象中接口和抽象类的区别及应用场景

答:

1有抽象方法的类叫作抽象类,抽象类中不必定有抽象方法,抽象方法必须使用abstract关键字定义

2接口中所有是抽象方法,方法不用使用abstract定义

3当多个同类的类要设计一个上层,一般设计为抽象类,当多个异构的类要设计一个上层,一般设计为接口。

 

用面向对象来实现A对象继承BC对象

答:

Interface B{

 

}

Interface C{

 

}

Class A implements B,C{

 

}

 

写出Smarty模板引擎中你最经常使用的关键词

答:

Assign

Display

Foreach

Section

Loop

Item

$smarty

Now

Const

get

 

MySQL存储引擎中MyISAMInnoDB,在一样的应用场景中各有什么优缺点,索引结构如何实现

答:

MyISAM不支持外键和事务处理,可是查询速度比InnoDB类型的稍快。

InnoDB类型数据库支持外键和事务处理,查询速度比MyISAM稍慢。

建立索引:alert table tablename add index (`字段名`)

 

以下user表结构

名称

类型

说明

备注

Uid

Int unsigned

主键


Name

Varchar(20)



Age

Tinyint unsigned



 

需求:

增长一个字段性别sex,写出修改语句

Alert table user add sex enum(’0′,’1′);

 

 

 

查询出年龄介于20岁到30岁之间的用户

Select * from user where age>20 and age<30

 

若是是一个Web频繁访问的查询,上题的查询如何优化?

使用memcache缓存技术,在必定时间内将动态内容缓存到文件中,访问动态页面时,直接调用缓存文件而没必要从新查询数据库。

echo(),print(),print_r()的区别?

答:

Echo() PHP语法,能够输出多个值,不能输出数组。

Print() PHP函数,能够输出单个简单类型的变量值。

Print_r() php函数,能够打印出复杂类型变量的值,如数组,对象。

 

什么是模板技术、可以使HTMLPHP分离开使用的模板?

答:

模板技术就是使程序的逻辑代码和界面分开的技术。

可以使HTMLPHP分开的模板有:SmartyTemplatePHPlib TemplateFastTemplate

 

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

答:

优化程序,优化数据库,若是程序和数据库已经最优化,使用如下解决方法:

1、肯定当前服务器设备是否知足流量需求。

2、使用Memcache缓存技术,把动态内容缓存到文件中,动态网页直接调用这些文件,而没必要再访问数据库。

3、禁止外部盗链,图片和文件外部盗链会给服务器带来大量的负载压力,能够经过refer来禁止外部盗链,或者使用apache来配置禁止盗链。

4、控制大文件的下载,大文件的下载对于非SCSI硬盘来讲会占用大量的资源,致使服务器的响应能力降低。

5、使用不一样的主机分流主要流量,使服务器均衡负载。

6、使用流量统计软件统计分析网站流量,能够知道哪些地方耗费了大量的流量,哪些页面须要再进行优化。

mysql_fetch_row() mysql_fetch_array之间有什么区别?

答:

Mysql_fetch_row()以索引数组的方式取查询的结果集,mysql_fetch_array()以索引数组和关联数组两种方式取查询的结果集。

实现中文字串截取无乱码的方法

答:

Mb_substr();

 

PHP写出显示客户端IP与服务器IP的代码

答:

获取客户端IPget_env(“REMOTE_ADDR”);

获取服务器端IP$_SERVER["SERVER_ADDR"];

 

有一个网页地址好比PHP开发资源网主页http://www.phpres.com/index.html,如何获得它的内容?

答:

获取网页内容:

$url=http://www.phpres.com/index.html;

$str=file_get_contents($url);

 

请写一个函数验证电子邮件的格式是否正确

答:

function checkemail($email)

{

echo preg_match(/^[\w]+@[\w]+[\.]([\w]+)$/,$email)?email格式正确‘:’email格式不正确‘;

}

 

简述如何获得当前执行脚本路径,包括所获得参数

答:

$_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'];取得当前页面的完整路径和参数。

取得参数:$_SERVER['QUERY_STRING'];

 

JS表单弹出对话框函数是?得到输入焦点函数是

答:

Alert();

Onfocus();

.写一个函数,算出两个文件的相对路径

如 $a = /a/b/c/d/e.php;

$b = /a/b/12/34/c.php

计算出 $b 相对于 $a 的相对路径应该是 http://www.cnblogs.com/c/d()添上

$a=http://www.cnblogs.com/a/b/c/d/e.php;

$b=http://www.cnblogs.com/a/b/12/34/c.php;

答:

$ainfo=parse_url($a);

$binfo=parse_url($b);

$apath=ltrim($ainfo['path'],/');

$bpath=ltrim($binfo['path'],/');

$arr=explode(/,$apath);

$brr=explode(/,$bpath);

 

$count=count($arr);

for($i=0;$i<$count;$i++)

{

if($arr[$i]==$brr[$i])

{

$brr[$i]=..;

}

else

{

break;

}

}

$cha=implode(/,$brr);

print_r($cha);

 

写一个函数,可以遍历一个文件夹下的全部文件和子文件夹。

答:

function show($dirs){

$dir=opendir($dirs);

While($f=readdir($dir))

{

If($f!=.' && $f!=..)

{

$file=$dirs./.$f;

If(is_file($file))

{

Echo 文件名:‘.$file.’<br/>’;

}

Else

{

Show($file);

}

}

}

}

 

Cookiesession的区别,禁止了cookiesession能正常使用吗?session的缺点是什么?session在服务器端是存在哪里的?是共有的仍是私有的?

答:

COOKIE保存在客户端,用户经过手段能够进行修改,不安全,单个cookie容许的最大值是3k

SESSION保存在服务器端,相对比较安全,大小没有限制。

禁用了cookie以后session不能正常使用。

Session的缺点:保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗。

Session保存在服务器端的文件或数据库中,默认保存在文件中,文件路径由php配置文件的session.save_path指定。

Session文件是公有的。

 

数据库索引有几类,分别是什么?何时该用索引?

答:

普通索引、主键索引、惟一索引

并不是全部的数据库都以相同的方式使用索引,做为通用规则,只有当常常查询列中的数据时才须要在表上建立索引。

 

写几个魔术方法并说明做用?

答:

__call()当调用不存在的方法时会自动调用的方法

__autoload()在实例化一个还没有被定义的类是会自动调用次方法来加载类文件

__set()当给未定义的变量赋值时会自动调用的方法

__get()当获取未定义变量的值时会自动调用的方法

__construct()构造方法,实例化类时自动调用的方法

__destroy()销毁对象时自动调用的方法

__unset()当对一个未定义变量调用unset()时自动调用的方法

__isset()当对一个未定义变量调用isset()方法时自动调用的方法

__clone()克隆一个对象

__tostring()当输出一个对象时自动调用的方法

 

$_REQUEST$_POST$_GET$_COOKIE$_SESSION$_FILE的意思是什么

;

它们都是PHP预约义变量。

$_REQUEST用来获取postget方式提交的值。

$_POST用来获取post方式提交的值。

$_GET用来获取get方式提交的值。

$_COOKIE用来获取cookie存储的值,

$_SESSION用来获取session存储的值,

$_FILE用来获取上传文件表单的值

 

数组中下标最好是什么类型的,为何?

答:

数组的下标最好是数字类型的,数字类型的处理速度快。

 

++ii++哪个效率高,为何?

答:

++i效率比i++的效率更高,由于++i少了一个返回i的过程。

 

119.magic_quotes_gpc()magic_quotes_runtime()的意思是什么?

答:

Magic_quotes_gpc()php配置文件中的,若是设置为on则会自动POST,GET,COOKIE中的字符串进行转义,在以前加\

Magic_quotes_runtime()php中的函数,若是参数为true则会数据库中取出来的单引号、双引号、反斜线自动加上反斜杠进行转义。

 

120.Echo()print()print_r()的区别?

答:

Echo php语法,能够输出多个变量,不能输出数组。

Print()php中的函数,只能输出简单的变量。

Print_r()php中的函数,能够输出变量也能够输出数组。

 

121.框架中什么是单一入口和多入口,单一入口的优缺点?

答:

1多入口就是经过访问不一样的文件来完成用户请求。

单一入口只web程序全部的请求都指向一个脚本文件的。

 

2单一入口更容易控制权限,方便对http请求能够进行安全性检查。

缺点:URL看起来不那么美观,特别是对搜索引擎来讲不友好。

 

122.提示类型200404502是什么意思。

答:

200是请求成功,404是文件未找到,502是服务器内部错误

 

123.编写一个自定义函数提取这段路径的的后缀名。

答:

Www/hello/test.php.html?a=3&b=4

Function geturltype($url){

$info=parse_url($url);

Return end(explode(.,$info['path']));

}

124.你对Memcach的理解,优势有哪些?

答:

Memcache是一种缓存技术,在必定的时间内将动态网页通过解析以后保存到文件,下次访问时动态网页就直接调用这个文件,而没必要在从新访问数据库。使用memcache作缓存的好处是:提升网站的访问速度,减轻高并发时服务器的压力。

Memcache的优势:稳定、配置简单、多机分布式存储、速度快。

 

 

 

 

 

125.对关系型数据库而言,索引是至关重要的概念,请回答有关索引几个问题:

a) 索引的目的是什么?

b) 索引对数据库系统的负面影响是什么?

c) 为数据表创建索引的原则有哪些?

d) 什么状况下不宜创建索引?

答:

索引的目的:

1、快速访问数据表中的特定信息,提升检索速度

2、建立惟一性索引,保证数据库表中每一行数据的惟一性

3、加速表和表之间的链接

4、使用分组和排序子句进行数据检索时,能够显著减小查询中分组和排序的时间

负面影响:建立索引和维护索引须要耗费时间,这个时间随着数据量的增长而增长;索引须要占用物理空间,不光是表须要占用数据空间,每一个索引也须要占用物理空间;当对表进行增、删、改的时候索引也要动态维护,这样就下降了数据的维护速度。

创建索引的原则:

1、在最频繁使用的、用以缩小查询范围的字段上创建索引

2、在平频繁使用的、须要排序的字段上创建索引

什么状况下不宜创建索引:

1、对于查询中不多涉及的列或者重复值比较多的列,不宜创建索引

2、对于一些特殊的数据类型,不宜创建索引,好比文本字段(text)等。

 

126.web应用中,数据库的读取频率远高于写入频率如何优化MySQL而应对此种情景 ?

答:

使用memcache缓存技术,将动态数据缓存到文件,访问动态页面时直接调用缓存文件,而没必要从新访问数据库,这样就减小了查询数据库的次数。

若是网站的访问量很大,能够把数据库读写服务器分开,使用多台服务器去处理数据库查询,使用较少的服务器去处理数据库的写入和修改。

 

127.includerequire的区别?

答:

Php在遇到include时就从新解释一次,若是一个页面中出现10includephp就从新解释10次,而php遇到require时只解释一次,即便页面中出现屡次requirephp也直解释一次。

使用require包含文件时,被包含的文件当成了当前文件的一个组成部分,若是被包含的文件中有语法错误或者文件不存在,程序就提示错误信息,并结束执行。

使用include包含文件时,至关于指定了文件的路径,被包含的文件中有语法错误或者文件不存在时,页面只是给出警告信息,不响应程序自己的执行。

 

128.PHP字符串中单引号与双引号的区别?

答:

单引号不能解释变量,而双引号能够解释变量。

单引号不能转义字符,在双引号中能够转义字符。

132.指出如下代码片断中的SQL注入漏洞以及解决方法(magic_quotes_gpc = off)
答:

mysql_query(select id,title from content where catid={$_GET[catid]}’ and title like %$_GET[keywords]%’”, $link);

注入漏洞主要存在用户提交的数据上,这里的注入漏洞主要是$_GET[catid]$_GET[keyword]

解决注入漏洞:

$_GET[catid]=intval($_GET[catid]);

$sql=select id,title from content where catid={$_GET[catid]}’ and title like %$_GET[keywords]%;

$sql=addslashes($sql);

Mysql_query($sql);

 

 

 

 

133.分别指出php.ini中 magic_quotes_gpc, magic_quotes_runtime两项参数的做用.

答:

Magic_quotes_gpc的做用是在POSTGETCOOKIE数据上使用addslashes()自动转义。

Magic_quotes_runtime参数的做用是设置状态,当状态为0时则关闭自动转义,设置为1则自动转义,将数据库中取出来的单引号、双引号、反斜线这些字符加上反斜杠转义。

 

134.写出如下php代码的运行结果:
<?php
function foo($i) {
$i++;
echo $i ;
}

function bar(&$i) {

}
$i = 10 ;
echo $i++ , ++$i;    输出:10,12
foo($i); 输出:13
bar($i);     输出:无输出
135.如何快速下载一个远程http服务器上的图片文件到本地?

:

$file=";

$fp=fopen($file,rb);

$img=fread($fp,10000);

$dir=./;

$local=fopen($dir./.basename($file),w');

Fwrite($local,$img);

 

136.什么是时间戳如何取得当前时间戳?

答:

时间戳是从197011日 00:00:00到指定日期的秒数。

获取当前时间戳:time()

 

137. cookie的区别与关系禁用cookie, session可否正常使用?

答:

SESSION存储在服务器端,COOKIE保存在客户端。

Session比较安全,cookie用某些手段能够修改,不安全。

Session依赖于cookie进行传递。

禁用cookie后,session不能正常使用。

138.HTTP/1.1协议中 200404状态码是什么含义?

答:

200是请求成功,404是文件未找到

 

139.了解XSS攻击吗如何防止 ?

答:

XSS是跨站脚本攻击,首先是利用跨站脚本漏洞以一个特权模式去执行攻击者构造的脚本,而后利用不安全的Activex控件执行恶意的行为。

使用htmlspecialchars()函数对提交的内容进行过滤,使字符串里面的特殊符号实体化。

 

140.SQL注入漏洞产生的缘由 如何防止?

答:

SQL注入产生的缘由:程序开发过程当中不注意规范书写sql语句和对特殊字符进行过滤,致使客户端能够经过全局变量POSTGET提交一些sql语句正常执行。

防止SQL注入:

1、开启配置文件中的magic_quotes_gpcmagic_quotes_runtime设置

2、执行sql语句时使用addslashes进行sql语句转换

3Sql语句书写尽可能不要省略小引号和单引号

4、过滤掉sql语句中的一些关键字:updateinsertdeleteselect*

5、提升数据库表和字段的命名技巧,对一些重要的字段根据程序的特色命名,取不易被猜到的。

6Php配置文件中设置register_globalsoff,关闭全局变量注册

7、控制错误信息,不要再浏览器上输出错误信息,将错误信息写到日志文件中。

 

141.一个字节占多少bit ? 一个IPv4地址占几个字节一个IPv6地址呢?

答:

一个字节占8bit,一个IPV4占用4字节,一个IPV6占用16字节。

 

142.M ADSL宽带链接理想状况下最大下载速度是多少KB/s  ?

答:

256KB/s

143.请写出一个正则表达式,用于匹配一个HTML文件中<img />标记中的图片地址

答:

$url=<img src=11.jpg/>;

/<img[\s]*src=['|\"](.*)['|\"][\s]*\/>/

 

145.Fatal error: Call to undefined method ge_user() in /website/index.php on line 39

答:

调用了未定义的方法ge_user(),检查程序中有没有定义此方法

 

 

 

146.Fatal error: Class client’ not found in /website/index.php on line 173

答:

client没有找到,检查文件中有没有client类,或者有没有包含client类文件

 

147.Warning: Cannot modify header information - headers already sent by (output started at /website/index.php:1) in /website/index.php  on line 3
:

提示文件前面有输出,检查是否有输出,或者编码

 

148.Warning:session_start(): open(/website/tmp/sess_47e067121facf033785f9a1cb16d243b,   O_RDWR) failed: No such file or directory (2) in /website/index.php on line  10
答:

没有找到文件或目录,检查文件是否存在

 

149.Parse error: syntax error, unexpected T_STRING in /website/index.php on line 18
答:

18行语法错误,检查语法

 

150.Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in /website/index.php on line 2
答:

没有找到welcome.txt文件,检查文件是否存在

1、抓取远程图片到本地,你会用什么函数?

fsockopen, A

2、用最少的代码写一个求3值最大值的函数.

function($a,$b,$c){
* W0 z* u6 k+ e. L  a: }5 }    return $a>$b? ($a>$c? $a : $c) : ($b>$c? $b  :  $c );
5 O: F6 v1 W# U}

3、用PHP打印出前一天的时间,打印格式是200751022:21:21

Echo date(Y-m-d H:i:s,strtotime(-1 day));

4javascript可否定义二维数组,若是不能你如何解决?

javascript不支持二维数组定义,能够用arr[0] = new array()来解决

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

<script>
function go2b(){
window.location = b.html;
window.close();
}

setTimeout( go2b(),5000 ); //5秒钟后自动执行go2b()
</script>

 

6//正在浏览当前页面用户的 IP 地址:127.0.0.1
echo $_SERVER["REMOTE_ADDR"].<br />;
//查询(query)的字符串(URL 中第一个问号 以后的内容):id=1&bi=2
echo $_SERVER["QUERY_STRING"].<br />;
//当前运行脚本所在的文档根目录:d:inetpubwwwroot
echo $_SERVER["DOCUMENT_ROOT"].<br />;
7、在HTTP 1.0中,状态码 401 的含义是未受权____;若是返回找不到文件的提示,则可用 header 函数,其语句为header(HTTP/1.0 404 Not Found);
答:401表示未受权;header(HTTP/1.0 404 Not Found);

8、写一个函数,可以遍历一个文件夹下的全部文件和子文件夹。
<?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]=my_scandir($dir./.$file);
}
else
{
$files[]=$dir./.$file;
}
}
}
closedir($handle);
return $files;
}
}
}
print_r(my_scandir(D:Program FilesInternet ExplorerMUI));
?>

 

9、把 John 新增到 users 阵列?

$users[] = john;   array_push($users,john);

 

10、在PHPerror_reporting这个函数有什么做用?
答:error_reporting() 设置 PHP 的报错级别并返回当前级别

 

11、请用正则表达式(Regular Expression)写一个函数验证电子邮件的格式是否正确。
答:
<?php

$email=$_POST['email'];
if(!preg_match(/^[\w.]+@([\w.]+)\.[a-z]{2,6}$/i,$email))  {
echo 电子邮件检测失败;
}else{
echo 电子邮件检测成功;
}

?>

12、用PHP写出显示客户端IP与服务器IP的代码

:打印客户端IP:echo $_SERVER[REMOTE_ADDR]; 或者: getenv(REMOTE_ADDR);

打印服务器IP:echo gethostbyname(www.bolaiwu.com)

 

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

:方法1:php.ini中的session.gc_maxlifetime设置为9999重启apache

方法2:$savePath = ./session_save_dir/;

$lifeTime = 小时 ;

session_save_path($savePath);

session_set_cookie_params($lifeTime);

session_start();

方法3:setcookie() and session_set_cookie_params($lifeTime);

 

14、有一个网页地址好比PHP开发资源网主页: http://www.phpres.com/index.html,如何获得它的内容?($1)

:方法1(对于PHP5及更高版本):

$readcontents = fopen(http://www.phpres.com/index.htmlrb);

$contents = stream_get_contents($readcontents);

fclose($readcontents);

echo $contents;

方法2:

echo file_get_contents(http://www.phpres.com/index.html);

 

15、请说明php中传值与传引用的区别。何时传值何时传引用?(2)

:按值传递:函数范围内对值的任何改变在函数外部都会被忽略

按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改

优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来讲,这将会是一个代价很大的操做。

按引用传递则不须要复制值,对于性能提升颇有好处。

 

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

例如: http://www.sina.com.cn/abc/de/fg.php?id=1 须要取出 php 或 .php

答案1:

function getExt($url){

$arr = parse_url($url);

$file = basename($arr['path']);

$ext = explode(.,$file);

return $ext[1];

}

答案2:

function getExt($url) {

$url = basename($url);

$pos1 = strpos($url,.);

$pos2 = strpos($url,?);

if(strstr($url,?)){

return substr($url,$pos1 + 1,$pos2 – $pos1 – 1);

} else {

return substr($url,$pos1);

}

}

 

17、使用五种以上方式获取一个文件的扩展名

要求:dir/upload.image.jpg,找出 .jpg 或者 jpg 
必须使用PHP自带的处理函数进行处理,方法不能明显重复,能够封装成函数,好比 get_ext1($file_name), get_ext2($file_name)

function get_ext1($file_name){

return strrchr($file_name, .);

}

function get_ext2($file_name){

return substr($file_name, strrpos($file_name, .));

}

function get_ext3($file_name){

return array_pop(explode(., $file_name));

}

function get_ext4($file_name){

$p = pathinfo($file_name);

return $p['extension'];

}

function get_ext5($file_name){

return strrev(substr(strrev($file_name), 0, strpos(strrev($file_name), .)));

}

 

18<?php
$str1 = null;
$str2 = false;
echo $str1==$str2 ? 相等’ 不相等;

$str3 = ;
$str4 = 0;
echo $str3==$str4 ? 相等’ 不相等;

$str5 = 0;
$str6 = 0;
echo $str5===$str6 ? 相等’ 不相等;
?>

相等 相等 不相等

 

19MySQL数据库中的字段类型varcharchar的主要区别是什么?那种字段的查找效率要高,为何?
Varchar是变长,节省存储空间,char是固定长度。查找效率要char型快,由于varchar是非定长,必须先查找长度,而后进行数据的提取,比char定长类型多了一个步骤,因此效率低一些

 

20、请使用JavaScript写出三种产生一个Image 标签的方法(提示:从方法、对象、HTML角度考虑)

(1)var img = new Image();
(2)var img = document.createElementById(image)
(3)img.innerHTML = <img src=xxx.jpg” />

 

2116.请描述出两点以上XHTMLHTML最显著的区别
(1)XHTML必须强制指定文档类型DocTypeHTML不须要
(2)XHTML全部标签必须闭合,HTML比较随意

22、写一个排序算法,能够是冒泡排序或者是快速排序,假设待排序对象是一个维数组。

//冒泡排序(数组排序)
function bubble_sort($array)
{
$count = count($array);
if ($count <= 0) return false;
for($i=0; $i<$count; $i++){
for($j=$count-1; $j>$i; $j){
if ($array[$j] < $array[$j-1]){
$tmp = $array[$j];
$array[$j] = $array[$j-1];
$array[$j-1] = $tmp;
}
}
}
return $array;
}
//快速排序(数组排序)
function quicksort($array) {
if (count($array) <= 1) return $array;
$key = $array[0];
$left_arr = array();
$right_arr = array();
for ($i=1; $i<count($array); $i++){
if ($array[$i] <= $key)
$left_arr[] = $array[$i];
else
$right_arr[] = $array[$i];
}
$left_arr = quicksort($left_arr);
$right_arr = quicksort($right_arr);
return array_merge($left_arr, array($key), $right_arr);
}

 

23、写出三种以上MySQL数据库存储引擎的名称(提示:不区分大小写)
MyISAMInnoDBBDBBerkeley DB)、MergeMemoryHeap)、ExampleFederatedArchiveCSVBlackholeMaxDB 等等十几个引擎

 

24、求两个日期的差数,例如2007-2-5 ~ 2007-3-6 的日期差数
方法一:
<?php
class Dtime
{
function get_days($date1, $date2)
{
$time1 = strtotime($date1);
$time2 = strtotime($date2);
return ($time2-$time1)/86400;
}
}
$Dtime = new Dtime;
echo $Dtime->get_days(2007-2-52007-3-6);
?>
方法二:
<?php
$temp = explode(-2007-2-5);
$time1 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);
$temp = explode(-2007-3-6);
$time2 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);
echo ($time2-$time1)/86400;
方法三:echo abs(strtotime(2007-2-1)-strtotime(2007-3-1))/60/60/24 计算时间差

 

25、请写一个函数,实现如下功能:
字符串open_door” 转换成 OpenDoormake_by_id” 转换成 MakeById
方法:
function str_explode($str){
$str_arr=explode(_,$str);$str_implode=implode(” “,$str_arr); $str_implode=implode
(“”,explode(” “,ucwords($str_implode)));
return $str_implode;
}
$strexplode=str_explode(make_by_id);print_r($strexplode);
方法二:$str=make_by_id!;
$expStr=explode(_,$str);
for($i=0;$i<count($expStr);$i++)
{
echo ucwords($expStr[$i]);
}方法三:echo str_replace(‘ ‘,,ucwords(str_replace(_,’ ‘,open_door)));

 

26、一个表中的Id有多个记录,把全部这个id的记录查出来,并显示共有多少条记录数,用SQL语句及视图、
存储过程分别实现。
DELIMITER //
create procedure proc_countNum(in columnId int,out rowsNo int)
begin
select count(*) into rowsNo from member where member_id=columnId;
end
call proc_countNum(1,@no);
select @no;
方法:视图:
create view v_countNum as select member_id,count(*) as countNum from member group by
member_id
select countNum from v_countNum where member_id=1

 

27js中网页前进和后退的代码 前进: history.forward();=history.go(1); 后退: history.back
();=history.go(-1); )

 

28echo count(abc); 输出什么?
答案:1

count — 计算数组中的单元数目或对象中的属性个数

int count ( mixed$var [, int $mode ] ), 若是 var 不是数组类型或者实现了 Countable 接口的对象,将返回1,有一个例外,若是 var 是 NULL 则结果是 0

对于对象,若是安装了 SPL,能够经过实现 Countable 接口来调用 count()。该接口只有一个方法 count(),此方法返回 count() 函数的返回值。

 

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

<?php
function BubbleSort(&$arr)
{
$cnt=count($arr);
$flag=1;
for($i=0;$i<$cnt;$i++)
{
if($flag==0)
{
return;
}
$flag=0;
for($j=0;$j<$cnt-$i-1;$j++)
{
if($arr[$j]>$arr[$j+1])
{
$tmp=$arr[$j];
$arr[$j]=$arr[$j+1];
$arr[$j+1]=$tmp;
$flag=1;
}
}
}
}
$test=array(1,3,6,8,2,7);
BubbleSort($test);
var_dump($test);
?>

30、请举例说明在你的开发过程当中用什么方法来加快页面的加载速度
答:要用到服务器资源时才打开,及时关闭服务器资源,数据库添加索引,页面可生成静态,图片等大文件单独服务器。使用代码优化工具

 

31.如下的代码会产生什么?为何?
$num =10;
function multiply(){
$num =$num *10;
}
multiply();
echo $num;
因为函式 multiply() 没有指定 $num 为全域变量(例如 global $num 或者 $_GLOBALS['num']),因此 $num 的值是 10

 

32. php classstatic,public,private,protected的区别?

static 静态,类名能够访问

public 表示全局,类内部外部子类均可以访问;

private表示私有的,只有本类内部能够使用;

protected表示受保护的,只有本类或子类或父类中能够访问;

 

33. HTTP协议中GETPOSTHEAD的区别?

HEAD: 只请求页面的首部。

GET: 请求指定的页面信息,并返回实体主体。

POST: 请求服务器接受所指定的文档做为对所标识的URI的新的从属实体。

1HTTP 定义了与服务器交互的不一样方法,最基本的方法是 GET 和 POST。事实上 GET 适用于多数请求,而保留 POST 仅用于更新站点。

2)在FORM提交的时候,若是不指定Method,则默认为GET请 求,Form中提交的数据将会附加在url以后,以?分开与url分开。字母数字字符原样发送,但空格转换为+号,其它符号转换为%XX,其中XX为 该符号以16进制表示的ASCII(或ISO Latin-1)值。GET请求请提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中;

GET方式提交的数据最多只能有1024字节,而POST则没有此限制。

3GET 这个是浏览器用语向服务器请求最经常使用的方法。POST这个方法也是用来传送数据的,可是与GET不一样的是,使用POST的时候,数据不是附在URI后面传递的,而是要作为独立的行来传递,此时还必需要发送一个Content_length标题,以标明数据长度,随后一个空白行,而后就是实际传送的数据。网页的表单一般是用POST来传送的。

1.可以使htmlphp分离开使用的模板?

答:SmartytemplatePHPlibTemplateFastTemplate

2.使用那些工具进行版本控制?

   答:

Clear case

       2.CVS

3.SVN

       4.PVCS

       5 Perforce

       6.CCC

       7.StarTeam

       8.RCS

3.写出Zend框架的目录结构,简单说明目录做用?

答:

application/ – 存放应用程序的目录,包括 MVC 系统、配置文件、服务以及引导程序(Bootstrap.php

    configs/ 配置文件目录。

    application/modules   – 多模块目录结果例如admin(后台前程),default(前台),shop(商城)各个模块下都有本身的controllersmodulesViews

    controllers/models/views/ – 控制器/模型/视图 目录。

    application/cache 存放缓存等数据

    application/helpers/ – 这个是存放行动助手action helper)的目录。这些助手类默认的命名空间是Controller_Helper_,若是是多模块那么命令空间将是<Module>_Controller_Helper

Bootstrap.php – 这个是应用程序入口文件。这个类的主要工做是引导应用程序,注册并初始化组件(component)。注意:不要在这个文件调用前置控制器(front controller)的dispatch() 方法。

library/ – 存放类库的目录。第三方的类库和本身写的类库放在这里进行自动 加载 但要注意要用本身独立的命名空间(建子目录)。

public/ – 存放公开文件的目录,也即网站的根目录,存放能够被用户访问的文件,例如jscss和图片等等。index.php 是应用程序的单入口,其主要工做是创建php环境,引用Bootstrap.php来初始化,并调用前置控制器的dispatch()方法来分发请求。

4.谈谈对mvc的认识?

答:

MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分红三个核心部件:模型、视图、控制器。它们各自处理本身的任务。

视图是用户看到并与之交互的界面。

模型表示企业数据和业务规则。

控制器接受用户的输入并调用模型和视图去完成用户的需求。

MVC的优势:低耦合性、高重用性和可适用性、较低的生命周期成本、快速的部署、可维护性、可扩展性,有利于软件工程化管理

MVC的缺点:没有明确的定义,彻底理解MVC并不容易。不适合小型规模的应用程序。

5. PHP如何抛出和接收错误?

答:

使用try...catch,异常的代码放在try代码块内,若是没有触发异常,则代码继续执行,若是异常被触发,就会抛出一个异常。Catch代码块捕获异常,并建立一个包含异常信息的对象。$e->getMessage(),输出异常的错误信息。

6.下面的类是否正确,若是正确请补全方法输入类属性$_a;错误请修改并输出属性$_a

<?php

Class A

{

       protected$a=1;

       publicfunction test()

       {

       echo$this->a;

       }

}

答:

$a=new A;

$a->test();

?>

7.请取出数组中的最大值?

$a=array(1,9,3,5,6,8);

$a=array(1,2,3,4,5,9);

答:

$b=max($a);

echo $b;

or

$a=array(1,9,3,5,6,8);

rsort($a);

Echo array_shift($a);

8.请说明PHP中传值和引用的区别。何时传值何时引用?

    答:

    按值传递:函数范围内对值的任何改变在函数外部都会被忽略。

    按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改。

    优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来讲,这将会是一个代价很大的操做。

    按引用传递则不须要复制值,对于性能提升颇有好处。

     若是不想改变原变量的值的时候就传值,

     $a=1;

     function aa($a){

     echo ++$a;

     }

     aa($a);

     若是可让函数改变了原变量的值就能够引用传值,

     $a=1;

     function aa(&$a){

     echo ++$a;

     }

     aa($a);

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

答:

$a=array(1,9,3,5,6,8,7);

<?php

function getMinStr($str) {

for ($i=0;$i<count($str);$i++) {

for($j=$i+1;$j<count($str);$j++) {

if($str[$i]<$str[$j]) {

$tmp = $str[$i];

$str[$i]=$str[$j];

$str[$j]=$tmp;

}

}

}

return $str;

}

$str = array(4,3,8,9,2);

print_r(getMinStr($str));

10.请问同时知足这样条件的数:被10除于9,被9除于8,被8除于7,在1001000之间,有几个这样的数?(并写出算法)

答:

A不存在,B 1个 C2个   D 3

分析过程:

   P除以109:P+1就被10整除

   P除以98:P+1就被9整除

   P除以87:P+1就被8整除

   因此P=8910的功倍数-1

   8=2*2*2,9=3*3,10=2*5

   则P+1必定是2*2*2*3*3*5的倍数(只能约掉一个

   又100<=P<=1000

   101<=P+1<=1001

   因此P+1=360,720

   因此P=359,719

11.请写出一个简单的静态数组?

答:

Class A{

Static $a=array('11'=>'1111');

}

Print_r(A::$a);

12.写一个简单的jquery显示隐藏代码?

答:

$("#aa").hide();

$("#aa").show();

13.语句includerequire的区别是什么?

   答:

PHP在遇到include时就必须从新解释一次,若是在同一个页面出现10include,它便会从新解释10次。PHP遇到require时,无论在同一个php网页中出现几回requirePHP只会解释一次而已。

Require执行效率比include高。

Require包含进来的内容被当成当前文件的一个组成部分,因此当包含进来的文件有语法错误或者文件不存在的时候,那个PHP脚本都再也不执行。Include函数至关于指定这个文件的路径,当被包含的文件有错时不会影响到自己的程序执行。

Include能够进行判断是否包含,而require则是无论任何状况都包含进来。

14.PHP获取当前时间并打印,打印格式:2006-5-10 22:21:21

答:

Echo Date("Y-m-d H:i:s");

15.字符串转数组,数组转字符串,字符串截取,字符串替换,字符串查找的函数分别是什么?

   答:

   Implode()explode()substr()str_replace()strposstrrposstrstr

16.解释一下PHP的类中:protect,public,private,interface,abstract,final,static的含义

   答:

   Protected受保护的,在本类和子类中有效。

    Public 公共的,在本类、子类中、类外均可以使用。

    Private 私有的,在本类中有效。

    Interface 定义一个接口时使用的关键字。

    Abstract 定义一个抽象类或者抽象方法时使用的关键字。

    Final final申明的方法没法被覆盖,用final申明的类不能被继承。

    Static 定义静态方法或者静态属性使用的关键字

17.写出下列代码的数据结果

   答:

   $date='08/26/2003';

    print ereg_replace(([0-9]+)/([0-9]+)/([0-9]+),2/1/3,$date,);

18.从表login中选出name字段包含admin的前10条结果全部信息的sql语句

   答:

    Select *from login where name like '%admin%' limit 0,10;

解释:左链接,右链接,内链接,索引。

  答:

   1、內链接仅选出两张表中互相匹配的记录.所以,这会致使有时咱们须要的记录没有包含进来。内部链接是两个表中都必须有链接字段的对应值的记录,数据才能检索出来。

   2、左链接和右链接都是外部链接,也就是区别于内部链接,它对不知足链接条件的行并非象内部链接同样将数据彻底过滤掉,而是保留一部分数据,行数不会减小。

   3、左链接是只要左边表中有记录,数据就能检索出来,而右边有的记录必要在左边表中有的记录才能被检索出来

   4、右链接是只要右边表中有记录,数据就能检索出来 ;

   5、全链接则会回返回两个表中的全部记录

20.简述论坛中无限分类的实现原理。

  答:

   1、数据库分类表的设计:id字段、父id字段、类名称字段、path字段

   2Path字段存当前分类的路径,格式:0,父类id,自己id

   3、查询分类:select * from 分类表order by path asc;

   4、这样就查出来每一个分类及其对应的子类。

PHP的网站主要攻击方式有哪些? 

1、命令注入(Command Injection)

2eval注入(Eval Injection)

3、客户端脚本攻击(Script Insertion)

4、跨网站脚本攻击(Cross Site Scripting, XSS)

5SQL注入攻击(SQL injection)

6、跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)

7Session 会话劫持(Session Hijacking)

8Session 固定攻击(Session Fixation)

9HTTP响应拆分攻击(HTTP Response Splitting)

10、文件上传漏洞(File Upload Attack)

11、目录穿越漏洞(Directory Traversal)

12、远程文件包含攻击(Remote Inclusion)

13、动态函数注入攻击(Dynamic Variable Evaluation)

14URL攻击(URL attack)

15、表单提交欺骗攻击(Spoofed Form Submissions)

16HTTP请求欺骗攻击(Spoofed HTTP Requests)

之后的每期连载,会逐个介绍这些漏洞的原理和防护方法。

几个重要的php.ini选项

Register Globals

php>=4.2.0php.iniregister_globals选项的默认值预设为Off,当register_globals的设定为On时,程序能够接收来自服务器的各类环境变量,包括表单提交的变量,并且因为PHP没必要事先初始化变量的值,从而致使很大的安全隐患。

1:

//check_admin()用于检查当前用户权限,若是是admin设置$is_admin变量为true,而后下面判断此变量是否为true,而后执行管理的一些操做

//ex1.php

<?php
if (check_admin())
{
$is_admin = true;
}
if ($is_admin)
{
do_something();
}
?>

这一段代码没有将$is_admin事先初始化为Flase,若是register_globalsOn,那么咱们直接提交 http://www.sectop.com/ex1.php?is_admin=true,就能够绕过check_admin()的验证

2:

//ex2.php

<?php
if (isset($_SESSION["username"]))
{
do_something();
}
else
{
echo 您还没有登陆!;
}
?>

register_globals=On时,咱们提交=dodo]http://www.sectop.com/ex2.php?_SESSION[username]=dodo,就具备了此用户的权限

因此无论register_globals为何,咱们都要记住,对于任何传输的数据要通过仔细验证,变量要初始化

safe_mode

安全模式,PHP用来限制文档的存取、限制环境变量的存取,控制外部程序的执行。启用安全模式必须设置php.ini中的safe_mode = On

1、限制文件存取

safe_mode_include_dir = /path1:/path2:/path3

不一样的文件夹用冒号隔开

2、限制环境变量的存取

safe_mode_allowed_env_vars = string

指定PHP程序能够改变的环境变量的前缀,如:safe_mode_allowed_env_vars = PHP_ ,当这个选项的值为空时,那么php能够改变任何环境变量

safe_mode_protected_env_vars = string

用来指定php程序不可改变的环境变量的前缀

3、限制外部程序的执行

safe_mode_exec_dir = string

此选项指定的文件夹路径影响systemexecpopenpassthru,不影响shell_exec` `

disable_functions = string

不一样的函数名称用逗号隔开,此选项不受安全模式影响

magic quotes

用来让php程序的输入信息自动转义,全部的单引号(“’”),双引号(“””),反斜杠(\)和空字符(NULL),都自动被加上反斜杠进行转义

magic_quotes_gpc = On 用来设置magic quotes On,它会影响HTTP请求的数据(GETPOSTCookies)

程序员也能够使用addslashes来转义提交的HTTP请求数据,或者用stripslashes来删除转义

如何提升php应用的性能 

1、 若是能将类的方法定义成static,就尽可能定义成static,它的速度会提高将近4倍。
2$row[id的速度是$row[id]7倍。
3echo 比 print快,而且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串链接,好比echo$str1,$str2
4、在执行for循环以前肯定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。
5、注销那些不用的变量尤为是大数组,以便释放内存。
6、尽可能避免使用__get__set__autoload
7require_once()代价昂贵。
8include文件时尽可能使用绝对路径,由于它避免了PHPinclude_path里查找文件的速度,解析操做系统路径所需的时间会更少。
9、若是你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[REQUEST_TIME]要好于 time()
10、函数代替正则表达式完成相同功能。
11str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。
12、若是一个字符串替换函数,可接受数组或字符做为参数,而且参数长度不太长,那么能够考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组做为查询和替换的参数。
13、使用选择分支语句(译注:即switch case)好于使用多个ifelse if语句。
14、用@屏蔽错误消息的作法很是低效,极其低效。
15、打开apachemod_deflate模块,能够提升网页的浏览速度。
16、数据库链接当使用完毕时应关掉,不要用长链接。
17、错误消息代价昂贵。
18、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度至关。
19、递增一个全局变量要比递增一个局部变量慢2倍。
20、递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。
21、递增一个未预约义的局部变量要比递增一个预约义的局部变量慢910倍。
22、仅定义一个局部变量而没在函数中调用它,一样会减慢速度(其程度至关于递增一个局部变量)PHP大概会检查看是否存在全局变量。
23、方法调用看来与类中定义的方法的数量无关,由于我(在测试方法以前和以后都)添加了10个方法,但性能上没有变化。
24、派生类中的方法运行起来要快于在基类中定义的一样的方法。
25、调用带有一个参数的空函数,其花费的时间至关于执行78次的局部变量递增操做。相似的方法调用所花费的时间接近于15次的局部变量递增操做。
26Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢210倍。尽可能多用静态HTML页面,少用脚本。
27、除非脚本能够缓存,不然每次调用时都会从新编译一次。引入一套PHP缓存机制一般能够提高25%100%的性能,以避免除编译开销。
28、尽可能作缓存,可以使用memcachedmemcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存颇有用,使得脚本没必要为每一个请求作从新编译。
29、当操做字符串并须要检验其长度是否知足某种要求时,你想固然地会使用strlen()函数。此函数执行起来至关快,由于它不作任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。可是,因为strlen()是函数,多多少少会有些慢,由于函数调用会通过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一块儿执行。在某些状况下,你能够使用isset() 技巧加速执行你的代码。
(举例以下)
if (strlen($foo) < 5) { echo Foo is too short$$ }
(与下面的技巧作比较)
if (!isset($foo{5})) { echo Foo is too short$$ }
调用isset()恰巧比strlen()快,由于与后者不一样的是,isset()做为一种语言结构,意味着它的执行不须要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。
34、当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差别是PHP特有的,并不适用于其余语言,因此请不要修改你的C或 Java代码并期望它们能当即变快,没用的。++$i更快是由于它只须要3条指令(opcodes)$i++则须要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如ZendPHP优化器所做的那样。牢记这个优化处理不失为一个好主意,由于并非全部的指令优化器都会作一样的优化处理,而且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。
35、并非事必面向对象(OOP),面向对象每每开销很大,每一个方法和对象调用都会消耗不少内存。
36、并不是要用类实现全部的数据结构,数组也颇有用。
37、不要把方法细分得过多,仔细想一想你真正打算重用的是哪些代码?
38、当你须要时,你总能把代码分解成方法。
39、尽可能采用大量的PHP内置函数。
40、若是在代码中存在大量耗时的函数,你能够考虑用C扩展的方式实现它们。
41、评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验整体上能够显示出代码的瓶颈。
42mod_zip可做为Apache模块,用来即时压缩你的数据,并可以让数据传输量下降80%
43、在能够用file_get_contents替代filefopenfeoffgets等系列方法的状况下,尽可能用 file_get_contents,由于他的效率高得多!可是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;
44、尽可能的少进行文件操做,虽然PHP的文件操做效率也不低的;
45、优化Select SQL语句,在可能的状况下尽可能少的进行InsertUpdate操做;
46、尽量的使用PHP内部函数(可是我却为了找个PHP里面不存在的函数,浪费了本能够写出一个自定义函数的时间,经验问题啊!);
47、循环内部不要声明变量,尤为是大变量:对象(这好像不仅是PHP里面要注意的问题吧?);
48、多维数组尽可能不要循环嵌套赋值;
49、在能够用PHP内部字符串操做函数的状况下,不要用正则表达式;
50foreach效率更高,尽可能用foreach代替whilefor循环;
51、用单引号替代双引号引用字符串;
52i+=1代替i=i+1。符合c/c++的习惯,效率还高;
53、对global变量,应该用完就unset()掉。

如何用php的环境变量获得一个网页地址的内容?ip地址又要怎样获得?

程序代码
echo $_SERVER ["PHP_SELF"];
echo $_SERVER ["SERVER_ADDR"];

2. 求两个日期的差数,例如2007-2-5 ~ 2007-3-6 的日期差数

程序代码
$begin=strtotime(2007-2-5);
$end=strtotime(2007-3-6);
echo ($end-$begin)/(24*3600);

3. 请写一个函数,实现如下功能:
字符串open_door” 转换成 OpenDoormake_by_id” 转换成 MakeById

程序代码
function changeStyle(& $str) {
/*$str = str_replace ( _” “, $str );
$str = ucwords ( $str );
$str = str_replace ( ” ““”, $str );
return $str;*/
$arrStr=explode(_,$str);
foreach($arrStr as $key=>$value){
$arrStr[$key]=strtoupper(substr($value,0,1)).substr($value,1);
}
return implode(“”,$arrStr);
}
$s = open_door;
echo changeStyle ( $s );

1. includerequire有什么区别?
区别在于他们如何处理失败, 若是require的文件没有找到, 会形成fatal error,脚本中止执行,若是include的文件没有找到, 会显示警告,可是脚本会继续执行。
2. 给一个变量赋值为0123,可是输出该变量的值老是为其余数字,请问这是什么问题?
PHP 解释器会把以0开始的数字当作是八进制的,因此它的值会变成八进制的。
3. PHP里面如何定义一个常量(constant)?
经过define()指令,例如:define(MYCONSTANT, 100)
4. 如何对一个变量进行值传递?
能够像C++那样, 在变量的前面加上&, 例如:$a = &$b
5. PHP里面能够对string 10″ 和整型 11进行比较吗?
能够,PHP内部实现会把全部东西转换成整型,因此数字1011能够进行比较
6. 在什么状况下须要用endif 来结束条件语句?
if语句后面跟的是冒号:而不是大括号{时,须要用endif来结束条件语句

14.简述论坛中无限分类的实现原理。
答:
<?php
/*
数据表结构以下:
CREATE TABLE `category` (
`categoryID` smallint(5) unsigned NOT NULL auto_increment,
`categoryParentID` smallint(5) unsigned NOT NULL default '0',
`categoryName` varchar(50) NOT NULL default '',
PRIMARY KEY (`categoryID`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;
INSERT INTO `category` ( `categoryParentID`, `categoryName`) VALUES
(0, '一级类别'),
(1, '二级类别'),
(1, '二级类别'),
(1, '二级类别'),
(2, '三级类别'),
(2, '333332'),
(2, '234234'),
(3, 'aqqqqqd'),
(4, '哈哈'),
(5, '66333666');
*/
//指定分类id变量$category_id,而后返回该分类的全部子类
//$default_category为默认的选中的分类
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 "
}else
{
echo " }
if ($level > 0)
{
echo ">" . str_repeat( " ", $level ) . " " . $category['name'] . " 

\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;
}
?>
<?php
class cate
{
function Get_Category($category_id = 0,$level = 0, $default_category = 0)
{
echo $category_id;
$arr = array(
'0' => 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 = "
}else{
$txt = " }

if ($level > 0)
{
$txt1 = ">" . str_repeat( "-", $level ) . " " . $cate['name'] . " 

\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 "

";
?>

1、 引言

PHP是一种力量强大但至关容易学习的服务器端脚本语言,即便是经验很少的程序员也可以使用它来建立复杂的动态的web站点。然而,它在实现因特网服务的秘密和安全方面却经常存在许多困难。在本系列文章中,咱们将向读者介绍进行web开发所必需的安全背景以及PHP特定的知识和代码-你能够借以保护你本身的web应用程序的安全性和一致性。首先,咱们简单地回顾一下服务器安全问题-展现你如何存取一个共享宿主环境下的私人信息,使开发者脱离开生产服务器,维持最新的软件,提供加密的频道,而且控制对你的系统的存取。

而后,咱们讨论PHP脚本实现中的广泛存在的脆弱性。咱们将解释如何保护你的脚本免于SQL注入,防止跨站点脚本化和远程执行,而且阻止对临时文件及会话的”劫持”。

在最后一篇中,咱们将实现一个安全的Web应用程序。你将学习如何验证用户身份,受权并跟踪应用程序使用,避免数据损失,安全地执行高风险性的系统命令,并可以安全地使用web服务。不管你是否有足够的PHP安全开发经验,本系列文章都会提供丰富的信息来帮助你构建更为安全的在线应用程序。

2、 什么是SQL注入

若是你打算永远不使用某些数据的话,那么把它们存储于一个数据库是毫无心义的;由于数据库的设计目的是为了方便地存取和操做数据库中的数据。可是,若是只是简单地这样作则有可能会致使潜在的灾难。这种状况并不主要是由于你本身可能偶然删除数据库中的一切;而是由于,当你试图完成某项”无辜”的任务时,你有可能被某些人所”劫持”-使用他本身的破坏性数据来取代你本身的数据。咱们称这种取代为”注入”。

其实,每当你要求用户输入构造一个数据库查询,你是在容许该用户参与构建一个存取数据库服务器的命令。一位友好的用户可能对实现这样的操做感受很满意;然而,一位恶意的用户将会试图发现一种方法来扭曲该命令,从而致使该被的扭曲命令删除数据,甚至作出更为危险的事情。做为一个程序员,你的任务是寻找一种方法来避免这样的恶意攻击。

3、 SQL注入工做原理

构造一个数据库查询是一个很是直接的过程。典型地,它会遵循以下思路来实现。仅为说明问题,咱们将假定你有一个葡萄酒数据库表格”wines”,其中有一个字段为”variety”(即葡萄酒类型):

1. 提供一个表单-容许用户提交某些要搜索的内容。让咱们假定用户选择搜索类型为”lagrein”的葡萄酒。

2. 检索该用户的搜索术语,而且保存它-经过把它赋给一个以下所示的变量来实现:

$variety = $_POST['variety'];

所以,变量$variety的值如今为:

lagrein

3. 而后,使用该变量在WHERE子句中构造一个数据库查询:

$query = “SELECT * FROM wines WHERE variety=’$variety’”;

因此,变量$query的值如今以下所示:

SELECT * FROM wines WHERE variety=’lagrein’

4. 把该查询提交给MySQL服务器。

5. MySQL返回wines表格中的全部记录-其中,字段variety的值为”lagrein”。

到目前为止,这应该是一个你所熟悉的并且是很是轻松的过程。遗憾的是,有时咱们所熟悉并感到温馨的过程却容易致使咱们产生自满情绪。如今,让咱们再从新分析一下刚才构建的查询。

1. 你建立的这个查询的固定部分以一个单引号结束,你将使用它来描述变量值的开始:

$query = ” SELECT * FROM wines WHERE variety = ‘”;

2. 使用原有的固定不变的部分与包含用户提交的变量的值:

$query .= $variety;

3. 而后,你使用另外一个单引号来链接此结果-描述该变量值的结束:

$ query .= “‘”;

因而,$query的值以下所示:

SELECT * FROM wines WHERE variety = ‘lagrein’

这个构造的成功依赖用户的输入。在本文示例中,你正在使用单个单词(也多是一组单词)来指明一种葡萄酒类型。所以,该查询的构建是无任何问题的,而且结果也会是你所指望的-一个葡萄酒类型为”lagrein”的葡萄酒列表。如今,让咱们想象,既然你的用户不是输入一个简单的类型为”lagrein”的葡萄酒类型,而是输入了下列内容(注意包括其中的两个标点符号):

lagrein’ or 1=1;

如今,你继续使用前面固定的部分来构造你的查询(在此,咱们仅显示$query变量的结果值):

SELECT * FROM wines WHERE variety = ‘

而后,你使用包含用户输入内容的变量的值与之进行链接(在此,以粗体显示):

SELECT * FROM wines WHERE variety = ‘lagrein’ or 1=1;

最后,添加上下面的下引号:

SELECT * FROM wines WHERE variety = ‘lagrein’ or 1=1;’

因而,这个查询结果与你的指望会至关不一样。事实上,如今你的查询包含的不是一条而是两条指令,由于用户输入的最后的分号已经结束了第一条指令(进行记录选择)从而开始了一条新的指令。在本例中,第二条指令,除了一个简单的单引号以外别无心义;可是,第一条指令也不是你所想实现的。当用户把一个单引号放到他的输入内容的中间时,他结束了指望的变量的值,而且引入了另外一个条件。所以,再也不是检索那些variety为”lagrein”的记录,而是在检索那些知足两个标准中任何一个(第一个是你的,而第二个是他的-variety为”lagrein”或1等于1)的记录。既然1老是1,所以,你会检索到全部的记录!

你可能反对:我不会使用双引号来代替单引号来描述用户提交的变量吗?不错,这至少能够减慢恶意用户的攻击。(在之前的文章中,咱们提醒过你:应该禁止全部对用户的错误通知信息。若是在今生成一条错误消息,那么,它有可能偏偏帮助了攻击者-提供一个关于他的攻击为何失败的具体的解释。)

在实践中,使你的用户可以看到全部的记录而不仅是其中的一部分乍看起来彷佛不太费事,但实际上,这的确费事很多;看到全部的记录可以很容易地向他提供有关于该表格的内部结构,从而也就向他提供了使其之后实现更为恶毒目的的一个重要参考。若是你的数据库中不是包含显然无害的酒之类信息而是包含例如一个含有雇员年收入的列表,那么,刚才描述情形会是特别真实的。

而从理论角度分析,这种攻击也的确是一件很可怕的事情。因为把意外的内容注入到你的查询中,因此,此用户可以实现把你的数据库存取转化为用于实现他本身的目的。所以如今,你的数据库已经对他打开-正如对你敞开同样。

4、 PHP和MySQL注入

如咱们前面所描述的,PHP,从自己设计来讲,并无作什么特别的事情-除了按照你的指示操做以外。所以,若是为恶意用户所用,它也只是按照要求”容许”特别设计的攻击-例如咱们前面所描述的那样。

咱们将假定,你不会故意地或甚至是偶然地构造一个具备破坏性效果的数据库查询-因而,咱们假定问题出在来自你的用户的输入方面。如今,让咱们来更为细致地分析一下用户可能向你的脚本提供信息的各类途径。

5、 用户输入的类型

现在,用户可以影响你的脚本的行为已变得愈来愈复杂。

用户输入最明显的来源固然是表单上的一个文本输入域。使用这样的一个域,你简直是在故意教唆一个用户输入任意数据。并且,你向用户提供了一个很大的输入范围;没有什么办法可以使你提早限制一个用户可以输入的数据类型(尽管你可以选择限制它的长度)。这正是绝大多数的注入式攻击源主要来自于无防备的表单域的缘由。

可是,还存在其它的攻击源,而且稍加思考你就会想到的一种潜于表单后台的技术-POST方法!经过简单地分析显示在浏览器的导航工具栏中的URI,一个善于观察的用户可以很容易地看出是什么信息传递到了一个脚本。尽管典型状况下这样的URI是以编程方式生成的,可是,没有什么办法可以阻止一个恶意的用户简单地把一个带有一个不适当的变量值的URI输入到一个浏览器中-而这样潜在地打开一个可能会被其滥用的数据库。

限制用户输入内容的一个经常使用策略是在一个表单中提供一个选择框,而不是一个输入框。这种控件可以强制用户从一组预约义的值中进行选择,而且可以在必定程度上阻止用户输入指望不到的内容。可是正如一个攻击者可能”哄骗”一个URI(也便是,建立一个可以模仿一个可信任的却无效的URI)同样,他也可能模仿建立你的表单及其本身的版本,并所以在选项框中使用非法的而不是预约义的安全选择。要实现这点是极其简单的;他仅须要观察源码,而后剪切而且粘贴该表单的源代码-而后一切为他敞开大门。

在修改该选择以后,他就可以提交表单,而且他的无效的指令就会被接受,就象它们是原始的指令同样。所以,该用户能够使用许多不一样的方法试图把恶意的代码注入到一个脚本中。

基础题:
1.表单中 getpost提交方法的区别?
:get是发送请求HTTP协议经过url参数传递进行接收,post是实体数据,能够经过表单提交大量信息.
2.sessioncookie的区别?
:session:储存用户访问的全局惟一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放
cookie:用来存储连续訪問一个頁面时所使用,是存储在客户端,对于Cookie来讲是存储在用户WINTemp目录中的。
二者均可经过时间来设置时间长短
3.数据库中的事务是什么?
:事务(transaction)是做为一个单元的一组有序的数据库操做。若是组中的全部操做都成功,则认为事务成功,即便只有一个操做失败,事务也不成功。若是全部操做 完成,事务则提交,其修改将做用于全部其余数据库进程。若是一个操做失败,则事务将回滚,该事务全部操做的影响都将取消。
简述题:
1、用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2)
:echo date(Y-m-d H:i:s, strtotime(-1 days));
2echo(),print(),print_r()的区别(3)
:echoPHP语句, printprint_r是函数,语句没有返回值,函数能够有返回值(即使没有用)
print() 只能打印出简单类型变量的值(int,string)
print_r() 能够打印出复杂类型变量的值(如数组,对象)
echo 输出一个或者多个字符串
3、可以使HTMLPHP分离开使用的模板(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) 8i VALUES ($name1);
mysql_query(SELECT * FROM `orderinfo` where customerid=.$id);
mysql_query(COMMIT);
5、锁定表,优化事务处理:
a.咱们用一个 SELECT 语句取出初始数据,经过一些计算,用 UPDATE 语句将新值更新到表中。
包含有 WRITE(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";
8PHP的意思(1)
:PHP是一个基于服务端来建立动态网站的脚本语言,您能够用PHPHTML生成网站主页
9MYSQL取得当前时间的函数是?,格式化日期的函数是(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(www.bolaiwu.com)
16、语句includerequire的区别是什么?为避免屡次包含同一文件,可用(?)语句代替它们? (2)
:require->require是无条件包含也就是若是一个流程里加入require,不管条件成立与否都会先执行require
include->include有返回值,而require没有(可能由于如此require的速度比include)
注意:包含文件不存在或者语法错误的时候require是致命的,include不是
17、如何修改SESSION的生存时间(1).
:方法1:php.ini中的session.gc_maxlifetime设置为9999重启apache
方法2:$savePath = ./session_save_dir/;
$lifeTime = 小时 ;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
方法3:setcookie() and session_set_cookie_params($lifeTime);

18、有一个网页地址好比PHP开发资源网主页: http://www.phpres.com/index.html,如何获得它的内容?($1)
:方法1(对于PHP5及更高版本):
$readcontents = fopen(http://www.phpres.com/index.htmlrb);
$contents = stream_get_contents($readcontents);
fclose($readcontents);
echo $contents;
方法2:
echo file_get_contents(http://www.phpres.com/index.html);
19、在HTTP 1.0中,状态码401的含义是(?);若是返回找不到文件的提示,则可用 header 函数,其语句为(?);(2)
:状态401表明未被受权,header(Location:www.xxx.php);
12、在PHP中,heredoc是一种特殊的字符串,它的结束标志必须?(1)
:heredoc的语法是用<<<"加上本身定义成对的标签,在标签范围內的文字视为一个字符串
例子:
$str = << my name is Jiang Qihui!
SHOW;
13、谈谈asp,php,jsp的优缺点(1)
:ASP全名Active Server Pages,是一个WEB服务器端的开发环境, 利用它能够产生和运
行动态的、交互的、高性能的WEB服务应用程序。ASP采用脚本语言VB ScriptJava script
)做为本身的开发语言。
PHP是一种跨平台的服务器端的嵌入式脚本语言它大量地借用C,JavaPerl语言的语法
并耦合PHP本身的特性,使WEB开发者可以快速地写出动态生成页面.它支持目前绝大多数数
据库。还有一点,PHP是彻底免费的,不用花钱,你能够从PHP官方站点(http://www.php.ne
t)自由下载。并且你能够不受限制地得到源码,甚至能够从中加进你本身须要的特点。
JSP Sun公司推出的新一代站点开发语言,他彻底解决了目前ASP,PHP的一个通病--
脚本级执行(听说PHP4 也已经在Zend 的支持下,实现编译运行).Sun 公司借助本身在Jav
上的不凡造诣,将Java Java 应用程序 和 Java Applet 以外,又有新的硕果,就是Js
p--Java Server PageJsp 能够在ServerletJavaBean的支持下,完成功能强大的站点
程序。
  三者都提供在 HTML 代码中混合某种程序代码、由语言引擎解释执行程序代码的能力。
JSP代码被编译成 Servlet 并由 Java 虚拟机解释执行,这种编译操做仅在对 JSP 页面的
第一次请求时发生。在 ASP PHPJSP 环境下, HTML 代码主要负责描述信息的显示样式
,而程序代码则用来描述处理逻辑。普通的 HTML 页面只依赖于 Web 服务器,而 ASP PH
PJSP 页面须要附加的语言引擎分析和执行程序代码。程序代码的执行结果被从新嵌入到
HTML 代码中,而后一块儿发送给浏览器。 ASP PHP、 JSP三者都是面向 Web 服务器的技术
,客户端浏览器不须要任何附加的软件支持。
14、谈谈对mvc的认识(1)
:由模型(model),视图(view),控制器(controller)完成的应用程序
由模型发出要实现的功能到控制器,控制器接收组织功能传递给视图;
15、写出发贴数最多的十我的名字的SQL,利用下表:members(id,username,posts,pass,email)(2)
:SELECT * FROM `members` ORDER BY posts DESC limit 0,10;
16. 请说明php中传值与传引用的区别。何时传值何时传引用?(2)
:按值传递:函数范围内对值的任何改变在函数外部都会被忽略
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来讲,这将会是一个代价很大的操做。
按引用传递则不须要复制值,对于性能提升颇有好处。
17. PHPerror_reporting这个函数有什么做用? (1)
:设置错误级别与错误信息回报
18. 请写一个函数验证电子邮件的格式是否正确 (2)
dy@sina.com
8047@qq.com
yahu@.com.cn
dy@163.com
dy_35
:function checkEmail($email)
{
$pregEmail = "/([a-z0-9]*[-_\.]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[\.][a-z]{2,3}([\.][a-z]{2})?/i";
return preg_match($pregEmail,$email);
}
19. 简述如何获得当前执行脚本路径,包括所获得参数。(2)
:$script_name = basename(__file__); print_r($script_name);
21JS表单弹出对话框函数是?得到输入焦点函数是? (2)
: