欢迎光临
感谢一路有你

转载 | PHP面试题汇总

如果你对该文章中的内容有疑问/不解,可以点击此处链接提问
要注明问题和此文章链接地址 点击此处跳转
 

百度CDN jquery引用包:https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js

新浪 CDN jquery引用包:http://lib.sinaapp.com/js/jquery/2.0.2/jquery-2.0.2.min.js

 

 

   

 

 

一、前端 2

HTML 2

CSS 2

JavaScript 3

二、PHP基础: 3

(一)、PHP基础 3

(二)、面向对象部分 21

(三)、smarty 模板引擎 24

(四)、二次开发系统(DEDE、ecshop): 27

(五)、框架 29

三、数据库部分 32

SQL语言 35

MySQL 36

php操作数据库 40

四、微信公众平台开发 44

五、其它 46

 

 

 

一、前端

1、说一下你所掌握的网页前端技术有哪些?

熟练掌握DIV+CSS网页布局,javascript,JQuery框架、BootStrap框架、photoshop图片处理

 

HTML

 

2、XML与HTML的主要区别

(1)XML是区分大小写字母的,HTML不区分。

(2)在HTML中,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略</p>或者</li>之类的结束标记。在XML中,绝对不能省略掉结束标记。

(3)在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个/字符作为结尾。这样分析器就知道不用查找结束标记了。

(4)在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。

(5)在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。

 

3、什么是HTML5?

HTML5是最新的HTML标准,他的主要目标是提供所有内容而不需要任何的像flash,silverlight等的额外插件,这些内容来自动画,视频,富GUI等

HTML5是万维网联盟(W3C)和网络超文本应用技术工作组(WHATWG)之间合作制定的

 

4、HTML5中canvas是什么?SVG是什么?有什么区别?

Canvas和SVG是HTML5中主要的2D图形技术,前者提供画布标签和绘制API,后者是一整套独立的矢量图形语言

SVG是一种矢量图格式,Canvas是基于位图的图像

Canvas是使用JavaScript程序绘图(动态生成),SVG是使用XML文档描述来绘图。

 

 

CSS

 

 

 

 

JavaScript

5、★JS表单弹出对话框函数是?获得输入焦点函数是?

弹出对话框:alert(),prompt(),confirm()

获得输入焦点focus()

 

6、★JS的转向函数是什么?怎么引入一个外部JS文件?

location.replace()

location.href  //问的是函数不是属性

 

<script type=”text/javascript” src=”js/js_function.js”></script>

 

7、★如何不使用 submit 按钮来提交表单?

如果我们不想用 submit 按钮来提交表单,我们也可以用超链接来提交,我们可以这样写代码:

<a href=”javascript: document.myform.submit ();”>Submit Me</a>

 

8、AJAX的优势是什么?

ajax是异步传输技术,可以通过javascript实现,也可以通过JQuery框架实现,实现局部刷新,减轻了服务器的压力,也提高了用户体验

 

 

、PHP基础:

(一)、PHP基础

9、php的意思

PHP 全称:Hypertext Preprocessor——超文本预处理程序

php是基于服务端来创建动态网站的脚本语言,可以用php和HTML生成网页

10、PHP语言的一大优势是跨平台,什么是跨平台?

PHP的运行环境最优搭配为Apache+mysql+PHP,此运行环境可以在不同操作系统(例如windows、linux等)上配置,不受操作系统的限制,所以叫跨平台

11、Print、echo、print_r有什么区别?

① echo和print都可以做输出,不同的是,echo不是函数,没有返回值,而print是一个函数有返回值,所以相对而言如果只是输出 echo 会更快,而print_r通常用于打印变量的相关信息,通常在调试中使用。

② print   是打印字符串③ print_r 则是打印复合类型  如数组 对象

12、请问 PHP中echo和print有什么区别?

echo 和 print 之间的差异:

l echo – 能够输出一个以上的字符串

l print – 只能输出一个字符串,并始终返回 1

echo 比 print 稍快,因为它不返回任何值。

13、WEB开发中数据提交方式有几种?有什么区别?百度使用哪种方式?

Get与post两种方式

区别:1. Get从服务器获取数据,post向服务器传送数据

  1. Get传值在url中可见,post在url中不可见
  2. 3. Get传值一般在2KB以内,post传值大小可以在ini中进行设置
  3. 4. get安全性非低,post安全性较高,get执行效率却比post 高

建议:1、get式安全性较Post式要差些包含机密信息建议用Post数据提交式;

2、做数据查询建议用Get式;做数据添加、修改或删除建议用Post方式;

百度使用的get方式,因为可以从它的URL中看出

14、SESSION与COOKIE区别是什么?

①存储位置:session存储于服务器,cookie存储于浏览器客户端

②安全性:session安全性比cookie高

③session为‘会话服务’,在使用时需要开启服务,cookie不需要开启,可以直接用

 

15、PHP处理数组的常用函数?(重点看函数的‘参数’和‘返回值’)

①array() 创建数组;②count() 返回数组中元素的数目;

③array_push()将一个或多个元素插入数组的末尾(入栈);

④array_column() 返回输入数组中某个单一列的值;

⑤array_combine()通过合并两个数组来创建一个新数组;

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

⑦array_unique() 删除数组中的重复值;⑧in_array()检查数组中是否存在指定的值;

 

16、数组函数arsort 的作用是__; 

arsort:对数组进行逆向排序并保持索引关系

 

17、PHP处理字符串的常用函数?(重点看函数的‘参数’和‘返回值’)

①trim() 移除字符串两侧的空白字符和其他字符;

②substr_replace()把字符串的一部分替换为另一个字符串;

③substr_count() 计算子串在字符串中出现的次数;④substr()返回字符串的一部分;

⑤strtolower() 把字符串转换为小写字母;⑥strtoupper() 把字符串转换为大写字母;

⑦strtr() 转换字符串中特定的字符;⑧strrchr()查找字符串在另一个字符串中最后一次出现;

⑨strstr()查找字符串在另一字符串中的第一次出现(对大小写敏感);strrev()反转字符串;strlen()返回字符串的长度;str_replace()替换字符串中的一些字符(对大小写敏感);print()输出一个或多个字符串;explode()把字符串打散为数组;is_string() 检测变量是否是字符串;strip_tags()从一个字符串中去除HTML标签;mb_substr()用来截中文与英文的函数

 

18、★ 如何实现字符串翻转?

strrev( ) 函数;

 

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

mb_substr函数

<?php

$str=’程序之家’;

echo mb_substr($str,0,2,’utf-8′); //截取头2个字,编码为utf-8

?>

结果显示:程序

 

20、★、请将数组$arr=array(“james”,”torn”,”symfony”);的值用”,”号分隔并合并成字符串输出

echo implode(“,”,$arr);  或者  join( ‘,’  ,  $arr );

21、★ PHP格式化日期的函数是?

date()

22、★★  用PHP打印出前一天的时间格式是2006-4-10 12:21:21?   重点:★ 

echo date(‘Y-m-d H:i:s’,   strtotime(‘-1 days’));

23、PHP处理时间的常用函数?(重点看函数的‘参数’和‘返回值’)

date_default_timezone_get() 返回默认时区。

date_default_timezone_set() 设置默认时区。

date() 格式化本地时间/日期。

getdate() 返回日期/时间信息。

gettimeofday() 返回当前时间信息。

microtime() 返回当前时间的微秒数。

mktime() 返回一个日期的 Unix 时间戳。

strtotime() 将任何英文文本的日期或时间描述解析为 Unix 时间戳。

time() 返回当前时间的 Unix 时间戳。

24、PHP操作文件的常用函数?(重点看函数的‘参数’和‘返回值’)

①打开文件fopen();②unlink()删除文件;③读取文件fread();

④写入文件fwrite() file_put_contents() ;⑤修改文件权限chmod();⑥关闭文件fclose();⑦创建文件file_get_contents()

25、PHP操作目录(文件夹)的常用函数?(重点看函数的‘参数’和‘返回值’)

①opendir()打开目录;②rmdir()删除目录;

③读取目录readdir() scandir();④mkdir()创建目录;

⑤修改目录chroot();⑥关闭目录closedir()

26、★ php哪个函数可以打开一个文件,以对文件进行读和写操作?

fopen()

27、如何在 PHP 中定义常量?

PHP 中使用 define () 来定义常量,define (“Newconstant”, 30);

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

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

打印服务器端IP:echo $_SERVER[“SERVER_ADDR”];

echo gethostbyname(“www.baidu.com”);

 

29、★在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量中;而链接到当前页面的URL记录在预定义变量中

echo $_SERVER[‘PHP_SELF’];

echo $_SERVER[“HTTP_REFERER”];

//本页地址,SCRIPT_NAME也可以:php/test.php

echo $_SERVER[‘PHP_SELF’];

 

//链接到当前页面的前一页面的URL地址:

echo $_SERVER[“HTTP_REFERER”];

 

//前执行脚本的绝对路径名D:lnetpub/www/root/phptest.php

echo $_SERVER[“SCRIPT_FILENAME”];

 

//正在浏览当前页面用户的IP地址127.0.0.1

echo  $_SERVER[“REMOTE_ADDR”];

//查询(query)的字符串(URL中的第一个问号?之后的内容):id=1&bi=2

echo $_SERVER[“QUERY_STRING”];

//当前运行脚本所在的文档根目录:d:inetpubwwwroot

echo $_SERVER[“DOCUMENT_root”];

 

30、在php中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量

$_SERVER[“PHP_SELF”]__中;而链接到当前页面的URL记录在预定义变量

$_SERVER[“HTTP_REFERER”]__中

 

31、执行程序段<?php echo 8%(-2)?>将输出__0__.

 

32、★ 语句include和require的区别是什么?为避免多次包含同意文件,可用(?)语句代替它们?

require->require是无条件包含也就是如果一个流程里加入require,无论条件成立与否都会先执行require

include->include有返回值,而require没有(可能因为如此require的速度比include快)

注意:包含文件安不存在或者语法错误的时候require是致命的,include不是

关于这道题当家可以看看课件了,上课的时候讲的很细了。

 

33、★ foo()和@foo()之间有什么区别?

@foo()控制错误输出

 

34、★ 在PHP中error_reporting这个函数有什么作用? 

设置错误级别与错误信息回报

 

35、PHP 中的错误类型有哪些?

PHP 中遇到的错误类型大致有3类。

l 提示:这都是一些非常正常的信息,而非重大的错误,有些甚至不会展示给用户。比如访问不存在的变量。

l 警告:这是有点严重的错误,将会把警告信息展示给用户,但不会影响代码的输出,比如包含一些不存在的文件。

l 错误:这是真正的严重错误,比如访问不存在的 PHP 类。

 

36、★ 如何声明一个名为“myclass”的没有方法和属性的类?

class myclass{}

$object=new myclass();

$newstr=$object->test;

$object->test=”info”;

 

37、★ GD库是做什么用的?

GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片。

在网站上GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据生成报表。

 

38、PHP 中获取图像尺寸大小的方法是什么?

getimagesize () 获取图片的尺寸

Imagesx () 获取图片的宽度

Imagesy () 获取图片的高度

 

39、PHP 中的 PEAR 是什么?

PEAR 也就是为 PHP 扩展与应用库(PHP Extension and Application Repository),它是一个 PHP 扩展及应用的一个代码仓库。

 

40、★  指出一些在PHP输入一段HTML代码的办法。

echo  “<a href=’index.php’>aaa</a>”;

 

41、★下面哪个选项没有将 john 添加到users 数组中?有问题?

(a)$users[]=‘join’;

(b)array_add($users,’john’);

(c)array_push($users,’john’);

(d)$users||=’john’;

【b,d】

 

42、★下面的程序会输入10否?

<?php

$num=10;

function multiply(){

$num=$num*10;

}

multiply();

echo $num;

?>

 

输出:10

 

43、★写出以下程序的输出结果

$b=201;

$c=40;

$a=$b>$c?4:5;

echo $a;

?>

4

 

44、★检测一个变量是否有设置的函数是否?是否为空的函数是?

isset($str),empty($str);

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

echo $a[0] 或 echo substr($a,0,1)

46、★、使用那些工具进行版本控制?(1分)

CVS,SVN,Git

CVS Server on Apache作服务端,WinCVS作客户端

Subversion on Apache/DAV做服务端,   TortoiseSVN做客户

 

47、★、如何实现PHP、JSP交互

$foo=new Java(‘java.lang.System’);

48、★、请简单阐述您最得意的开发之作(4分)看作品  简单说明

信息分类

 

49、★、看题说结果 考察基础

$null=NULL;

$bool=FALSE;

$notSet;

$array=array();

//以下是问题

$a=”hello”;

$b=&$a;

unset($b);

echo $a; //答案为:hello 堆栈问题

echo “<hr>”;

$b=”world”;

echo $a; //答案为:hello $b 已经销毁了

echo “<hr>”;

 

50、★、看题说结果

$a=1;

$x=&$a;

$b=$a++;

echo $b;//答案为:1

echo “<hr>”;

//以下是问题

$x = empty($array);

echo $x;//答案为:1  返回布尔类型

echo “<hr>”;

echo $x?”true”:”false”;//答案为:true

 

51、★、写出如下程序的输出结果

<?php

$str1=null;

$str2=false;

echo $str1==$str2 ? ‘相等’ : ‘不相等’;

//相等

 

$str3=”;

$str4=0;

echo $str3==$str4?  ‘相等’ : ‘不相等’;

//相等

 

$str5=0;

$str6=’0′;

echo $str5===$str6? ‘相等’ : ‘不相等’;

 

//不相等

?>

 

52、★、写出如下程序的输出结果

<?

$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

?>

 

53、★、写出如下程序的输出结果

$test=”aaaaaa”;

$abc=&$test;

unset($test);

echo $abc;//’aaaaaa’

 

54、★、写出如下程序的输出结果  这道题挺难啊

<?php

$GLOBALS[‘var1’]=5;

$var2=1;

function get_value(){

global $var2;

$var1=0;

return $var2++;

}

get_value();  //大家注意 这没要返回值

echo $var1;   //5

echo $var2;   //2

?>

注: 在php5.2可以 php5.4错误

 

55、★、写出如下程序的输出结果

 

function get_arr($arr){

unset($arr[0]);

}

 

$arr1=array(1,2);

$arr2=array(1,2);

get_arr(&$arr1); // 5.2才可以

get_arr($arr2);

 

print_r( count($arr1) );

print_r( count($arr2) );

 

 

56、★、PHP代码如下

$a=”hello”;

$b=&$a;

unset($b);

$b=”world”;

echo $a;

其结果是?  //hello

 

57、

$str=”cd”;

$$str=”landog”;

$$str=”ok”;

echo $cd;

其结果是?   ok

 

58、★、在 HTML 语言中,页面头部的 meta 标记可以用来输出文件的编码格式,以下是一个标准的 meta 语句

<META http-equiv=”Content-Type”    content=”text/html; charset=gbk”    >

<META http-equiv=”Content-Type”    content=”text/html; charset=utf-8”    >

请使用 PHP 语言写一个函数,把一个标准 HTML 页面中的类似 meta 标记中的 charset 部分值改为 big5

请注意:

 

(1) 需要处理完整的 html 页面,即不光此 meta 语句

(2) 忽略大小写

(3) ‘ 和 ” 在此处是可以互换的

(4) ‘Content-Type’ 两侧的引号是可以忽略的,但 ‘text/html; charset=gbk’ 两侧的不行

(5) 注意处理多余空格

解析:这里全面考察正则表达式匹配。

 

(1) 需要处理完整的 html 页面,即不光此 meta 语句  ==》 preg_replace()

(2) 忽略大小写   ==> i修饰符

(3) ‘ 和 ” 在此处是可以互换的   ==》多选结构  【“|‘】

(4) ‘Content-Type’ 两侧的引号是可以忽略的,但 ‘text/html; charset=gbk’ 两侧的不行    ==》可选结构  ’?

(5) 处理多余的空格   \s?表示0到多处空白

 

综合,我们得到的测试代码如下:(未经测试 :b )

 

function chgCharSet($url){

$string = file_get_contents($url);

$patten = ‘/(<meta\s*http-equiv\s*=\s*([\’|”]?)content-type\2\s*content\s*=\s*([\’|”])text\/html\s*;\s*charset=)([\w\-]+)(\3\s*>)/i’;

return preg_replace($patten,”$1″.”big5″.”$5″,$string);

}

 

$url = “http://www.baidu.com”;

echo chgCharSet($url);

 

59、★、如何修改SESSION的生存时间

方法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);

大家最好答第一点

 

60、★、有一个网页地址,比如PHP开发资源主页: http://www.phpres.com/index.php,如何得到它的内容?

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

$readcontents=fopen(“http://www.phpres.com/index.php”,”rb”);

$contents=stream_get_contents($readcontents);

fclose($readcontents);

echo $contents;

方法2: 我们讲过的 就答它吧!

echo file_get_contents(“http://www.phpres.com/index.php”);

 

61、★、在PHP中, heredoc 是一种特殊的字符串,它的结束标志必须?

heredoc 的语法是用”<<<”加上自己定义成对的标签,在标签范围内的文字视为一个字符串

例子:

 

$str=<<<SuiYi

My name is Jiang Qihui!

SuiYi;

// 顶格写

 

echo $str;

 

 

62、★、请说明php中传值与传引用的区别。 什么时候传值什么时候穿引用?

传值只是把某一个变量的值传给了另一个变量,而引用则说明两者指向了同一个地方。[对函数的参数而言]

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

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

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

按引用传递则不需要复制值,对于性能提高很有好处。

 

63、★、 简述如何得到当前执行脚本路径,不包括所得到参数。

$script_name=basename(__FILE__);

print_($script_name);

 

大家想一想 如果包括参数呢?

<?php

echo

“http://”.$_SERVER[‘SERVER_NAME’].$_SERVER[‘PHP_SELF’].”?”.$_SERVER[‘QUERY_STRING’];

//echo “http://”.$_SERVER[‘HTTP_HOST’].$_SERVER[‘REQUEST_URL’;

?>

 

64、★、如何使用下面的类,并解释下面什么意思?(3)

class test{

function Get_test($num){

$num=md5( md5 ($num).”En”);

return $num;

}

}

 

$testnum=”123″;

$object = new test();

$encrypt = $object->Get_test($testnum);

echo $encrypt;

类test里面包含Get_test方法,实例化类调用方法多字符串加密

__________________________________________________________________

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

$a = “abcd”;

$b = “1324”;

echo “初始化时 a= $a, b=$b<br>”;

$a = $a.$b;

$b = strlen ($b);

$b = substr ($a,0,(strlen($a)-$b));

$a = substr ($a,strlen($b));

echo “交换后 a=$a,b=$b<br>”;

 

66、★ 写一个函数,尽可能高效的,从一个标准url 里取出文件的扩展名。重点题型

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

答案:1:function getExt($url){

$arr=parse_url($url); //以数组的形式得到url的各个段的信息

$file=basename($arr[“path”]);//得到的是文件名 脚本名 直接用会得到查询字符串所以需要配置parse_url

$ext=explode(“.”,$file);

return $ext[1];

}

答案2:

function getExt($url){

$url=basename($url);

$pos1=strops($url,”.”);

$pos2=strops($url,”?”);

if(strstr($url,”?”)){

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

}else{

return substr($url,$pos1);

}

}

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

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

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

计算出$b相对于$a的相对路径应该是../../c/d将()添上

答案: function getRelativePath($a,$b){

$returnPath=array(dirname($b));

$arrA=explode(“/”,$a);

$arrB=xeplode(“/”,$returnPath[10]);

for($n=1, $len=count($arrB) ;$n<$len ;$n++ ){

if($arrA[$n]!=$arrB[$n]){

break;

}

}

if($len-$n>0){

$returnPath=array_merge($returnPath,array_fill(1,$len-$n,”..”));

}

$returnPath=array_merge($returnPath,array_slice($arrA,$n));

return implode(“/”,$returnPath);

}

 

68、、有一个一维数组,里面存储整形数据,请写一个函数,将他们从小到大的顺序排列。要求执行效率高。并说明如何改善执行效率。(该函数必须自己实现,不能使用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]>$aarr[$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);

?>

 

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

 

function my_scandir($dir)

{

$files=array();

if($handle=opendir($dir)){

}

 

while(($file=readdir($handle))!==false){

if($file!=”..”&&$file!=”.”){

if(is_dir($dir.”/”.$file)){

$files[$file]=scandir($dir.”/”.$file);

}else{

$files[]=$files;

}

}

}

closedir($handle);

return $files;

}

}

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.”/”.$files;

}

}

}

closedir($handle);

return $files;

}

}

}

print_r(my_scandir(“D:Program Fileslnternat ExplorerMUI”))

?>

70、 简述论坛中无限分类的实现原理。

<?php

/*

数据表结构如下:

CREATE TABLE’category'(

‘categoryID’smallint(5)unsigned NOT NULL auto_increment,

‘categoryParentlID’ smallint(5)unsigned NOT NULL default”0″,

‘categoryName’varchar(50) NOT NULL default””,

PRIMARY KEY(‘categoryID’)

)ENGINE=MYISAM DEFAULT CHARSET CHARSET=gbk;

INSERT INTO’category'(‘categoryParentlID’,’categoryName’)VALUES

(0,”一级级别”),

(1,”二级级别”),

(1,”二级级别”),

(1,”二级级别”),

(2,”三级级别”),

(2,”333332″),

(2,”124234″),

(3,”aqqqqqd”),

(4,”哈哈”),

(5,”663333666″),

*/

//指定分类id变量$category_id,然后返回该分类的所有子类

//$default_category为默认的选中的分类

function Get_Category($category_id=0,$level=0,$default_category=0)

{

global $DB;

$sql=”SELECT*FROM category OIRDER BY categoryID DESC”;

$restult=$DB->query($sql);

while($rows=$DB->fetch_array($result))

{

$category_array[$row[categoryParentlID]][categoryID]  =  array(“id”  =>

$row[categoryID],”parent”=> $row[categoryParentlID],”name”=>$row

[categoryName]);

 

}

if(!isset( $category_array[ $category_id]))

{

return “”;

}

foreach($category_array[ $category_id]AS $key=>$category)

}

if($category[“id”]==$dafault_category)

{

echo “<option selected value=”.$category[“id”].””;

}

else

{

echo “<option value=”.$category[“id”].””;

}

if($level>0)

{

echo “>”.str_repeat(“”,$level).””.$category[“name”].”</option>/n”;

}

else

{

echo “>”.$category[“name”].”</option>/n”;

}

Get_Category($key,$level+1,$dafault_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]=> 2323233  [level]=> 2 [ParentID]=> 2 )

[6]=>Array( [id]=> 6 [name]=> 3333333  [level]=> 2 [ParentID]=> 2 )

[5]=>Array( [id]=> 5 [name]=> 三级类别  [level]=> 2 [ParentID]=> 2 )

[10]=>Array( [id]=> 10 [name]=> 6666666  [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[“category_ParentID”]][$rows[“categoryID”]]= $rows;

}

foreach($category_array AS $key=>$val)

{

if($key == $category_id)

{

foreach($val AS $=>$v)

{

$options[$k]=

array(

“id”  => $v[categoryID], “name” => $v[“categoryName”], “level” => $level, “ParentID”=>$v[“categoryParentID”]

);

$children = Category_array($k,$level+1);

if(count($childern)>0)

{

$option = $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”=>”3333333”),

“5” => array(“id”=>5,”parent”=>1,”name”=>”5555555”)

),

“3”=> array(

“1” => array(“id”=>6,”parent”=>3,”name”=>”6666666”),

“2” => array(“id”=>7,”parent”=>3,”name”=>”7777777”)

),

“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 =”<option selected value=”.$cate[“id”].””;

}else

{

$txt = “<option value=”.$cate[“id”].””;

}

if($level>0)

{

$txt1 = “>”.str_repeat(“-“, $level).””.$cate[“name”].”</option>/n”;

}

else

{

$txt1 = “>”.$cate[“name”].”</option>/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 “<select>”;

$c = new cate();

//$c->Get_Category();

$ttt = $c->getFlush($id,”0″,”3″);

echo $ttt;

echo “</select>”;

?>

71、★、在HTTP1.0中,状态码401的含义是?;如果返回”找不到文件”的提示,则可用header函数,其语句为?

状态401代表未被授权

404 该页无法找到 header(“Location:www.xxx.php”);//地址跳转命令 乱写一个就找不到了呗

header(”HTTP/1.0404 Not Found”);

403 连接超时

 

72、语句 error_reporting(2047)的作用是____。

error_reporting(2047)的作用是:report All errors and warnings

 

73、写出一个正则表达式,过虑网页上的所有JS/VBS脚本(即把script标记及其内容都去掉):

 

$script=”以下内容不显示: “;

echo preg_replace(“/].*?>.*?/si”,  “替换内容”  ,  $script  );

 

74、以Apache 模块的方式安装PHP,在文件http.conf中首先要用语句____动态装载PHP模块,

 

然后再用语句____使得Apache把所有扩展名为php的文件都作为PHP脚本处理。

 

LoadModule php5_moudle “c:/php/php5apache2.dll”;

AddType application/x-httpd-php.php

 

75、语句include 和require 都能把另外一个文件包含到当前文件夹中,他们的区别是 __; 为了避免多次包含同一文件,可以用语句____来代替它们。

在如何处理失败时, include() 产生一个警告而 require() 则导致一个致命错误;require_once()/include_once()

 

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

allow_call_time_pass_reference boolean : 是否启用在函数调用时强制参数被按照引用传递

 

77、对json数据格式的理解?

JSON(JavaScriptObject Notation) 是一种轻量级的数据交换格式,json数据格式固定,可以被多种语言用作数据的传递

PHP中处理json格式的函数为json_decode( string $json [, bool $assoc ] ) ,接受一个 JSON 格式的字符串并且把它转换为 PHP 变量,参数json 待解码的 json string 格式的字符串。 assoc 当该参数为 TRUE 时,将返回 array 而非 object ;

Json_encode:将PHP变量转换成json格式

 

 

(二)、面向对象部分

78、什么是面向对象?

面向对象OO = 面向对象的分析OOA + 面向对象的设计OOD + 面向对象的编程OOP; 通俗的解释就是“万物皆对象”,把所有的事物都看作一个个可以独立的对象(单元),它们可以自己完成自己的功能,而不是像C那样分成一个个函数。

现在纯正的OO语言主要是java和C#,PHP、C++也支持OO,C是面向过程的。

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

__construct,__destruct

 

80、★、请写出PHP5权限控制修饰符

public(公共),private(私有),protected(保护)

 

81、简述 private、 protected、 public修饰符的访问权限。  

public : 公共成员,完全公开,没有访问限制。

private : 私有成员, 在类的内部才可以访问。

protected : 保护成员,该类内部和继承类中可以访问。

 

82、堆和栈的区别?

栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;

堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。

83、解释一下OPP编程思想,面向对象编程:什么是封装、继承、多态?

封装,将一个方法封装成一个类,将代码模块化;

继承:子类继承父类,既可以实现现有类的所有功能,又可以对这些功能进行扩展;

多态:当子类重新定义了父类的虚函数,父类指针根据赋给它的不同子类指针来实现不同的功能,将接口重用。

84、面向对象的特征有哪些方面?

主要有封装,继承,多态。如果是4个方面则加上:抽象。

下面的解释为理解:

封装:

封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的高内聚,低耦合,防止程序相互依赖性而带来的变动影响.

 

继承:

在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。

多态:

多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

抽象:

抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。例如,看到一只蚂蚁和大象,你能够想象出它们的相同之处,那就是抽象。

 

85、抽象类和接口的概念以及区别?

抽象类:它是一种特殊的,不能被实例化的类,只能作为其他类的父类使用。使用abstract关键字声明。

它是一种特殊的抽象类,也是一个特殊的类,使用interface声明。

(1)抽象类的操作通过继承关键字extends实现,而接口的使用是通过implements关键字来实现。

(2)抽象类中有数据成员,可以实现数据的封装,但是接口没有数据成员。

(3)抽象类中可以有构造方法,但是接口没有构造方法。

(4)抽象类的方法可以通过private、protected、public关键字修饰(抽象方法不能是private),而接口中的方法只能使用public关键字修饰。

(5)一个类只能继承于一个抽象类,而一个类可以同时实现多个接口。

(6)抽象类中可以有成员方法的实现代码,而接口中不可以有成员方法的实现代码。

86、什么是构造函数,什么是析构函数,作用是什么?

构造函数(方法)是对象创建完成后第一个被对象自动调用的方法。它存在于每个声明的类中,是一个特殊的成员方法。作用是执行一些初始化的任务。Php中使用__construct()声明构造方法,并且只能声明一个。

析构函数(方法)作用和构造方法正好相反,是对象被销毁之前最后一个被对象自动调用的方法。是PHP5中新添加的内容作用是用于实现在销毁一个对象之前执行一些特定的操作,诸如关闭文件和释放内存等。

 

87、如何重载父类的方法,举例说明

重载,即覆盖父类的方法,也就是使用子类中的方法替换从父类中继承的方法,也叫方法的重写。

覆盖父类方法的关键是在子类中创建于父类中相同的方法包括方法的名称、参数和返回值类型。PHP中只要求方法的名称相同即可。

88、常用的魔术方法有哪些?举例说明

php规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非是为了重载已有的魔术方法。

__construct() 实例化类时自动调用。

__destruct() 类对象使用结束时自动调用。

__set() 在给未定义的属性赋值的时候调用。

__get() 调用未定义的属性时候调用。

__isset() 使用isset()或empty()函数时候会调用。

__unset() 使用unset()时候会调用。

__sleep() 使用serialize序列化时候调用。

__wakeup() 使用unserialize反序列化的时候调用。

__call() 调用一个不存在的方法的时候调用。

__callStatic()调用一个不存在的静态方法是调用。

__toString() 把对象转换成字符串的时候会调用。比如 echo。

__invoke() 当尝试把对象当方法调用时调用。

__set_state() 当使用var_export()函数时候调用。接受一个数组参数。

__clone() 当使用clone复制一个对象时候调用。

89、$this和self、parent这三个关键词分别代表什么?在哪些场合下使用?

$this 当前对象

self  当前类

parent  当前类的父类

$this在当前类中使用,使用->调用属性和方法。

self也在当前类中使用,不过需要使用::调用。

parent在类中使用。

90、类中如何定义常量、如何类中调用常量、如何在类外调用常量。

类中的常量也就是成员常量,常量就是不会改变的量,是一个恒值。

定义常量使用关键字const.

例如:const PI = 3.1415326;

无论是类内还是类外,常量的访问和变量是不一样的,常量不需要实例化对象,

访问常量的格式都是类名加作用域操作符号(双冒号)来调用。

即:类名 :: 类常量名;

91、作用域操作符::如何使用?都在哪些场合下使用?

调用类常量

调用静态方法

92、__autoload()方法的工作原理是什么?

使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。

当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。

这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后

就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。

使用自动载入的魔术函数可以不必要写很多个include或者require函数。

93、 类的属性可以序列化后保存到 session 中,从而以后可以恢复整个类,这要用到的函数是

反序列化函数unserialize()

 

 

94、★ PHP 支持多继承吗?

不可以。PHP 类只能继承一个父类,并用关键字“extended”标识。

 

 

 

(三)、smarty 模板引擎

 

95、能够使HTML和PHP分离开使用的模板

Smarty模板引擎   Template Lite   ;Dwoo

TinyButStrong;phemplate;XTemplate

PHPLib,FastTemplate,Savant,MiniTemplator,Tag Template

 

 

96、编译和缓存区别?

smarty的编译过程就是把模板里面的标签替换成相应php代码,这就是smarty的编译, 其实就是php和html混合的过程

smarty的缓存需要手动开启,smarty的缓存就是把编译好的文件执行后,同时生成一份静态的html页面,再次访问的时候,你访问的就是html文件了,所以就效率来说,要高一些

 

97、什么是smarty? Smarty的优点是什么?

Smarty是一个使用PHP写出来的PHP模板引擎,目的是要使用PHP程序同美工分离,使的程序员改变程序的逻辑内容时不会影响到美工的页面设计,美工重新修改页面时不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。(也易于程序的多样式开发)

Smarty优点

  1. 速度快:相对其他模板引擎。
  2. 编译型:采用smarty编写的程序在运行时要编译成一个非模板技术的PHP文件

3 缓存技术:它可以将用户最终看到的HTML文件缓存成一个静态的HTML页

  1. 插件技术:smarty可以自定义插件。

不适合使用smarty的地方

  1. 需要实时更新的内容。例如像股票显示,它需要经常对数据进行更新 2. 小项目。小项目因为项目简单而美工与程序员兼于一人的项目

 

98、在模板中使用{$smarty}保留变量

{$smarty}

{$smarty.get}   // $_GET

{$smarty.get.page}  // $_GET[‘page’]

{$smarty.cookies.} // $_COOKIE

{$smarty.post.}   // $_POST

{$smarty.session.} // $_SESSION

{$smarty.server.}   // $_SERVER

 

99、在模板中访问php中的变量

在php脚本中有系统常量和自定义常量两种,同样这两种常量在Smarty模板中也可以被访问,而且不需要从php中分配,只要通过{$smarty}保留变量就可以直接输出常量的值。在模板中输出常量的示例:

{$smarty.const._MY_CONST_VAL}

{$smarty.const.__FILE__}

 

100、变量调解器

 

{$var|modifier1|modifier2|……..}

 

<{$str}><br>

<{$str|capitalize}><{*首字母大写*}><br>

<{$str|upper}><{*全部大写*}><br>

<{$str|lower}><{*全部小写*}><br>

<{$str|lower|upper}><{*全部大写,调节从左至右*}><br>

<{$leg|truncate}><{*字符串截取,默认80个字符*}><br>

<{$leg|truncate:10}><{*字符串截取,前10个,包括…三个字符*}><br>

 

101、php查询mysql数据库时,查询中文结果时出现的乱码。怎么解决???? 

1.文件属性(另存为)

2.文件meta(设置浏览器解析的时候)

  1. 连接数据库时编码设定
  2. PHP文件中使用header函数确定编码

 

102、缓存机制

 

   如果开启了缓存,smarty同时生成一份静态的html页面,如果在设定的时间没有过期,再次访问的时候,你访问的就是是html文件了,减少了读取数据库,所以就效率来说,要高一些。

 

103、smarty的赋值和载入模板

$Smarty->assign(name,value)

$Smarty->display(‘index.php’)

 

104、smarty模板技术的用途是什么?

为了php与html分开,美工和程序员各司其职,互不干扰。

 

105、smarty配置主要有哪几项?

  1. 引入smarty.class.php;
  2. 实例化smarty对象;
  3. 重新修改默认的模板路径;
  4. 重新修改默认的编译后文件的路径;
  5. 重新修改默认的配置文件的路径;
  6. 重新修改默认的cache的路径。
  7. 可以设置是否开启cache。
  8. 可以设置左侧和右侧定界符。

 

106、smarty在使用过程中需要注意哪些细节?

Smarty是基于代码分离概念的一种模板引擎,它将一个页面程序分成了两部分来实现:即视图和代码,

也就是说smarty技术将用户UI与php代码分离开。

这样程序员和美工各司其职,互不干扰。

107、smarty运用过程中要注意以下几个问题:

1.正确配置smarty。主要要实例化smarty对象,配置smarty模板文件的路径;

2.php页面中使用assign赋值 和 display显示页面;

3.smarty模板文件中不允许出现php代码段,所有的注释,变量,函数都要包含在定界符内。

A.{}

  1. foreach
  2. if else
  3. include
  4. Literal

 

 

(四)、二次开发系统(DEDE、ecshop):

108、对二次开发的理解

二次开发,简单的说就是在现有的软件上进行定制修改,功能的扩展,然后达到自己想要的功能,一般来说都不会改变原有系统的内核。

 

109、二次开发程序安装后访问时候出现一些警告以及错误

根据错误,来修改服务器配置参数以及百度

110、功能,模板的更换,功能的添加修改

其实也就是面向对象的应用 用,以及模板的更换类似smarty的使用

111、用过哪些二次开发的东西?

Dedecms phpcms  ecshop,基本这些的东西如果基础好了 学习起来都是没问题的。

112、像php做一次开发好,还是二次开发好?

一般中小企业都用cms系统二次开发,都是为了效率。当然如果想一次开发也行,会用框架而且时间充足的话就可以了,大企业都是团队来开发的,杜绝版权问题。

113、二次开发过程中很多类与类之间进行之间的方法访问,是通过什么方式传递的?

不是类继承而是对象组合,把实例化好的对象 通过global传递进去

 

114、dedecms如果更换目录,后台某项就进不去了如何解决?

后台核心设置中修改成现在的 项目目录名称

115、 dedecms中自定义模型的理解?

在织梦系统中有内容模型这个概念,不同内容模型可以用来构建不同内容形式的站点,在系统中自带了以下几种模型:普通文章、图集、软件、商品、分类信息、专题。通过系统自带的模型,我们可以用来构建不同类型的站点,例如:使用图集可以做一个图片站,用软件模型构建一个软件下载站点。

当然以上随系统附带的模型被称为系统模型,用户可以自己定义一些模型,比如图书、音乐专辑等,自定义了这些模型才可以构建更多内容形式的站点。

相当于我们自动添加了表结构,适应现在当前需求的变化

 

116、dede中概念,设计和使用模板,必须要理解下面几个概念

1、板块(封面)模板:

指网站主页或比较重要的栏目封面频道使用的模板,一般用“index_识别ID.htm”命名,此外,用户单独定义的单个页面或自定义标记,也可选是否支持板块模板标记,如果支持,系统会用板块模板标记引擎去解析后才输出内容或生成特定的文件。

2、列表模板:

指网站某个栏目的所有文章列表的模板,一般用 “list_识别ID.htm” 命名。

3、档案模板:

表示文档查看页的模板,如文章模板,一般用 “article_识别ID.htm” 命名。

4、其它模板:

一般系统常规包含的模板有:主页模板、搜索模板、RSS、JS编译功能模板等,此外用户也可以自定义一个模板创建为任意文件。

 

117、dede中几种标签的使用?

 

 

列表 内容 等标签 只能在其本范围内使用,列表标签只能在列表中使用,内容标签只能在内容标签中使用。

全局标签能在所有页面中使用

 

118、熟悉常用类库

(例如:dedesql.class.php);熟悉系统函数库(common.func.php);熟悉自定义函数库(extend.func.php);熟悉前台入口文件(common.inc.php)

119、对商城的基本逻辑了解多少,购物流程 

会员,商品,购物车,订单

 

120、网上购物主要步骤

一、购物平台选择不管选择是商城还是网店,都是畅享购物快乐的第一步。

二、注册账号

三、挑选商品

四、协商交易事宜

五、填写准确详细的地址和联系方式

六、选择支付方式

七、收货验货

如若不满意,那么往下

八、退换货

九、退款

十、维权

十一、评价

 

121、购物车的数据一般存在哪里

通常都存在数据库的表,也可以放在cookies或session里

 

 

(五)、框架

122、★ 什么是 MVC?谈谈对mvc的认识(面试的时候总会问到的题)

MVC 由 Model(模型), View(视图)和 Controller(控制器)组成,MVC 可以更高效地管理好 3 个不同层的 PHP 代码。

l Model(模型)数据信息存取层(比如数据库记录列表)

l View(视图)负责将应用的数据以特定的方式展现在界面上

l Controller(控制器)通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

 

123、掌握PHP的哪些框架、模板引擎、系统等

框架:框架有很多,例如ZendFramework、CI、Yii、Laravel、thinkphp等等,熟练掌握的是thinkphp

模板引擎:也有很多,熟练掌握的是smarty

系统:有很多,例如:康盛的产品(uchome、supesite、discuzX等),帝国系统、DEDE(织梦)、phpcms v9、ecshop、ecmall等,熟练掌握的是DEDECMS、Ecshop

 

124、常见的PHP框架

thinkPHP 、yii、Laravel、CI、ZendFramework、CakePhp,

 

125、MVC的概念是什么?各层主要做什么工作?

MVC(即模型-视图-控制器)是一种软件设计模式或者说编程思想。

M是Model模型  数据处理,

V是View 视图  模板显示,用户界面

C是Controller控制器  控制流程。

使用mvc的目的是实现M和V分离,从而使得一个程序可以轻松使用不同的用户界面。

在程序开发中,模型层一般负责对数据库表信息进行增删改查,视图层负责显示页面内容,控制器层在M和V之间起到调节作用,控制器层决定调用哪个model类的哪个方法,执行完毕后由控制器层决定将结果assign到哪个view层。

 

126、现在编程中经常采取MVC三层结构,请问MVC分别指哪三层,有什么优点?

MVC三层分别指:业务模型、视图、控制器,由控制器层调用模型处理数据,然后将数据映射到视图层进行显示,优点是:①可以实现代码的重用性,避免产生代码冗余;②M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式

 

 

ThinkPHP部分

127、如何理解TP中的单一入口文件?

ThinkPHP采用单一入口模式进行项目部署和访问,无论完成什么功能,一个项目都有一个统一(但不一定是唯一)的入口。应该说,所有项目都是从入口文件开始的,并且所有的项目的入口文件是类似的,入口文件中主要包括:

定义框架路径、项目路径和项目名称(可选)

定义调试模式和运行模式的相关常量(可选)

载入框架入口文件(必须)

 

128、ThinkPHP中的MVC分层是什么?(理解)

MVC 是一种将应用程序的逻辑层和表现层进行分离的方法。ThinkPHP 也是基于MVC设计模式的。MVC只是一个抽象的概念,并没有特别明确的规定,ThinkPHP中的MVC分层大致体现在:

模型(M):模型的定义由Model类来完成。

控制器(C):应用控制器(核心控制器App类)和Action控制器都承担了控制器的角色,Action控制器完成业务过程控制,而应用控制器负责调度控制。

视图(V):由View类和模板文件组成,模板做到了100%分离,可以独立预览和制作。

但实际上,ThinkPHP并不依赖M或者V ,也就是说没有模型或者视图也一样可以工作。甚至也不依赖C,这是因为ThinkPHP在Action之上还有一个总控制器,即App控制器,负责应用的总调度。在没有C的情况下,必然存在视图V,否则就不再是一个完整的应用。

总而言之,ThinkPHP的MVC模式只是提供了一种敏捷开发的手段,而不是拘泥于MVC本身。

 

129、如何理解 ThinkPHP 3.0 架构三(核心 + 行为 + 驱动)中的行为?

核心 + 行为 + 驱动

TP官方简称为:CBD

核心(Core):就是框架的核心代码,不可缺少的东西,TP本身是基于MVC思想开发的框架。

行为(Behavior) :行为在新版ThinkPHP的架构里面起着举足轻重的作用,在系统核心之上,设置了很多标签扩展位,而每个标签位置可以依次执行各自的独立行为。行为扩展就因此而诞生了,而且很多系统功能也是通过内置的行为扩展完成的,所有行为扩展都是可替换和增加的,由此形成了底层框架可组装的基础。

驱动( Driver ):数据库驱动、缓存驱动、标签库驱动和模板引擎驱动,以及外置的类扩展。

框架,即framework。其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。

 

130、什么是惯例配置?

惯例重于配置是系统遵循的一个重要思想,系统内置有一个惯例配置文件(位于系统目录下面的Conf\convention.php),按照大多数的使用对常用参数进行了默认配置。所以,对应用项目的配置文件,往往只需要配置和惯例配置不同的或者新增的配置参数,如果你完全采用默认配置,甚至可以不需要定义任何配置文件。

惯例配置文件会被系统自动加载,无需在项目中进行加载。

131、什么是SQL注入?(理解)

SQL注入攻击是黑客对数据库进行攻击的常用手段之一。一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,注入者可以在表单中输入一段数据库查询代码并提交,程序将提交的信息拼凑生成一个完整sql语句,服务器被欺骗而执行该条恶意的SQL命令。注入者根据程序返回的结果,成功获取一些敏感数据,甚至控制整个服务器,这就是SQL注入。

132、ThinkPHP如何防止SQL注入?(理解)

(1)查询条件尽量使用数组方式,这是更为安全的方式;

(2)如果不得已必须使用字符串查询条件,使用预处理机制;

(3)开启数据字段类型验证,可以对数值数据类型做强制转换;(3.1版本开始已经强制进行字段类型验证了)

(4)使用自动验证和自动完成机制进行针对应用的自定义过滤;

(5)使用字段类型检查、自动验证和自动完成机制等避免恶意数据的输入。

 

133、如何开启调试模式?调试模式有什么好处?

开启调试模式很简单,只需要在入口文件中增加一行常量定义代码:

<?Php,bv

//开启调试模式

define(‘APP_DEBUG’, true);

//加载框架入口文件

require ‘./ThinkPHP/ThinkPHP.php’;

在完成开发阶段部署到生产环境后,只需要删除调试模式定义代码即可切换到部署模式。开启调试模式后,系统会首先加载系统默认的调试配置文件,然后加载项目的调试配置文件,调试模式的优势在于:

 

开启日志记录,任何错误信息和调试信息都会详细记录,便于调试;

关闭模板缓存,模板修改可以即时生效;

记录SQL日志,方便分析SQL;

关闭字段缓存,数据表字段修改不受缓存影响;

严格检查文件大小写(即使是Windows平台),帮助你提前发现Linux部署问题;

可以方便用于开发过程的不同阶段,包括开发、测试和演示等任何需要的情况,不同的应用模式可以配置独立的项目配置文件。

134、TP中支持哪些配置模式?优先级?

ThinkPHP在项目配置上面创造了自己独有的分层配置模式,其配置层次体现在:

惯例配置->项目配置->调试配置->分组配置->扩展配置->动态配置

以上是配置文件的加载顺序,因为后面的配置会覆盖之前的同名配置(在没有生效的前提下),所以优先顺序从右到左。

135、TP中的URL模式有哪几种?默认是哪种?

ThinkPHP支持四种URL模式,可以通过设置URL_MODEL参数来定义,包括普通模式、PATHINFO、REWRITE和兼容模式。

默认模式为:PATHINFO模式,设置URL_MODEL 为1

136、TP中系统变量有哪些?如何获取系统变量?

获取系统变量的方法:

 

只需要在Action中调用下面方法:

$this->方法名(“变量名”,[“过滤方法”],[“默认值”])

137、ThinkPHP3框架中D函数与M函数的区别是什么?

M方法实例化模型无需用户为每个数据表定义模型类,D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会自动调用M方法去实例化Model基类。同时对于已实例化过的模型,不会重复去实例化(单例模式)。

 

、数据库部分

138、常见的关系型数据库管理系统产品有?

oracle、SQL Server、MySQL、Sybase、DB2、Access等。

139、完整性约束包括哪些?

数据完整性(Data Integrity)是指数据的精确(Accuracy)和可靠性(Reliability)。

分为以下四类:

1) 实体完整性:规定表的每一行在表中是惟一的实体。

2) 域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括取值范围、精度等规定。

3) 参照完整性:是指两个表的主关键字和外关键字的数据应一致,保证了表之间的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。

4) 用户定义的完整性:不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件,它反映某一具体应用必须满足的语义要求。

 

与表有关的约束:包括列约束(NOT NULL(非空约束))和表约束(PRIMARY KEY、foreign key、check、UNIQUE) 。

 

140、什么是事务?及其特性?

事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。

事务特性:

(1)原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。

(2)一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态

(3)隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,

(4) 持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

或者这样理解:

事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。

 

141、什么是锁?

数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

 

加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。

基本锁类型:锁包括行级锁和表级锁

 

142、什么叫视图?游标是什么?

视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

143、什么是存储过程?用什么来调用?

存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。

144、索引的作用?和它的优点缺点是什么?

索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。

145、如何通俗地理解三个范式?

第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;

第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;   第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。

146、什么是基本表?什么是视图?

基本表是本身独立存在的表,在 SQL 中一个关系就对应一个表。  视图是从一个或几个基本表导出的表。视图本身不独立存储在数据库中,是一个虚表

147、试述视图的优点?

(1) 视图能够简化用户的操作  (2) 视图使用户能以多种角度看待同一数据; (3) 视图为数据库提供了一定程度的逻辑独立性; (4) 视图能够对机密数据提供安全保护。

148、NULL是什么意思

NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。对NULL这个值的任何比较都会生产一个NULL值。您不能把任何值与一个 NULL值进行比较,并在逻辑上希望获得一个答案。

使用IS  NULL来进行NULL判断

149、主键、外键和索引的区别?

主键、外键和索引的区别

定义:

主键–唯一标识一条记录,不能有重复的,不允许为空

外键–表的外键是另一表的主键, 外键可以有重复的, 可以是空值

索引–该字段没有重复值,但可以有一个空值

 

 

作用:

主键–用来保证数据完整性

外键–用来和其他表建立联系用的

索引–是提高查询排序的速度

个数:

主键–主键只能有一个

外键–一个表可以有多个外键

索引–一个表可以有多个唯一索引

 

150、你可以用什么来确保表格里的字段只接受特定范围里的值?

Check限制,它在数据库表格里被定义,用来限制输入该列的值。

触发器也可以被用来限制数据库表格里的字段能够接受的值,但是这种办法要求触发器在表格里被定义,这可能会在某些情况下影响到性能。

151、说说对SQL语句优化有哪些方法?(选择几条)

(1)Where子句中:where表之间的连接必须写在其他Where条件之前,那些可以过滤掉最大数量记录的条件必须写在Where子句的末尾.HAVING最后。

(2)用EXISTS替代IN、用NOT EXISTS替代NOT IN。

(3) 避免在索引列上使用计算

(4)避免在索引列上使用IS NULL和IS NOT NULL

(5)对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

(6)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

(7)应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描

152、SQL语句中‘相关子查询’与‘非相关子查询’有什么区别?

子查询:嵌套在其他查询中的查询称之。

子查询又称内部,而包含子查询的语句称之外部查询(又称主查询)。

所有的子查询可以分为两类,即相关子查询和非相关子查询

(1)非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。

(2)相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。

故非相关子查询比相关子查询效率高

 

153、char和varchar的区别?

是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是:

char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节).

154、数据表类型有哪些

MyISAM、InnoDB、HEAP、BOB,ARCHIVE,CSV等。

MyISAM:成熟、稳定、易于管理,快速读取。一些功能不支持(事务等),表级锁。

InnoDB:支持事务、外键等特性、数据行锁定。空间占用大,不支持全文索引等。

155、MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?

  1. 设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。
  2. 选择合适的表字段数据类型和存储引擎,适当的添加索引。
  3. mysql库主从读写分离。
  4. 找规律分表,减少单表中的数据量提高查询速度。

e。添加缓存机制,比如memcached,apc等。

  1. 不经常改动的页面,生成静态页面。
  2. 书写高效率的SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1, field_2, field_3 FROM TABLE.

156、对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题?

  1. 确认服务器是否能支撑当前访问量。
  2. 优化数据库访问。
  3. 禁止外部访问链接(盗链), 比如图片盗链。
  4. 控制文件下载。
  5. 使用不同主机分流。
  6. 使用浏览统计软件,了解访问量,有针对性的进行优化。

SQL语言

157、SQL语言包括哪几部分?每部分都有哪些操作关键字?

SQL语言包括数据定义(DDL)、数据操纵(DML),数据控制(DCL)和数据查询(DQL)四个部分。

数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index等

数据操纵:Select ,insert,update,delete,

数据控制:grant,revoke

数据查询:select

 

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

int是数字类型,char固定长度字符串,varchar实际长度字符串,datetime日期时间型,text文本字符串

char 的长度固定为创建表设置的长度,varchar为可变长度的字符

 

159、★、写出发帖数最多的十个人的名字的SQL 利用下表:

members(id,username,pusts,pass,emali)

SELECT * FROM  `members`   ORDER BY posts DESC limit 0,10;

 

160、通俗理解三个设计范式:

第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;

第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;

第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。

 

MySQL

161、Mysql 的存储引擎,myisam和innodb的区别。

MyISAM 是非事务的存储引擎;适合用于频繁查询的应用 ;表锁,不会出现死锁;适合小数据,小并发

innodb是支持事务的存储引擎;合于插入和更新操作比较多的应用 ;设计合理的话是行锁(最大区别就在锁的级别上);适合大数据,大并发。

162、★ MYSQL取得当前时间的函数是?,格式化日期的函数是

now( ),  date( )

NOW 函数返回当前的日期和时间。

DATE( ) 函数返回日期或日期/时间表达式的日期部分。

 

163、如何进行SQL优化?(关于后边的解释同学们可以进行理解,到时根据自己的理解把大体意思说出来即可)

(1)选择正确的存储引擎

以 MySQL为例,包括有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊。

MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。

InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。但是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。

(2)优化字段的数据类型

记住一个原则,越小的列会越快。如果一个表只会有几列罢了(比如说字典表,配置表),那么,我们就没有理由使用 INT 来做主键,使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 会更经济一些。如果你不需要记录时间,使用 DATE 要比 DATETIME 好得多。当然,你也需要留够足够的扩展空间。

(3)为搜索字段添加索引

索引并不一定就是给主键或是唯一的字段。如果在你的表中,有某个字段你总要会经常用来做搜索,那么最好是为其建立索引,除非你要搜索的字段是大的文本字段,那应该建立全文索引。

(4)避免使用Select *从数据库里读出越多的数据,那么查询就会变得越慢。并且,如果你的数据库服务器和WEB服务器是两台独立的服务器的话,这还会增加网络传输的负载。即使你要查询数据表的所有字段,也尽量不要用*通配符,善用内置提供的字段排除定义也许能给带来更多的便利。

(5)使用 ENUM 而不是 VARCHAR

ENUM 类型是非常快和紧凑的。在实际上,其保存的是 TINYINT,但其外表上显示为字符串。这样一来,用这个字段来做一些选项列表变得相当的完美。例如,性别、民族、部门和状态之类的这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是 VARCHAR。

(6)尽可能的使用 NOT NULL

除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOT NULL。 NULL其实需要额外的空间,并且,在你进行比较的时候,你的程序会更复杂。 当然,这里并不是说你就不能使用NULL了,现实情况是很复杂的,依然会有些情况下,你需要使用NULL值。

(7)固定长度的表会更快

如果表中的所有字段都是“固定长度”的,整个表会被认为是 “static” 或 “fixed-length”。 例如,表中没有如下类型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一个这些字段,那么这个表就不是“固定长度静态表”了,这样,MySQL 引擎会用另一种方法来处理。

固定长度的表会提高性能,因为MySQL搜寻得会更快一些,因为这些固定的长度是很容易计算下一个数据的偏移量的,所以读取的自然也会很快。而如果字段不是定长的,那么,每一次要找下一条的话,需要程序找到主键。

并且,固定长度的表也更容易被缓存和重建。不过,唯一的副作用是,固定长度的字段会浪费一些空间,因为定长的字段无论你用不用,他都是要分配那么多的空间。

 

164、SQL中LEFTJOIN的含义是__,如果 tbl__user记录了学生的姓名(name)和学号(ID),

 

tbl__score记录了学生(有的学生考试以后被开除了,没有其记录)的学号(ID)和考试成绩(score)

 

以及考试科目(subject),要想打印出各个学生姓名及对应的的各科总成绩,则可以用SQL语句__。

 

自然左外连接

 

creat database phpinterview;

user phpinterview

creat table tbl_user

(

ID int not null,

name varchar(50) not null,

primarty Key(ID)

);

 

creat table tbl_score

(

ID int not null,

score dec(6.2)not null,

subject varchar(20)not null

);

 

insert into tbl_user(ID,name)values(1.’beimu’);

insert into tbl_user(ID,name)values(2.’aihui’);

insert into tbl_score(ID,score,subject)values(1,90,’语文’);

insert into tbl_score(ID,score,subject)values(1,80,’数学’);

insert into tbl_score(ID,score,subject)values(2,86,’数学’);

insert into tbl_score(ID,score,subject)values(2,96,’语文’);

 

select A.id,sum(B.score)as sumscore

from tbl_user A left join tbl_scoreB

on A.ID=B.ID

group by A.id

 

 

165、在php中,heredoc 是一种特殊的字符串,它的结束标志必须_<<<_。除了分号以外不能有其它字符

 

 

166、执行程序段将输出__。

 

//%为取模运算,输出0

 

echo 8%(-2).””;

 

//取模 $a % $b 在$a 为负值时的结果也是负值。输出-2

 

echo ((-8)%3).””;

 

//输出2

 

echo (8%(-3)).””;

 

?>

 

例子3:

SELECT * FROM ORDER WHERE title like “good%”;

SELECT * FROM ORDER WHERE title>=”good”and name<“good”

3事务处理:保证数据完整性

列如添加和修改的同时,两者成立则都执行,一者失败都失败

mysql_query(“BEGIN”);//事务

mysql_query(“INSERT INTO customerinfo(name) VALUES(“$NAME1″)”);

mysql_query(“SELECT * FROM ‘orderinfo’WHERE customerid=”.$id”);

mysql_query(“COMMIT”);//提交 rollback

 

4.锁定表,优化事务处理:

a.我们用一个SELECT语句取出初始数据,通过一些计算,用UPDATE语句将新值更新到表中。包含有WRITE关键字的 LOCK TABLE语句可以保证在 UNOCK TABLES命令执行之前,不会有其它的访问来对inventory进行插入、更新或删除的操作

mysql_query(“LOCK TABLEcustomerinfo 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”);

5.使用连接(JOIN)来代替查询:

a.删除没有任何订单的用户:SELECT FROM orderinfo WHERE customerid NOT IN(SELECT customerid FROM orderinfo)

b.提取所有没有订单的用户:SELECT FROM orderinfo WHERE customerid NOT IN(SELECT customerid FROM orderinfo)

 

SQL面试题

例子3:

SELECT * FROM ORDER WHERE title like “good%”;

SELECT * FROM ORDER WHERE title>=”good”and name<“good”

3事务处理:保证数据完整性

列如添加和修改的同时,两者成立则都执行,一者失败都失败

mysql_query(“BEGIN”);//事务

mysql_query(“INSERT INTO customerinfo(name) VALUES(“$NAME1″)”);

mysql_query(“SELECT * FROM ‘orderinfo’WHERE customerid=”.$id”);

mysql_query(“COMMIT”);//提交 rollback

4.锁定表,优化事务处理:

a.我们用一个SELECT语句取出初始数据,通过一些计算,用UPDATE语句将新值更新到表中。包含有WRITE关键字的 LOCK TABLE语句可以保证在 UNOCK TABLES命令执行之前,不会有其它的访问来对inventory进行插入、更新或删除的操作

mysql_query(“LOCK TABLEcustomerinfo 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”);

 

5.使用连接(JOIN)来代替查询:

a.删除没有任何订单的用户:SELECT FROM orderinfo WHERE customerid NOT IN(SELECT customerid FROM orderinfo)

b.提取所有没有订单的用户:SELECT FROM orderinfo WHERE customerid NOT IN(SELECT customerid FROM orderinfo)

c.提高 b 的速度优化:SELECT FROM orderinfo LEFT JOIN orderid orderinfo.customerid=orderinfo.customerid

WHERE orderinfo.customerid IS NULL

6.使用外键,

a.把orderinfo 里的customerid 映射到orderinfo 里的 customerid ,

任何一条没有合法的customerid 的记录不会写到orderinfo 里

CREATE TABLEcustomerinfo

(customerid INT NOT NULL,

PRIMARY KEY(customerid)TYPE=INNODB;CREATE TABLEorderinfo(

orderid INT NOT NULL,

customerid INT NOT NULL,

PRIMARY KEY(customerid,orderid),

FOREING KEY(customerid )REFERENCES customerinfo(customerid)

ON DELETE CASCADE) TYPE=INNODB;

注意:”ON DELETE CASCADE”,该参数保证当customerinfo表中一条记录删除的话同时也会删除order 表中该用户的所有记录,注意使用外键要定义事物安全类型为INNODB;

7.使用联合(UNION)来代替手动创建临时表

a.创建临时表:SELECT name FROM nametest UNION SELECTusernameFROM `nametest2`

8、尽可能减少字段的长度,尽量把字段设置NOT NULL ,例如”省份,性别”,最好设置为ENUM(1)选取最适用的字段属性

, 尽可能减少定义字段的长度,尽量把字段设置NOT NULL,例如”省份,性别”,最好设置为ENUM

 

(2)使用连接(JOIN)来代替子查询:

(3)使用联合(UNION)来代替手动创建的临时表

使用外键,优化锁定表

 

php操作数据库

 

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

当然可以

 

168、PHP处理数据库的常用函数?(重点看函数的‘参数’和‘返回值’)

Mysql函数方式,mysqli方式,PDO方式

 

169、★ 取得查询结果集总数的函数是?

mysql_num_rows($result);

 

170、安全对一套程序来说至关重要,请说说在开发中应该注意哪些安全机制?

①防远程提交;②防SQL注入,对特殊代码进行过滤;③防止注册机灌水,使用验证码;

171、在程序的开发中,如何提高程序的运行效率?

①优化SQL语句,查询语句中尽量不使用select *,用哪个字段查哪个字段;少用子查询可用表连接代替;少用模糊查询;②数据表中创建索引;③对程序中经常用到的数据生成缓存;

 

172、PHP可否与其它的数据库搭配使用?

PHP与MYSQL数据库是最优搭配,当然PHP也可以去其它的数据库搭配使用,例如MSSQL等,PHP中预留了操作MSSQL的函数,只要开启就可以使用

 

 

173、★ mysql_fetch_row()和mysql_fetch_array()之间有什么区别?

mysql_fetch_row是从结果集取出1行数组,作为枚举

mysql_fetch_array是从结果集取出一行数组作为关联数组,或数字数组,两者兼得

 

 

174、如何用 PHP 和 MySQL 上传视频?

我们可以在数据库中存放视频的地址,而不需要将真正的视频数据存在数据库中。可以将视频数据存放在服务器的指定文件夹下,上传的默认大小是 2MB,但是我们也可以在 php.ini 文件中修改 max_file size 选项来改变。

 

175、说一下无限分类的原理:

用数据库建表解决,父id子id  用递归实现

在增加一个父id组合的路径字段,用一次循环也可以实现

 

176、★、使用php写一段简单查询,查出所有姓名为“张三”的内容并打印出来 面试题 z

总让大家用记事本写!!

记事本写 增删改查

表名 User

Name Tel      Content    Data

张三 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);

mysql_query(“set names ‘ GBK’”);

$result=mysql_query(“SELECT * FROM ‘user’ WHERE name=”张三””);

while($rs=mysql_fetch_array($result)){

echo $rs[“tel”].$rs[“content”].$rs[“date”];

}

 

 

177、★、写出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=”张四” “);

 

 

178、★、完成以下:

(一)创建新闻发布系统,表名为message有如下字段(3分)

id 文章 id

title 文章标题

content 文章内容

category_id 文章分类 id

hits 点击量

 

CREATE TABLE “message”(

“id”int(10)NOT NULL auto_increment,

“title”varchar(200)default NULL,

“content” text,

“category_id”int(10) NOT NULL,

“hits”int(20),

PRIMARY KEY (“id”);

)ENGINE=InnoDB DEFAULT CHARSET=utf8;

(二)同样上述新闻发布系统:表comment记录用户回复内容,字段如下

 

comment_id 回复 id

id 文章 id,关联 message 表中的id

comment_content 回复内容

现通过查询数据需要得到以下格式的文章标题列表,并按照回复数量排序,回复最高的排在最前面

文章id 文章标题 点击量 回复数量

用一个SQL 语句完成上述查询,如果文章没有回复则回复数量显示为0

 

SELECT message.id id,message.title title,

IF(message.`hits`IS NULL,0,message.`hits`)hits,

IF(comment.`id`is NULL,0,count(*))number FROM message LEFT JOIN

comment ON message.id=comment.id GROUP BY message.`id`;

 

(三)上述内容管理系统,表category保存分类信息,字段如下(3分)

category_id int (4)not null auto_increment;

category_name varchar(40) not null;

用户输入文章时,通过选择下拉菜单选定文章分类

写出如何实现这个下拉菜单

 

function categoryList(){

$result=mysql_query(“select category_id,category_name from category”)

or die(“lnvalid query:”.mysql_error());

print(“<select name=”category” value=””>/n”);

while($rowArray=mysql_fetch_array($result)){

print(“<option value =””.$rowArray[“category_id”].””>”.$rowArray[“category_name”].”</option>/n”);

}

print(“</select>”);

}

 

 

179、★根据题目要求,用PHP写出代码

表名 User

ID   Name   Tel          Content       Date

1    张三    133546677   大专毕业     2006-10-11

2    张三    133546677   大专毕业     2006-10-11

5    张四    133546677   大专毕业     2006-10-11

4    王五    133546677   大专毕业     2006-10-11

2   ……

6   ……..

假设数据库连接如下

$mysql_db=mysql_connect(“local”,”root”,”pass”);

@mysql_select_db(“DB”,$mysql_db);

(1)查询出所有Name等于“张三”的记录,并输出。

(2)按ID升序查询,只返回排序后的前3条记录,并输出。

(1)$sql=”select * from User where >$result=mysql_query($sql);

While($row=mysql_fetch_array($result,MYSQL_ASSOC)){

Echo $row[‘Name’];

}

(2)$sql=”select * from User order by ID asc limit 0,3”

$result=mysql_query($sql);

while($row=mysql_fetch_array($result,MYSQL_ASSOC)){

echo $row[‘Name’];}

 

 

 

、微信公众平台开发

180、微信运行机制

 

 

公众号与php之间用什么语言通信: Xml

 

181、Weixin.php中是如何接收公众号数据的:

$postStr = $GLOBALS[“HTTP_RAW_POST_DATA”];//接收数据  XML 数据

 

182、消息类型

   微信目前提供了7种基本消息类型,分别为:

(1)文本消息(text);

(2)图片消息(image);

(3)语音(voice)

(4)视频(video)

(5)地理位置(location);

(6)链接消息(link);

(7)事件推送(event)

类型。掌握不同的消息类型发送时的数据传递格式

 

183、将整个文件读入一个字符串的函数是 

file_get_contents( )

 

184、常用函数

把xml数据解析成对象的函数是 simplexml_load_string( )

将字符串转换为数组的函数是___ explode_________,将数组转化为字符串的函数是____implode________.

 

编码 URL 字符串的字符串是____urlencode________.

185、Sprintf函数的作用

 

 

 

 

 

 

186、微信公众号出现无法提供服务的原因?

  1. 网络原因 ,数据接口原因
  2. 代码错误,怎么推测原因

修改的哪里检查一下,如果代码没错

可以输出数据 看一下。用php操作文件

 

$myfile = fopen(“newfile.txt”, “w”);

$txt =”aaaaaaaaaa”;

fwrite($myfile, $txt);

fclose($myfile);

 

187、自定义菜单的事件推送

单击

单击跳转链接

扫码推事件

扫码推且弹出

弹出系统拍照发图的事件

弹出微信相册发图器的事件

弹出地理位置选择器的事件

188、token的作用

安全机制验证,用于微信服务器与PHP服务器之间的安全验证

189、Appid与secrect的作用

请求api接口(例如菜单的操作)时需要传appid与secrect两个值,用来获取应用的授权码

 

、其它

190、★ 对于自身掌握的技术描述:

l 以PHP+MYSQL为方向,熟练掌握smarty模板引擎、ThinkPHP框架、微信公众平台开发、DEDE、ecshop等二次开发系统,对面向对象有一定的理解;数据库方面,熟练掌握MYSQL数据库;熟悉在linux下的PHP开发

l 前端技术:熟练掌握DIV+CSS网页布局,javascript,JQuery框架、AJAX技术、photoshop图片处理

l 一年的项目开发经验,使用smarty开发过‘XXXXXXXX’,ThinkPHP开发过‘XXXXXXXX’,使用微信公众平台开发过‘就业服务网’的公众号,使用织梦系统开发过企业站等

 

191、★ 谈谈asp,php,jsp的优缺点

ASP全名Active Server Pages,是一个WEB服务器端的开发环境, 利用它可以产生和运

行动态的、交互的、高性能的WEB服务应用程序。ASP采用脚本语言VB Script(Java script

)作为自己的开发语言。

PHP是一种跨平台的服务器端的嵌入式脚本语言. 它大量地借用C,Java和Perl语言的语法,并耦合PHP自己的特性,使WEB开发者能够快速地写出动态生成页面.它支持目前绝大多数数据库。还有一点,PHP是完全免费的,不用花钱,你可以从PHP官方站点(http://www.php.net)自由下载。而且你可以不受限制地获得源码,甚至可以从中加进你自己需要的特色。

JSP 是Sun公司推出的新一代站点开发语言,他完全解决了目前ASP,PHP的一个通病--脚本级执行(据说PHP4 也已经在Zend 的支持下,实现编译运行).Sun 公司借助自己在Java 上的不凡造诣,将Java 从Java 应用程序 和 Java Applet 之外,又有新的硕果,就是Jsp--Java Server Page。Jsp 可以在Serverlet和JavaBean的支持下,完成功能强大的站点

程序。

三者都提供在 HTML 代码中混合某种程序代码、由语言引擎解释执行程序代码的能力。

但JSP代码被编译成 Servlet 并由 Java 虚拟机解释执行,这种编译操作仅在对 JSP 页面的

第一次请求时发生。在 ASP 、PHP、JSP 环境下, HTML 代码主要负责描述信息的显示样式,而程序代码则用来描述处理逻辑。普通的 HTML 页面只依赖于 Web 服务器,而 ASP 、PHP、JSP 页面需要附加的语言引擎分析和执行程序代码。程序代码的执行结果被重新嵌入到HTML 代码中,然后一起发送给浏览器。 ASP 、PHP、 JSP三者都是面向 Web 服务器的技术,客户端浏览器不需要任何附加的软件支持。

 

 

192、、谈谈asp,php,jsp的优缺点(10)分这道题挺有深度,既然我们说有经验大家可以好好的看看

ASP 全名 Active Server Pages,是一个 WEB 服务器端的开发环境, 利用它可以产生和运

行动态的、交互的、高性能的 WEB 服务应用程序。ASP 采用脚本语言 VB Script(Java script

)作为自己的开发语言。

PHP 是一种跨平台的服务器端的嵌入式脚本语言. 它大量地借用 C,Java 和 Perl 语言的语

法,并耦合 PHP 自己的特性,使 WEB 开发者能够快速地写出动态生成页面.它支持目前绝大

多数数据库。还有一点,PHP 是完全免费的,不用花钱,你可以从 PHP 官方站点

(http://www.php.net)自由下载。而且你可以不受限制地获得源码,甚至可以从中加进你自己

需要的特色。

JSP 是 Sun 公司推出的新一代站点开发语言,他完全解决了目前 ASP,PHP 的一个通病-

-脚本级执行(据说 PHP4 也已经在 Zend 的支持下,实现编译运行).Sun 公司借助自己在

Java 上的不凡造诣,将 Java 从 Java 应用程序 和 Java Applet 之外,又有新的硕果,就是

Jsp--Java ServerPage。Jsp 可以在 Serverlet 和 JavaBean 的支持下,完成功能强大的站点

程序。

三者都提供在 HTML 代码中混合某种程序代码、 由语言引擎解释执行程序代码的能力。

但 JSP 代码被编译成 Servlet 并由 Java 虚拟机解释执行,这种编译操作仅在对 JSP 页面的

第一次请求时发生。在 ASP 、PHP、JSP 环境下, HTML 代码主要负责描述信息的显示样

式, 而程序代码则用来描述处理逻辑。 普通的 HTML 页面只依赖于 Web 服务器, 而 ASP 、

PHP、JSP 页面需要附加的语言引擎分析和执行程序代码。程序代码的执行结果被重新嵌入

到 HTML 代码中,然后一起发送给浏览器。 ASP 、PHP、 JSP 三者都是面向 Web 服务器

的技术,客户端浏览器不需要任何附加的软件支持。

 

193、★、请举例说明在你的开发过程中用什么方法来加快页面的加载速度

要用到服务器资源时才能打开(如数据库),及时关闭服务器资源,

数据库添加索引,页面可生成静态,图片等大文件单独服务器。使用代码优化工具zend加速器

 

赞(0) 打赏
未经允许不得转载:王明昌博客 » 转载 | PHP面试题汇总
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏