转载

php面试题(基础部分)

一、HTML + CSS部分

1. 请说明 HTML 文档中 DTD 的意义和作用(酷讯)

DTD,文档类型定义,是一种保证 html 文档格式正确的有效方法,在解析网页时,浏

览器将使用 DTD 来检查页面的有效性(是否符合规范,元素和标签使用是否正确)并且采

取相应的措施。同时它还会影响浏览器的渲染模式(工作模式)。

2. 准确的指出以下代码的显示结果(酷讯)
<style>  a{  position:relative;  height:200px;  width:500px;  border:solid 1px #000;  background:#FFF;  }  #b,#c{position:absolute; width:250px; height:90px;}  #b{top:30px; left:50px; background:#FF0000; z-index:1;}  #c{bottom:30px; right:50px; background:#0000FF;} </style> <div class="a">  <div id="b"></div>  <div id="c"></div> </div> 

显示效果

3. 指出以下代码的显示结果(酷讯)
<table border=1 width=500 style="text-align:center;">  <tr>   <td rowspan=2 width=50% height=50>a</td>   <td width=50% eight=25>d</td>  </tr>  <tr><td width=50% height=25>b</td></tr>  <tr height=25><td colspan=2>c</td></tr> </table> 

显示效果

4. 如何产生带有数字列表符号的列表?( )

A. <ul>
B. <dl>
C. <ol>
D. <list>
答案:C

5. 如何显示没有下划线的超链接?()

A. a {text-decoration:none}

B. a {text-decoration:no underline}

C. a {underline:none}

D. a {decoration:no underline}

答案:A

6. 以下一段 XHTML 代码片段,它不符合 W3C 规范,请问出现了几处错误?
<div id="newsmore">  <ul>   <li><img src="0967_ohmyrabbit.jpg"></li>   <li>印度总理辛格访华专题</li>   <li>    <ul id="newsmore">     <li>专访辛格:早日解决边界问题是战略目标</li>     <li>辛格称北京奥运将为印度举办赛事提供灵感</li>     <li>印度总理辛格访华参观北京奥运场馆建设</li>    </ul>   </li>  </ul> </div> 

有两处,div 和 ul 有一个相同的 id 属性 newsmore,img 标签没有关闭。

7. 请描述出两点以上 XHTML 和 HTML 最显著的区别

(1).XHTML 必须强制指定文档类型 DocType,HTML 不需要

(2).XHTML 所有标签必须闭合,HTML 比较随意

(3).XHTML 严格区分大小写,所有标签的元素和属性的名字都必须使用小写

(4).XHTML 要求所有的标记都必须要有一个相应的结束标记

(5).XHTML 规定所有属性都必须有一个值,没有值的就重复本身

8. 请问,div 和 span,p 标签三者间的区别(YG)

语义化的角度 来讲:div和span标签对于它们包含的元素是没有意义的,所以div 和 span 一般是用来布局。;而p标签则是一个语义化标签,表示一个段落。

显示的角度 来讲:span 是内联的,用在一小块的内联 HTML 中,前后不断行;div 元

素是块级的,等同于其前后有断行;p 元素是块级的,前后断行,而且还要再隔一行,相当

于断两行。

9. CSS 中 class 和 id 的区别(YG)

id:每个页 ID 是唯一的不能重复。class:可以设置多个 class 为同一个值。

10. 请列举几个 meta 元素(YG)
<meta name="keywords" content=""> //向搜索引擎说明你的网页的关键词 <meta name="description" content=""> //告诉搜索引擎你的站点的主要内容 <meta name="author" content="你的姓名"> //告诉搜索引擎你的站点的制作的作者  <meta http-equiv="Content-Type" content="text/html";charset=utf-8"> //指定字符集 <meta http-equiv="refresh" content="n;url="> //定时让网页在指定的时间 n 内跳转 <meta http-equiv="expires" content="Mon,12 May 2001 00:20:00 GMT"> //可以用于设定网页的到期时间,一旦过期则必须到服务器上重新调用。需要注意的是必须使用 GMT 时间格式 <meta http-equiv="pragma" content="no-cache"> //禁用缓存 <meta http-equiv="set-cookie" content="Mon,12 May 2001 00:20:00 GMT"> //cookie 设定,如果网页过期,存盘的 cookie 将被删除。需要注意的也是必须使用 GMT 时间格式
11. 怪异模式和 XHTML 模式下 IE 的宽的区别(YG)

所谓的 标准模式 是指,浏览器按 W3C 标准解析执行代码; 怪异模式 则是使用浏览器自己的方式解析执行代码,因为不同浏览器解析执行的方式不一样,所以我们称之为怪异模式。

浏览器解析时到底使用标准模式还是怪异模式,与你网页中的 DTD 声明直接相关,DTD声明定义了标准文档的类型(标准模式解析)文档类型,会使浏览器使用相应的方式加载网页并显示,忽略 DTD 声明,将使网页进入怪异模式(quirks mode)。

在 XHTML 模式下,声明一个元素的宽度,仅仅指的是在 css 中设置的 width,而在怪异模式下,元素的宽度包括 width 和 padding。

12. 实现框架的标签,使用举例(YG)
<frameset cols="25%,50%,25%">     <frame src="frame_a.htm" />     <frame src="frame_b.htm" />     <frame src="frame_c.htm" /> </frameset>
13. 请写出以下 html 标签的含义:input form script style table b img (小米)

<input /> 标签用于搜集用户信息。根据不同的 type 属性值,输入字段拥有很多种形式。

输入字段可以是文本字段、复选框、掩码后的文本控件、单选按钮、按钮等等。

<form> 标签用于为用户输入创建 HTML 表单。表单能够包含 input 元素,比如文本字段、复选框、单选框、提交按钮等等。

<script> 标签用于定义客户端脚本,比如 JavaScript。script 元素既可以包含脚本语句,也可以通过 src 属性指向外部脚本文件。

<style> 标签用于为 HTML 文档定义样式信息。

<table> 标签定义 HTML 表格。简单的 HTML 表格由 table 元素以及一个或多个 tr、th 或 td 元素组成。

<b> 呈现粗体文本效果。

<img /> 元素向网页中嵌入一幅图像。

14. 用 css、html 编写一个两列布局的网页,右侧固定宽度 200px,左侧自适应 (小米)

方案 1:

HTML 结构:

<div id="wrap">  <div id="content">自适应区</div>  <div id="sidebar" style="width:200px;">固定宽度区</div> </div> <div id="footer">后面的一个DIV,以确保前面的定位不会导致后面的变形</div>

CSS 样式:

<style type="text/css">   #content,#sidebar,#footer{border: 1px solid #ccc;height: 100px;}   #wrap{display: table;width:100%;}   #content{display: table-cell;}   #sidebar{display: table-cell;}  </style>

方案 2:

HTML 结构:

<div id="wrap">  <div id="content" style="height:140px;">   <div id="contentb">自适应区</div>  </div>  <div id="sidebar" style="height:240px;">固定宽度区</div> </div> <div id="footer">后面的一个DIV,以确保前面的定位不会导致后面的变形</div>

CSS 样式:

<style type="text/css">  #wrap{*zoom:1;position: relative;}  #sidebar{width: 200px;float: right;border: 1px solid #ccc;}  #content{margin-left: -210px;float: left;width: 100%;}  #contentb{margin-left: 210px;border: 1px solid #ccc;}  #footer{border: 1px solid #ccc;margin-top: 10px;clear: both;} </style> 

这种方案,兼容性好,但是会产生额外的标签。

二、JavaScript部分

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

弹出对话框函数:alert(), prompt(), confirm()获得输入焦点函数:focus()

2. JS 的转向函数是?怎么引入一个外部 JS 文件?

转向使用 window.location.href = ""
引入外部 js 使用 <script src=""></script>

3. 解释下面语句的意思:document.form["formName"].submit。(百度)

获取 name 为 formName 的表单并将该表单数据提交到服务器。但这行代码是不能运行的,有两处错误,一是通过表单名称来获取表单得到时候,应该写成 document.forms[‘formName’] ,提交表单事件使用submit 方法,需要加上括号,下面给出简单的示例代码:

<form action="a.php" meathod="post" name="login" id="f1">  用户名:<input type="text" name="username"/>  <input type="button" id="btn" value="提交"/> </form> <script type="text/javascript">  document.getElementById("btn").onclick=function () {   if (document.forms['login'].username.value != '') {    document.forms['login'].submit();   }  } </script> 
4. 有下面语句: <input id="txt" type="text" value="baidu" /> 编写代码,当鼠标划过文本框,自动选中文本框中的内容。(百度)
<input id="txt" type="text" value="baidu"/> <script type="text/javascript">     var textBox = document.getElementById('txt');     textBox.onmouseover = function(){         this.select();     } </script>
5. 设计一个网页,使得打开它时弹出一个全屏的窗口,该窗口中有一个文本框和一个按钮。用户在文本框中输入信息后点击按钮就可以把窗口关闭,而输入的信息却在主网页中显示。(新浪)

主窗口:

<a href="" id="a1" target="new">新窗口</a> <div id="msg"></div> <script type="text/javascript">  var a1 = document.getElementById('a1');  a1.onclick = function () {   window.open('new.html','new','location=no,toolbar=no');   return false;  } </script>

弹出窗口:

<input type="text" name="message" id="m1"/><br /> <input type="button"value="关闭" id="btn"/><br /> <script type="text/javascript">  var btn = document.getElementById('btn');  var message = document.getElementById('m1');  btn.onclick = function(){   var div = window.opener.document.getElementById('msg');   div.innerHTML = message.value;   window.close();  } </script> 
6. 可以使用哪些方法使用 JavaScript 向服务器发出请求且不离开当前页面,简单对比各自的特点(如果存在)(酷讯)

使用 XMLHttpRequest 对象异步请求

7. 判断以下代码是否正确,如果有错,请指出错误,如果正确,请指出运行结果 (酷讯)
var arr = new Array(  new Array(1,2,3,4),  new Array("abc", "def", "xyz"), ); for(i = 0; i < arr.length; i++) {  document.write(arr[0]); } 

怀疑这个代码写错了,第二个 new array 后面的逗号是多余的,如果此处没问题,则代码是正确的,输出的结果是 1,2,3,4 1,2,3,4

:arr 是一个二维数组,该数组有两个元素,第一个元素是数组[1,2,3,4],第二个元素也是一个数组为["abc", "def", "xyz"],for 循环语句执行了两次,但都是输出第一个元素,即数组[1,2,3,4]。

[E]8. 用 JavaScript 写一个函数,其功能是可以删除数组中重复的元素。
<script type="text/javascript"> function array_unique(arr){  var result = arr;  for (var i = 0; i < arr.length; i++) {   for (var j = 0; i < arr.length; j++) {     temp = arr[i];     // 如果当前元素与后面某一个元素相等,则移除顶元素     if ((i+j+1) < arr.length && temp === arr[i+j+1]) {      result.splice(i+j+1,1);     }   }  }  return result; }  var a = [4,7,8,5,8,6,43,7,0,false,'',{}]; var b = array_unique(a);  alert(b);//4,5,8,5,6,43,0,false,[object Object] </script>
9. 以下哪条 JavaScript 语句会产生运行错误:( )

A. var obj = ( );

B. var obj = [ ];

C. var obj = { };

D. var obj = //;

答案:A

10. 请选择结果为真的表达式:( )

A. null instanceof Object

B. null === undefined

C. null == undefined

D. NaN == NaN

答案:C

11. foo 对象有 att 属性,那么获取 att 属性的值,以下哪些做法是可以的:( )

A. foo.att

B. foo("att")

C. foo["att"]

D. foo{"att"}

E. foo["a"+"t"+"t"]

答案:ACE

12. 如何添加 html 元素的事件,有几种方法,举例

(1).直接作为元素的属性,如 <img onclick="alert( 'hello' );" src="hello.jpg">
(2).使用 DOM 0 级事件,简单,兼容性好,如 img.onclick = function(){}
(3).使用 DOM 2 级事件,功能更强大,在非 IE 等标准浏览其中,使用 addEventListener,在IE 浏览器中则使用 attachEvent 来实现。

13. JavaScript 能否定义二维数组,如果不能你如何解决?

JavaScript 不支持二维数组定义,可以用 arr[0] = new array()来解决。

14. 假设 a.html 和 b.html 在同一个文件夹下面,用 JavaScript 实现当打开 a.html 五秒钟后,自动跳转到 b.html。
<script type="text/javascript">  function go2b() {   window.location.href = "b.html";   window.close();  }   setTimeout("go2b()",5000);//5秒后自动执行go2b方法 </script>
15. 请使用 JavaScript 写出三种产生一个 image 标签的方法(提示:从方法、对象、HTML角度考虑)

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

16. js 中网页前进和后退的代码

前进: history.forward(); 或者 history.go(1);
后退: history.back (); 或者 history.go(-1);

17. 请写出一条至少 3 个节点的 DOM 树 (YG)
<script type="text/javascript">  var div = document.createElement("div");  var a = document.createElement("a");  a.href = "http://www.baidu.com";  var span = document.createElement("span");  span.innerHTML = "百度";  a.appendChild(span);  div.appendChild(a);  document.body.appendChild(div); </script> 

结果 HTML:

<div><a href="http://www.baidu.com"><span>百度</span></a></div>
18. 实现点击按钮弹出窗口的代码 (YG)
document.getElementById( 'button' ).onclick = function(){ window.open ('page.html'); }

其中,button 是按钮的 id,page.html 是要弹出的窗口页面。

19. JavaScript 包括那些基本数据类型?(小米)

JavaScript 中包括 5 种基本数据类型,分别是 Number,String,Boolean,Null 和 Undefined。

三、PHP语言基础

1. strlen( )与 mb_strlen( )的作用分别是什么(新浪网技术部)

strlen和mb_strlen都是用于获取字符串长度。

strlen只针对单字节编码字符,也就是说它计算的是字符串的总字节数。如果是多字节编码,如 gbk 和 utf-8,使用 strlen 得到是该字符的总字节数;

可以使用mb_strlen获取其字符个数,使用mb_strlen 要注意两点,一是要开启 mbstring 扩展,二是要指定字符集。

总结:

  • strlen函数不管是字符串是单字节编码还是多字节编码,函数返回的结果都是字符串的总字节数。
  • mb_strlen函数当字符串是单字节编码时,函数返回的结果是字符串的总字节数。当字符串是多字节编码时,函数返回的结果是字符串的个数。
    mb_strlen函数在没有指定字符编码时,表示使用默认字符编码,即单字节编码,函数返回的是字符串的总字节数。
  • PHP默认是单字节编码(内部字符编码),多字节编码方式有gbk、utf-8等。

示例:

<?php  /*   strlen( )与 mb_strlen( )的作用分别是什么(新浪网技术部)  */  header('Content-Type:text/html;charset=utf-8');  // (1)英文字符串  $str1 ="duang~";  echo strlen($str1);//总字节数为6,内部字符编码,单字节编码  echo "<br />";  echo mb_strlen($str1);//总字节数为6,内部字符编码  echo "<br />";  echo mb_strlen($str1,'utf-8');//总字节数或字符长度为6,指定字符编码(utf-8),多字节编码  echo "<hr />";   // (2)中文字符串  $str2 = "你是我的小苹果";  echo strlen($str2);//总字节数为21,内部字符编码,单字节编码  echo "<br />";  echo mb_strlen($str2);//总字节数为21,内部字符编码  echo "<br />";  echo mb_strlen($str2,'utf-8');//字符长度为7,指定字符编码(utf-8),多字节编码 ?>
相关题目 1:实现中文字串截取无乱码的方法。

方法一,使用 php 内置函数 mb_substr()方法二,自定义函数,以 utf-8 为例,如下:

<?php  /*   相关题目 1:实现中文字串截取无乱码的方法。  */  header('Content-Type:text/html;charset=utf-8');   //=================方法一=======================  $str = "你是我的温暖阳光";  echo mb_substr($str, 2,4,'utf-8');//输出 我的温暖   // ================方法二=======================  /**   * utf8编码字符串截取无乱码   * @param $str string 要处理的字符串   * @param $start int 从哪个位置开始截取   * @param $length int 要截取字符的个数   * @return string 截取后得到的字符串  */  function substr_utf8($str,$start,$length = null)  {   $sep = "";   $arr = array_slice(preg_split("//u", $str,-1,PREG_SPLIT_NO_EMPTY), $start,$length);   return join($sep,$arr);  }  // 示例  $str = "你是我的温暖阳光";  echo substr_utf8($str,2,4);//输出 我的温暖 ?>
相关题目2:如何求解字符串“中国2北333京”的字符数(一个中文一个字符),并找到第四个字符“北”

方法一,使用php内置函数,确保配置中已打开mbstring扩展方法二,自定义函数实现求其长度,截取使用上面定义的substr_utf8

<?php  /*   相关题目 2:如何求解字符串“中国2北333京”的字符数(一个中文一个字符),并找到第四个字符“北”  */  header('Content-Type:text/html;charset=utf-8');   //=================方法一=======================  $str = "中国2北333京";  echo mb_strlen($str,'utf-8');//输出字符数 8  echo mb_substr($str, 3,1,'utf-8');//输出 北   // ================方法二=======================  /**   * utf8编码字符串截取无乱码   * @param $str string 要处理的字符串   * @param $start int 从哪个位置开始截取   * @param $length int 要截取字符的个数   * @return string 截取后得到的字符串  */  function substr_utf8($str,$start,$length = null)  {   $sep = "";   $arr = array_slice(preg_split("//u", $str,-1,PREG_SPLIT_NO_EMPTY), $start,$length);   return join($sep,$arr);  }   /**   * utf8编码字符串计算长度   * @param $str string 要处理的字符串   * @return int 字符串的长度或字符个数  */   function strlen_utf8($str)  {   return count(preg_split("//u", $str,-1,PREG_SPLIT_NO_EMPTY));  }   // 示例  $str = "中国2北333京";  echo strlen_utf8($str);//输出字符数 8  echo substr_utf8($str,3,1);//输出 北 ?>
2. 下列哪个函数是用正则表达式将字符串分割到数组中 ( )

A. split

B. implode

C. explode

D. join

答案:A

3. 写出下列程序的输出结果(新浪网技术部)
<?php  /*   写出下列程序的输出结果(新浪网技术部)  */  $x = 87;  $y = ($x % 7) * 16;  $z = $x > $y ? 1 : 0;  echo $z; ?>

答案:1

4. 写出下列几个预定义全局变量的作用 (新浪网技术部)
$_SERVER['DOCUMENT_ROOT']//当前运行脚本所在的文档根目录 $_SERVER['HTTP_HOST ']//当前请求的 Host: 头部的内容 $_SERVER['REMOTE_ADDR']//正在浏览当前页面用户的 IP 地址 $_SERVER['HTTP_REFERER']//链接到当前页面的前一页面的 URL 地址 $_SERVER['SERVER_NAME']//当前运行脚本所在服务器主机的名称 $_FILES //包含有所有上传的文件信息 S_FILES['userfile']['name']//客户端机器文件的原名称 $_FILES['userfile']['type']//文件 MIME 类型,如果浏览器提供此信息的话,如“image/gif”。 $_FILES['userfile']['size']//已上传文件的大小,单位为字节 $_FILES['userfile']['tmp_name']//文件被上传后在服务端储存的临时文件名 $_FILES['userfile']['error']//和该文件上传相关的错误代码
5. include 和 require 都能把另外一个文件包含到当前文件中,他们有什么区别?Include 和include_once 又有什么区别?(新浪网技术部)

二者区别只有一个,那就是对包含文件的需求程度。include 就是包含,如果被包含的文件不存在的话,那么则会提示一个错误,但是程序会继续执行下去。而 require 意思是需要,如果被包含文件不存在或者无法打开的时候,则会提示错误,并且会终止程序的执行。

这两种结构除了在如何处理失败之外完全一样。

once 的意思是一次,那么 include_once 和 require_once 表示只包含一次,避免重复包含。

相关题目 1:What is the difference between include & include_once? include & require?(Yahoo)
相关题目 2:语句 include 和 require 都能把另外一个文件包含到当前文件中,它们的区
别是_ ;为了避免多次包含同一文件,可以用语句

来代替它们。

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

once()/include_once()
相关题目 3:What functions can you use to add library code to the currently running script?(Yahoo)

include、require

6. 用最少的代码写一个求 3 值最大值的函数. (51.com 笔试题)
<?php  /*   6. 用最少的代码写一个求 3 值最大值的函数. (51.com 笔试题)  */  // 定义函数  function maxnum($a,$b,$c)  {   return $a > $b ? ($a > $c ? $a : $c) : ($b > $c ? $b : $c);  }   // 调用实例  echo maxnum(24,15,8); ?>
7. 简述 POST 和 GET 传输的最大容量分别是多少? (51.com 笔试题)

POST 根据你 php.ini 文件配置(默认是 8M)GET 的话大小限制在 2KB

相关题目:表单中 get 与 post 提交方法的区别?

get 是发送请求 HTTP 协议通过 url 参数传递进行接收,而 post 是实体数据,可以通过表单提交大量信息。

8. 有三个 php 文件位于同一目录下,内容如下所示。使用浏览器访问 c.php,请问是否存在问题。如果存在问题,请指出修正方法并写出浏览器查看效果 ,如果不存在问题,请写出浏览器查看效果(酷讯 PHP 工程师笔试题)

A.php:

<?php     function fa(){         echo "in Function A/n";     } ?>

B.php:

<?php  include 'a.php';  function fb() {   fa();   echo "in Function B/n";  } ?> 

C.php:

<?php     include 'a.php';     include 'b.php';     fa();     fb(); ?>

答案:存在问题,a.php 被包含了两次,导致 fa()函数重复定义,使用 include_once 避免重复包含。

9. echo(),print(),print_r()的区别?(新浪)

echo, print是PHP语句print_r是函数,语句没有返回值,函数可以有返回值(即便没有用)

print只能打印出简单类型变量的值(如int,string)

print_r可以打印出复杂类型变量的值(如数组,对象)

echo -- 输出一个或者多个字符串

print --输出一个字符串

print_r -- 打印关于变量的易于理解的信息。

在实际使用中, print 和 echo 两者的功能几乎是完全一样。

可以这么说,凡是有一个可以使用的地方,另一个也可以使用。但是,两者之间也还是一个非常重要的区别:

在 echo 函数中,可以同时输出多个字符串,而在 print 函数中则只可以同时输出一个字符串。同时,echo函数并不需要圆括号,所以echo函数更像是语句而不像是函数。

echo 和 print 都不是函数,而是语言结构,所以圆括号都不是必需的。他们的区别在于:

(1) echo可以输出多个字符串,像下面这样:

echo 'a','b','c';

如果你非要加上圆括号,注意写成echo ('a','b','c');是错误的,应该写成:

echo ('a'),('b'),('c');

它没有像函数的行为,所以不能用于函数的上下文

(2) print只能输出一个字符串,它可以表现得像一个函数,比如你可以如下使用:

$ret = print 'Hello World';

(有返回值所以能够用在更复杂的表达式中,可以判断是否输出成功等表达式)所以它能用在更复杂的表达式中。

另外,echo的效率相对比较快~

如下代码:

<?php  $a='hello ';  $b='php world!';  echo $a,$b.'<br />';//echo 可以用逗号分隔字符串变量来显示  print $a.$b.'<br />';//而print不能使用逗号,只能用点号分隔  print $a,$b.'<br />';//使用逗号时报错。 ?> 

说明

  1. , 是 echo 本身支持的一种语法,而 . 则是字符串连接操作符,使用 , 的效率要高一些。(少了连接运算)
  2. echo可以使用 , 来分隔字符串变量,也可以使用 , 来分隔字符串变量;print只能使用 . 来分隔字符串变量。
  3. echo效率比print高

总结:

echo命令和print命令相同,没有区别

echo()和print()有区别:

echo()没有返回值,与echo命令相同

print()有返回值,总是返回1

补充:printf()和sprintf()类似,均为格式化输出,不同的是前者输出到标准输出,后者输出到变量

相关题目:What is the difference between "print()" and "echo( )"? (腾讯)

answer: print is a function,echo is a language construct

10. 用 PHP 打印出前一天的时间格式是 2006-5-10 22:21:21。
<?php  /*   用 PHP 打印出前一天的时间格式是 2006-5-10 22:21:21。  */  // ================方法一==================  echo date("Y-m-d H:i:s",time() - 3600*24);  echo "<br />";  // ================方法二==================  echo date("Y-m-d H:i:s",strtotime("-1 day"));  echo "<br />";   // 将表单中提交的时间字符串"2015-6-23"转成时间戳  $date = strtotime("2015-6-23");  echo $date; ?>

说明:

  • 使用strtotime可以将任何字符串的时间表示(now,seconds,day,week等)转换成时间戳,仅针对英文。
  • 在实际开发的时候,strtotime非常有用,因为对于表单来说,提交的数据都是字符串。比如,“2013-4-27”需要将其转换成时间戳然后存到数据库中。
相关题目:求两个日期的差数,例如 2009-3-1 ~ 2009-4-4 的日期差数

(strtotime("2009-4-4")-strtotime("2009-3-1"))/3600*24

11. 不使用第三个变量交换两个变量的值
<?php  /*   不使用第三个变量交换两个变量的值  */  // ================方法一==================  $a = "PHP";  $b = "MySQL";  echo '$a='.$a.'<br />';  echo '$b='.$b.'<br />';   list($a,$b) = array($b,$a);   echo '$a='.$a.'<br />';  echo '$b='.$b.'<br />';   echo "<hr />";  // ================方法二==================  $a = "PHP";  $b = "MySQL";  echo '$a='.$a.'<br />';  echo '$b='.$b.'<br />';   $a = $a.'&'.$b;//使用&连接两个字符串   // 根据&进行字符串分割  $b = explode('&', $a);  $a = $b[1];  $b = $b[0];   echo '$a='.$a.'<br />';  echo '$b='.$b.'<br />'; ?>
  1. 请说明 php 中传值与传引用的区别。什么时候传值什么时候传引用?

    变量默认总是传值赋值。

    那也就是说,当将一个表达式的值赋予一个变量时,整个原始表达式的值被赋值到目标变量。这意味着,例如,当一个变量的值赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量。

    PHP 也提供了另外一种方式给变量赋值:引用赋值。

    这意味着新的变量简单的引用(换言之,“成为其别名” 或者 “指向”)了原始变量。改动新的变量将影响到原始变量,反之亦然。使用引用赋值,简单地将一个 & 符号加到将要赋值的变量前(源变量)。

    对象默认是传引用。

    对于较大的数据,传引用比较好,这样可以节省内存的开销。

相关题目 1:What would the following code print to the browser? Why?
<?php  $num = 10;  function multipy($num){   $num = $num +10;  }  multipy($num);  echo $num; ?> 

输出 10

相关题目 2:What is the difference between a reference and a regular variable? How do you pass by reference & why would you want to?(Yahoo)

reference 传送的是变量的地址而非它的值,所以在函数中改变一个变量的值时,整个应用都见到这个变量的新值。一个 regular variable 传送给函数的是它的值,当函数改变这个变量的值时,只有这个函数才见到新值,应用的其他部分仍然见到旧值。

13. 将 1234567890 转换成 1,234,567,890 每 3 位用逗号隔开的形式。(百度)
<?php  $str ='1234567890';  function str($str)  {   // 反转字符串,得到0987654321   $str = strrev($str);   // 使用逗号分割字符串,得到098,765,432,1,   $str = chunk_split($str,3,',');    // 再次反转字符串,得到,1,234,567,890   $str = strrev($str);   // 去掉左边的",",得到1,234,567,890   $str = ltrim($str,',');   return $str;  }  echo str($str); ?>
相关题目 1:如何实现字符串翻转?

strrev(),不过这种方法都不能解决中文字符串翻转的问题,会出错的。

<?php  header("Content-Type:text/html;charset=utf-8");   /**   * 反转utf8编码的中文字符串   * @param string $str   * @return string  */  function strrev_utf8($str)  {   return join("",array_reverse(preg_split("//u", $str)));  }   // 实例  $str = "悄悄是别离的笙箫";  echo strrev_utf8($str); ?>
相关题目 2:假设现在有一个字符串 www.baidu.com 如何使用 PHP 对它进行操作使字符串以 moc.udiab.输出? (亿邮)
<?php  $str = "www.baidu.com";  echo strrev(str_replace('www','',$str)); ?>
14. 用 PHP 写出显示客户端 IP 与服务器 IP 的代码。

客户端 IP: $_SERVER["REMOTE_ADDR"]
服务器端 IP: $_SERVER["SERVER_ADDR"]

15. 简述如何得到当前执行脚本路径,包括所得到参数。

获取当前执行脚本路径使用 $_SERVER["SCRIPT_FILENAME"]__FILE__
获取参数,使用 $_SERVER["QUERY_STRING"]

16. What is the difference between foo() & @foo()?(Yahoo)

foo() 会执行这个函式,任何解译错误、语法错误、执行错误都会在页面上显示出来。

@foo() 在执行这个函式时,会隐藏所有上述的错误讯息。

很多应用程序都使用 @mysql_connect() 和 @mysql_query 来隐藏 mysql 的错误信息,这是不对的,因为错误不该被隐藏,你必须妥善处理它们,可能的话解决它们。

17. 下面哪个选项没有将 john 添加到 users 数组中? ( 百度 )

A. $users[ ] = "john";

B. array_add($users, "john");

C. array_push($users, "john");

D. $users ||= "john" ;

答案:BD

18. 检测一个变量是否有设置的函数?是否为空的函数是?

isset 检测一个变量是否设置

empty 检测是否为空

注意二者的区别,如果 变量 是非空或非零的值,则 empty() 返回 FALSE。换句话说,""、0、"0"、NULL、FALSE、array() 以及没有任何属性的对象都将被认为是空的。

isset是检测变量是否设置/定义,empty是检测已定义的变量的值是否为空。

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

当前脚本名称:$ SERVER["PHP_SELF"]或者 $ SERVER["SCRIPT_NAME"];

链接到当前页面的前一页面的 URL 地址:$_SERVER["HTTP_REFERER"]。

20. sort()、assort()、和 ksort() 有什么分别?它们分别在什么情况下使用?

sort(),根据数组中元素的值,以英文字母顺序排序,索引键会由 0 到 n-1 重新编号。主要是当数组索引键的值无关紧要时用来把数组排序。

assort(),PHP 没有 assort() 函式,所以可能是 asort() 的笔误。

asort(),对数组进行排序,数组的索引保持和单元的关联。主要用于对那些单元顺序很重要的结合数组进行排序。

ksort(),根据数组中索引键的值,以英文字母顺序排序,特别适合用于希望把索引键排序的关联数组。

21. 在 PHP 中 error_reporting 这个函数有什么作用?

打开或者关闭错误报告,如:

error_reporting(0);

error_reporting(E_ALL & ~ E_NOTICE);

error_reporting(E_ALL);

相关题目:error_reporting(2047) 什么作用?(新浪)

2047 = 1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 + 256 + 512 + 1024

其中:

1 对应 E_ERROR,2 对应 E_WARNING,4 对应 E_PARSE,

8 对应 E_NOTICE,16 对应 E_CORE_ERROR,32 对应 E_CORE_WARNING

,64 对应 E_COMPILE_ERROR,128对应 E_COMPILE_WARNING,256 对应 E_USER_ERROR,

512 对应 E_USER_WARNING,1024 对应 E_USER_NOTICE。

error_reporting(2047)意味着上述错误都会显示出来。

  1. 写出以下程序的输出结果 (CBSI)

    <?php  $str = 'cd';  $$str = 'hotdog';//$cd = 'hotdog';  $$str .= 'ok';//$cd .= 'ok';  echo $cd; ?>

    hotdogok

相关题目:什么是可变变量?

获取一个普通变量的值作为这个可变变量的变量名。

23. 常量如何定义? 如何检测一个常量是否被定义?

定义常量:define()

检测常量是否定义:defined()

如:

define("TEST","happy new year!"); if( defined("TEST")){  echo TEST; }
  1. 执行程序段 <?php echo 8%(-2) ?> 将输出

    %为取模运算,输出 0

    $a % $b 其结果的正负取决于 $a 的符号。

echo ((-8)%3)."<br />";//输出 -2
echo (8%(-3))."<br />";//输出 2

25. 数组函数 arsort 的作用是_ ;语句 error reporting(2047)的作用是 __。

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

error_reporting(2047)的作用 report All errors and warnings,见 21 题中相关题目。

26. 以 Apache 模块的方式安装 PHP,在文件 http.conf 中首先要用语句_ 动态装载 PHP模块,然后再用语句

使得 Apache 把所有扩展名为 php 的文件都作为 PHP 脚本处理。

LoadModule php5

module "c:/php/php5apache2.dll";

AddType application/x-httpd-php .php

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

设为 on.

allow

call_time_pass_reference :是否启用在函数调用时强制参数被按照引用传递,默认关闭。
28. 在 PHP 中,heredoc 是一种特殊的字符串,它的结束标志必须____顶格写,并且不能包含任何其它字符除";"
29. echo count("abc") ; 输出什么?(新浪?)

输出 1

count :计算数组中的单元数目或对象中的属性个数,通常是一个 array,任何其它类型都只有一个单元。

对于对象,如果安装了 SPL,可以通过实现 Countable 接口来调用 count()。该接口只有一个方法 count(),此方法返回 count() 函数的返回值。

如果 var 不是数组类型或者实现了 Countable 接口的对象,将返回 1,有一个例外,如果 var 是 NULL 则结果是 0。

相关题目:What will be the output of the following PHP code:(腾讯)
<?php  echo count(strlen("http://php.net")); ?>

answer: 1

30. 写个函数用来对二维数组排序(新浪)
<?php  /**   * 根据某列对二维数组进行排序   * @param $arr array 要排序的二维数组   * @param $row string 排序依据的某列   * @param $type string asc表示正序,为默认值;desc表示逆序   * @param array 返回排序后的二维数组  */  function array_sort($arr,$row,$type ='asc')  {   $arr_temp = array();   // 将排序依据作为数组的键名   foreach ($arr as $v) {    $arr_temp[$v[$row]] = $v;   }   // print_r($arr_temp);    // 按照键名对二维数组进行排序,并保持索引关系   if ($type == 'asc') {    ksort($arr_temp);   } elseif($type == 'desc') {    krsort($arr_temp);   }    // 返回排序结果   return $arr_temp;  }   // 实例  $person = array(   array('id'=>2,'name'=>'zhangsan','age'=>23),   array('id'=>5,'name'=>'lisi','age'=>28),   array('id'=>3,'name'=>'apple','age'=>17)  );  echo "<pre>before:<br />";  print_r($person);  echo "</pre>";   echo "<hr />";   $person2 = array_sort($person,'name');  echo "<pre>after:<br />";  print_r($person2);  echo "</pre>"; ?>
31. 写 5 个不同的自己的函数,来获取一个全路径的文件的扩展名,允许封装 php 库中已有的函数。(新浪)
<?php  /*   写 5 个不同的自己的函数,来获取一个全路径的文件的扩展名,允许封装 php 库中已有的函数。(新浪)  */  // 方法一  function ext_name1($path){   $path_info = strrchr($path, '.');//.php   return ltrim($path_info,'.');  }   // 方法二  function ext_name2($path){   $path_info = substr($path,strrpos($path, '.'));   return ltrim($path_info,'.');  }   // 方法三  function ext_name3($path){   $path_info = pathinfo($path);   return $path_info['extension'];  }   // 方法四  function ext_name4($path){   $arr = explode('.', $path);   return $arr[count($arr)-1];  }   // 方法五  function ext_name5($path){   $pattern = '/^[^/.]+/.([/w]+)$/';   return preg_replace($pattern, '${1}', basename($path));  }   // 实例  $path = str_replace('//', '/', __FILE__);  echo "$path<br />";  echo ext_name1($path);echo "<br />";  echo ext_name2($path);echo "<br />";  echo ext_name3($path);echo "<br />";  echo ext_name4($path);echo "<br />";  echo ext_name5($path);echo "<br />"; ?>
32. PHP 的意思,它能干些什么?

PHP( Hypertext Preprocessor,超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML 中,尤其适合 web 开发。

PHP 主要是用于服务端的脚本程序,因此可以用 PHP 来完成任何其它的 CGI 程序能够完成的工作,例如收集表单数据,生成动态网页,或者发送/接收Cookies。但 PHP 的功能远不局限于此。

PHP 脚本主要用于以下三个领域:

  • 服务端脚本。这是 PHP 最传统,也是最主要的目标领域。
  • 命令行脚本。可以编写一段 PHP 脚本,并且不需要任何服务器或者浏览器来运行它。通过这种方式,仅仅只需要 PHP 解析器来执行。
  • 编写桌面应用程序。
33. Name a few ways to output (print) a block of HTML code in PHP?(Yahoo)

你可以使用 PHP 中任何一种输出语句,包括 echo、print、printf,大部分人都使用如下例的 echo:

echo "My string $variable";

你也可以使用这种方法:

echo <<<END This text is written to the screen as output and this $variable is parsed too. If you wanted you can have <span> HTML tags in here as well.</span> The END; remarks must be on a line of itsown, and can't contain any extra white space. END;
34. 写出以下程序的输出结果 (CBSI)
<?php  $b = 201;  $c = 40;  $a = $b > $c ? 4 : 5;  echo $a; ?>

输出结果为 4

  1. $arr = array('james', 'tom', 'symfony');

    $arr = array('james', 'tom', 'symfony'); 请打印出第一个元素的值,并请将数组的值用','号分隔并合并成字串输出。

    echo $arr[0];

    以’,’合并成字符串: echo implode(',',$arr);

36. $a = 'abcdef'; 请取出$a 的值并打印出第一个字母

echo $a{0} 或 echo $a[0]

相关题目:$string="abcdefg",那么$string{4}的值是? (卓望)

值是 e

37. What does === do? What's an example of something that will give true for '==', but not'==='? (Yahoo)

=== 表示全等,是指的两个变量的值和类型都相等。如 if (strpos('abc','a') == false) 和 if (strpos('abc','a') === false)

38. Which of the following snippets prints a representation of 42 with two decimal places?(腾讯)

A. printf("%.2d/n", 42);

B. printf("%1.2f/n", 42);

C. printf("%1.2u/n", 42);

answer:B

39. Given $text = 'Content-TypeType:text/xml'; Which of the following prints 'text/xml'? (腾讯)

A. print substr($text, strchr($text, ':'));

B. print substr($text, strchr($text, ':') + 1);

C. print substr($text, strpos($text, ':') + 1);

D. print substr($text, strpos($text, ':') + 2);

E. print substr($text, 0, strchr($text, ':'));

answer:C

分析:

<?php  $text = 'Content-Type:text/xml';  print substr($text, strchr($text,':'));//出错,strchr返回的是字符串  echo "<br />";  print substr($text, strchr($text,':')+1);//strchr返回的是字符串,字符串+1,返回ontent-Type:text/xml  echo "<br />";  print substr($text, strpos($text,':')+1);//返回text/xml  echo "<br />";  print substr($text, strpos($text,':')+2);//返回ext/xml  echo "<br />";  print substr($text, 0,strchr($text,':'));//出错,strchr返回的是字符串  echo "<br />"; ?> 
40. What is the value of $a?
<?php  $a = in_array('01',array('1')) == var_dump('01' == 1); ?>

A. True

B. False

answer:A

41. What is the value of $result in the following PHP code? (腾讯)
<?php  function timesTwo($int)  {   $int = $int * 2;  }  $int = 2;  $result = timesTwo($int); ?>

answer: NULL

42. What is the best all-purpose way of comparing two strings? (腾讯)

A. Using the strpos function

B. Using the == operator

C. Using strcasecmp()

D. Using strcmp()

answer:C

43. 运行以下程序,$a 的值是多少?
<?php  /*   运行以下程序,$a 的值是多少?  */  $a = "hello";  $b = &$a;  unset($b);  $b = "world";  echo $a,$b; ?>

answer:hello

44. 运行以下程序,$b 的值是多少?
<?php  /*   运行以下程序,$b的值是多少?  */  $a = 1;  $b = $a++;  echo $a,$b; ?>

answer:1

45. 运行以下程序,$x 的值是多少?
<?php  /*   运行以下程序,$x 的值是多少?  */  $array = array();  $x = empty($array);  echo $x ? "true":"false"; ?>

answer:ture

46. 将字符 09 转换成十进制数字。(百度)

使用 intval 函数,echo intval("09"),或者使用 int 强制类型转换。

47. 请 写 一 个 函 数 , 实 现 以 下 功 能 : 字 符 串 "open_door" 转 换 成 "OpenDoor" 、"make_by_id" 转换成 "MakeById"。
<?php  /**   * 字符串转换,如open_door->OpenDoor,make_by_id->MakeById   * @param $str string 要转换的字符串   * @return string 转换后的字符串  */  function change_str($str){   $arr = explode('_',$str);//将以“_”间隔的字符串拆分成数组的单元   $arr = array_map('ucfirst', $arr);//每个数组单元的首个字符大写   return implode('', $arr);//将数组单元合并输出字符串  }   // 实例  $str1 = 'open_door';  $str2 = 'make_by_id';  echo change_str($str1);//OpenDoor  echo change_str($str2);//MakeById ?>
48. 要求写一段程序,实现以下数组$arr1 转换成数组$arr2:
<?php  $arr1 = array(   '0' => array('fid' => 1,'tid' =>1,'name' => 'Name1'),   '1' => array('fid' => 1,'tid' =>2,'name' => 'Name2'),   '2' => array('fid' => 1,'tid' =>5,'name' => 'Name3'),   '3' => array('fid' => 1,'tid' =>7,'name' => 'Name4'),   '4' => array('fid' => 3,'tid' =>9,'name' => 'Name5')  );   // =======================================================  $arr_tmp = array();  $arr2 = array();   foreach ($arr1 as $v) {   // 方法一   $arr_tmp[$v['fid']][] = array_slice($v, 1);   // 方法二   /*    $arr_tmp[$v['fid']][] = array(     'tid' => $v['tid'],     'name' => $v['name']    )   */  }   foreach ($arr_tmp as $v) {   $arr2[] = $v;  }  print_r($arr1);  print_r($arr2); ?>
49. 如何将一个数组元素的排列顺序反转过来(例如以下代码反转以后的顺序是: array ('d','c', 'b', 'a'))? (选择 2 个答案)
<?php  $array = array ('a', 'b', 'c', 'd'); ?>

A. array_flip()

B. array_reverse()

C. sort()

D. rsort()

答案:BD

50. $val = max('string', array(2, 5, 7), 42);$val 值为

array(2,5,7)max 用法示例如下:

<?php  echo max(1,3,5,6,7);//7  echo "<br />";   echo max(array(2,4,5));//5  echo "<br />";   echo max(0,'hello');//0  echo "<br />";   echo max('hello','0');//hello  echo "<br />";   echo max(-1,'hello');//hello  echo "<br />";   //对于多个数组,max从左向右比较  //因此在本例中:2 == 2,但是4 < 5  $val = max(array(2,4,8),array(2,5,7));//array(2,5,7)  var_dump($val);  echo "<br />";   // 如果同时给出数组和非数组作为参数,则总是将数组视为最大值返回  $val = max('string', array(2, 5, 7), 42);  var_dump($val); ?>
51. 定义常量 MYPI=3.14_________________________;

define("MYPI",3.14);

52. 简述单引号和双引号的用法

双引号串中的内容可以被解释而且替换,而单引号串中的内容总被认为是普通字符。

53. Switch 完整语法和注意事项

使用 Switch 语句可以避免冗长的 if..elseif..else 代码块,case只能处理整数,或者能像整数一样运算的类型,比如char,使用时case 后用'',注意 break不能少,default是为了处理一些之前没有包含到的情况,这样更为安全。

54. 用 PHP 编写代码在页面输出当前的北京时间,格式为 “2007-01-18 09:22:03”

date_default_timezone_set('PRC');echo date("Y-m-d H:i:s",time());

55. 简述 GBK、GB2312、BIG5 、GB18030

GB2312 支持的汉字较少,GBK 是相比 GB2312 汉字更为丰富,包括全部中日韩汉字,GB18030 相比 GBK 增加了一些少数名族汉字汉字库更为多样,但是常人很难用到,一般简体中文使用 GBK 而繁体中文使用 BIG5。

56. 计算某段字符串中某个字符出现的次数(例如 : gdfgfdgd59gmkblg 中 g 的次数)
$text = 'gdfgfdgd59gmkblg'; echo substr_count ( $text,'g');
57. 以下语句可能存在错误,如果存在错误请指出什么错误(每个语句单独考虑)

print_r $val = 333; // error,print_r 是一个函数,需加上括号,如果是 print 则可以

print_r($val = 333); // 正确

$a += ($b = 4) + 5; // notice,$a 未定义,但可以正确运行

$foo[bar] = 'enemy'; // notice,最好 bar 加上引号

function x($a = "1", $b){} // 无,但给参数默认值应尽量从右向左

58. 写出如下程序的输出结果(小米)
<?php  header("Content-type:text/html;charset=utf-8");   $str1 = null;  $str2 = false;  echo $str1 == $str2 ? '相等' : '不相等';//相等   $str3 = '';  $str4 = 0;  echo $str3 == $str4 ? '相等' : '不相等';//相等   $str5 = 0;  $str6 = '0';  echo $str1 === $str2 ? '相等' : '不相等';//相等  ?>
59. 写出如下程序的输出结果
<?php  $a1 = null;  $a2 = false;  $a3 = 0;  $a4 = '';  $a5 = '0';  $a6 = 'null';  $a7 = array();  $a8 = array(array());   echo empty($a1) ? 'true' : 'false';//ture  echo '<br />';  echo empty($a2) ? 'true' : 'false';//ture  echo '<br />';  echo empty($a3) ? 'true' : 'false';//ture  echo '<br />';  echo empty($a4) ? 'true' : 'false';//ture  echo '<br />';  echo empty($a5) ? 'true' : 'false';//ture  echo '<br />';  echo empty($a6) ? 'true' : 'false';//false  echo '<br />';  echo empty($a7) ? 'true' : 'false';//ture  echo '<br />';  echo empty($a8) ? 'true' : 'false';//false ?>
60. 写出如下程序的输出结果
<?php  $test = 'aaaa';  $abc = &$test;  unset($test);  echo $abc; ?>

aaaa

61. 写出如下程序的输出结果
<?php  $count = 5;  function get_count()  {   static $count = 0;   return $count++;  }  echo $count;//5  ++$count;//6  echo get_count();//0  echo get_count();//1  ?>

501

分析:在 PHP 中,作用域是不重叠的,函数之外的是全局变量,函数内部定义的则是局部变量,二者是两个不同的变量,除非在函数内使用 global 显式声明使用全局变量或直接用$_GLOBALS 来引用。

62. 写出如下程序的输出结果
<?php  $GLOBALS['var1'] = 5;  $var2 = 1;   function get_value()  {   global $var2;   $var1 = 0;   return $var2++;  }   get_value();  echo $var1;//5  echo $var2;//2 ?>

52

63. 写出如下程序的输出结果
<?php  function get_arr()  {   unset($arr[0]);  }   $arr1 = array(1,2);  $arr2 = array(1,2);   get_arr(&$arr1);  get_arr($arr2);   echo count($arr1);//1  echo count($arr2);//2  ?>

12

64. $arr = array('james', 'tom', 'symfony'); 请将’jack’添加到$arr 数组的开头,并把 jack 打印出来。
array_unshift($arr,’jack’); echo $arr[0];
65. $arr = array('james', 'tom', 'symfony');请将$arr 数组的值用 ’,’分割并合并成字符串输出?

echo implode(‘,’,$arr);

66. $str = ‘jack,james,tom,symfony’; 请将$str 用’,’分割,并把分割后的值放到$arr 数组中?

$arr = explode(‘,’,$str);

67. $arr = array(3,7,2,1,’d’,’abc’);请将$arr 按照从大到小的顺序排序,并保持其键值不变?
arsort($arr); print_r($arr);
68. $mail = “”; 请将此邮箱的域(163.com)取出来并打印,看最多能写出几种方法?
echo strstr($mail,'163'); echo substr($mail,7); echo substr($mail, strpos($mail, '@')+1);  $arr = explode("@",$mail); echo $arr[1];
69. PHP 中的注释的写法,要列出三种?

// 注释内容 C 风格的单行注释

# 注释内容 unix 风格的单行注释

/* 注释内容 */ C 风格的多行注释

70. 如何在一个 php 函数中使用具有全局属性的变量,说出两种方式?

global $a 或者 $GLOBALS['a']

71. 若$aa='aa';则 print('aa is /'aa/''."")会输出什么?

aa is 'aa'

72. 如何把$a = ‘123’转化成 123,列出两种方式?
<?php  $a = '123';  $a = (int)$a;  //第一种方式  $a = intval($a); //第二种方式  settype($a,'int'); //第三种方式  ?>
相关题目:字符串怎么转成整数,有几种方法?怎么实现?
  1. 强制类型转换: (整型)字符串变量名;
  2. 直接转换:settype(字符串变量,整型);
  3. intval(字符串变量);
73. 说说 break 和 continue 可以用在哪些语句里,并且列出二者的区别?

break 和 continue 可以用在 switch 语句中,或是循环结构中它们的区别主要是体现在循环语句中,break 表示 跳出整个循环,不再执行,循环将终止,而 continue 则表示跳出本次循环,继续下一次的循环,不会终止循环。

74. 函数中的默认参数位置如何放置?

当使用默认参数时,任何默认参数必须放在任何非默认参数的右侧;否则,函数将不会按照预期的情况工作。

75. 如何往一个数组后面添加一个值?列出两种方式?
$arr[ ] = $value; array_push($arr, $value);
[!!!]76. 说出数组涉及到的常用函数。

array --声明一个数组

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

foreach -- 遍历数组

list -- 将数组中元素的值赋值给变量,批量声明变量

explode -- 将字符串转成数组

implode -- 将数组转成一个新字符串

array_merge -- 合并一个或多个数组

is_array -- 检查是否是数组

print_r -- 输出数组

sort -- 数组排序

array_keys -- 返回数组中所有的键名

array_values -- 返回数组中所有的值

key -- 从关联数组中取得键名

[!!!]77. 字符串的常用函数?

trim()-- 去除字符串首尾处的空白字符(或者其他字符)

strlen()-- 字符串长度

substr()-- 截取字符串

str_replace()-- 替换字符串函数

strstr()-- 查找字符串的首次出现位置,返回 第一次出现的位置开始到结尾的字符串

explode()-- 将字符串分割成数组

implode()-- 将数组分割成字符串

str_repeat() -- 重复一个字符串

addslashes() -- 转义字符串

htmlspecialchars() -- HTML 实体转义

78. 以下代码的执行后是,$result 值为:(奇矩互动)
<?php  $srcArray=array('a','b','c','d');  $randValue=array_rand($srcArray);  $result=is_string($randValue); ?>

A. a

B. false

C. true

D. b

E. c

答案:B

mixed array_rand( array $input [, int $num_req ] )

从数组中随机取出一个或多个单元,它接受 input 作为输入数组和一个可选的参数num_req,指明了你想取出多少个单元 - 如果没有指定,默认为 1。

如果你只取出一个,array_rand() 返回一个随机单元的键名,否则就返回一个包含随机键名的数组。

所以使用 array_rand 函数,返回结果要么是键名,要么是数组,在这个例子中,数组是索引数组,所以返回的是整型。

79. 以下代码的执行后是,$result 值为: (奇矩互动)
<?php  $a= '01';  $result = 1;   if (in_array($a,array('1'))) {   $result = 2;  }elseif ($a == '1') {   $result = 3;  }elseif ($a == '01') {   $result = 4;  }else{   $result = 5;  }   echo $result; ?>

A. 1

B. 2

C. 3

D. 4

E. 5

答案:B

80. php 函数名是否区分大小写? (奇矩互动)

A. 不区分

B. 区分

答案:A

函数名是大小写无关的,不过在调用函数的时候,通常使用其在定义时相同的形式。

81.以下代码的执行后是,$result 值为:(奇矩互动)
<?php  $x = '';  $result = is_null($x); ?>

A. null

B. true

C. false

D. 1

答案:C

is_null -- 检测变量是否为 NULL,如果变量是 null 则返回 TRUE,否则返回 FALSE。在下列情况下一个变量被认为是 NULL:

  1. 被赋值为 NULL
  2. 尚未被赋值
  3. unset()
82. 翻转字符串中的单词,字符串仅包含大小写字母和空格,单词间使用空格分隔。如 :输入"This is PHP",输出"PHP is This"(非必要请不要使用 PHP 自带函数) (小米)
<?php  function reverse($str)  {   $arr = explode(' ',$str);   $arr = array_reverse($arr);   return implode(' ',$arr);  }   $str = 'This is PHP';  echo reverse($str); ?>
83. 请列举出你所知道的全局环境变量 (亿邮)
$

ENV;

SERVER;
$

REQUEST;

FILES;
$

SESSION;

COOKIE;
$

GET;

POST;

$GLOBALS;

84. 设有这样一个数组$a=array(array(id=>0),array(id=>1),array(id=>2)......)id=>0-10000,请问你如何使用 PHP 判断 id=>500 是否在这个数组内? (亿邮)

使用 in_array 函数,代码如下:

<?php  $a = array(    array('id' => 0),    array('id' => 1),    array('id' => 2),    array('id' => 3),    array('id' => 4),    array('id' => 500)   );  $b = array('id' => 500);   if (in_array($b,$a)) {   echo "Yes";  }else{   echo "No";  } ?>
85. 在 PHP 中两个数组怎么连接合并在一起 (亿邮)

使用 array_merge()函数

86. 运行以上代码后$a $b $c 分别是? (卓望)
<?php  $a = $b = $c = 0;  $a = $b && $c; ?>

$a 为 false,$b = $c = 0

四、PHP面向对象

1. 写出 php 的 public、protected、private 三种访问控制模式的区别(新浪网技术部)

public:公有,任何地方都可以访问

protected:继承,只能在本类或子类中访问,在其它地方不允许访问

private:私有,只能在本类中访问,在其他地方不允许访问

相关题目:请写出 PHP5 权限控制修饰符

private protected public

2. 设计模式考察:请用单态设计模式方法设计类满足如下需求:

请用 PHP5 代码编写类实现在每次对数据库连接的访问中都只能获得唯一的一个数据库连接,具体连接数据库的详细代码忽略,请写出主要逻辑代码(新浪网技术部)

<?php  class Mysql  {   private static $instance = null;   private $conn;    // 构造方法,设置为private,不允许通过new获得对象实例   private function __construct(argument)   {    $conn = mysql_connect("localhost","root","root");   }    // 获取实例方法   public function getInstance()   {    if (!self::$instance instanceof self) {     self::$instance = new self;    }    return self::$instance;   }    // 禁止克隆   private function __clone(){}  }   // 获得对象  $db = Mysql::getInstance(); ?>
3. 写出下列程序的输出结果(新浪网技术部)
<?php  class a  {   protected $c;    public function a()   {    $this->c = 10;   }  }   class b extends a  {   public function print_data()   {    return $this->c;   }  }   $b = new b();  echo $b->print_data(); ?>

输出结果 10

[!]4. PHP5 中魔术方法函数有哪几个,请举例说明各自的用法 (腾讯 PHP 工程师笔试题)

__sleep serialize 之前被调用

__wakeup unserialize 时被调用

__toString 打印一个对象时被调用

__set_state 调用 var_export 时被调用,用 __set_state 的返回值作为 var_export 的返回值

__construct 构造函数,实例化对象时被调用

__destruct 析构函数,当对象销毁时被调用

__call 对象调用某个方法,若存在该方法,则直接调用,若不存在,则调用 __call 函数

__get 读取一个对象属性时,若属性存在,则直接返回,若不存在,则调用 __get 函数

__set 设置一个对象的属性时,若属性存在,则直接赋值,若不存在,则调用 __set 函数

__isset 检测一个对象的属性是否存在时被调用

__unset unset 一个对象的属性时被调用

__clone 克隆对象时被调用

__autoload 实例化一个对象时,如果对应的类不存在,则该方法被调用

相关题目:请写出 php5 的构造函数和析构函数

构造函数: __construct
析构函数: __destruct

5. 如何使用下面的类,并解释下面什么意思?
<?php  class test{   function Get_test($num){    $num = md5(md5($num)."En");    return $num;   }  }   $testObject = new test();  $encryption = $testObject->Get_test("itcast");  echo $encryption; ?>

双重 md5 加密

6. How would you declare a class named “myclass” with no methods or properties?(Yahoo)

class myclass{};

相关题目:如何声明一个名为“myclass”的没有方法和属性的类?
7. How would you create an object, which is an instance of “myclass”? (Yahoo)

$obj= new myclass();

相关题目:如何实例化一个名为“myclass”的对象?
8. How do you access and set properties of a class from within the class?(Yahoo)

使用语句:$this->propertyName,例如:

<?php  class mycalss{   private $propertyName;   public function __construct()   {    $this->propertyName = "value";   }  } ?>
9. The code below ___________ because ____________.(腾讯)
<?php class Foo{ ?> <?php  function bar(){   print "bar";  } } ?>

A. will work, class definitions can be split up into multiple PHP blocks.

B. will not work, class definitions must be in a single PHP block.

C. will not work, class definitions must be in a single file but can be in multiple PHP blocks.

D. will work, class definitions can be split up into multiple files and multiple PHP blocks.

答案: B

10. 类的属性可以序列化后保存到 session 中,从而以后可以恢复整个类,这要用到的函数是____。serialize() 和 unserialize()
11. 在 PHP 中,如果派生类与父类有相同名字的函数,则派生类的函数会替换父类的函数,程序结果为
<?php class A{  function disName(){   echo "Picachu";  } }  class B extends A{  var $tmp;  function disName(){   echo "Doraemon";  } }  $cartoon = New B; $cartoon->disName(); ?>

A. tmp

B. Picachu

C. disName

D. Doraemon

E. 无输出

答案:D

12. 接口和抽象类的区别是什么?

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

抽象类与普通类相似,都包含成员变量和成员方法,两者的区别在于,抽象类中至少要包含一个抽象方法,抽象方法没有方法体,该方法天生就是要被子类重写的。

抽象方法的格式为:abstract function abstractMethod();

接口是通过 interface 关键字来声明的,接口中的成员常量和方法都是 public 的,方法可以不写关键字 public,接口中的方法也是没有方法体。接口中的方法也天生就是要被子类实现的。

抽象类和接口实现的功能十分相似,最大的不同是接口能实现多继承。在应用中选择抽象类还是接口要看具体实现。

子类继承抽象类使用 extends,子类实现接口使用 implements。

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

类中的常量也就是成员常量,常量就是不会改变的量,是一个恒值。定义常量使用关键字 const,例如:const PI = 3.1415326;

无论是类内还是类外,常量的访问和变量是不一样的,常量不需要实例化对象,访问常量的格式都是类名加作用域操作符号(双冒号)来调用,即: 类名:: 类常量名

14. autoload()函数是如何运作的?

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

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

这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后就执行 include 或者 require 来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。

15. 哪种OOP设置模式能让类在整个脚本里只实例化一次?(奇矩互动)

A. MVC

B. 代理模式

C. 状态模式

D. 抽象工厂模式

E. 单件模式

答案:E

16. 借助继承,我们可以创建其他类的派生类。在PHP中,子类最多可以继承几个父类?(奇矩互动)

A. 1个

B. 2个

C. 取决于系统资源

D. 3个

E. 想要几个有几个

答案:A

17. 执行以下代码,输出结果是(奇矩互动)
<?php  abstract class a{   function __construct()   {    echo "a";   }  }   $a = new a(); ?>

A. a

B. 一个错误警告

C. 一个致命性的报错

答案:C 因为类a是抽象类,不能被实例化

18. 执行以下代码,输出结果是
<?php class a{  function __construct(){   echo "echo class a something";  } }  class b extends a{  function __construct(){   echo "echo class b something";  } }  $a = new b(); ?>

A. echo class a something echo class b something

B. echo class b something echo class a something

C. echo class a something

D. echo class b something

答案:D

类 b 继承自类 a,两个类都定义了构造函数,由于二者名字相同,所以子类中的构造函数覆盖了父类的构造函数,要想子类对象实例化时也执行父类的构造函数,需要在子类构造函数中使用 parent::__construct() 来显示调用父类构造函数。

19. 请定义一个名为MyClass的类,这个类只有一个静态方法justDoIt。(卓望)
<?php class MyClass{  public static function justDoIt(){   } } ?>
20. 只有该类才能访问该类的私有变量吗?(卓望)

是的

21. 写出你知道的几种设计模式,并用php代码实现其中一种。(卓望)

单例模式,工厂模式单例模式 实现代码 见 第二题

五、MySQL数据库

mysql_num_rows()

mysql_affected_rows()

这两个函数都作用于 mysql_query($query)操作的结果,mysql_num_rows() 返回结果集中行的数目。mysql_affected_rows() 取得前一次 MySQL 操作所影响的记录行数。

mysql_num_rows()仅对 SELECT 语句有效,要取得被 INSERT,UPDATE 或者 DELETE 查询所影响到的行的数目,用 mysql_affected_rows()。

相关题目:取得查询结果集总数的函数是?

mysql_num_rows()

2. sql 语句应该考虑哪些安全性?(新浪网技术部)

防止 Sql 注入,对特殊字符进行转义、过滤或者使用预编译的 sql 语句绑定变量。

最小权限原则,特别是不要用 root 账户,为不同的类型的动作或者组建使用不同的账户。

当 sql 运行出错时,不要把数据库返回的错误信息全部显示给用户,以防止泄露服务器和数据库相关信息。

3. 简单描述 mysql 中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)(新浪网技术部)

索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),它们包含对数据表里所有记录的引用指针。

普通索引(由关键字 KEY 或 INDEX 定义的索引)的唯一任务是 加快对数据的访问速度

普通索引允许被索引的数据列包含重复的值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字 UNIQUE 把它定义为一个 唯一索引

也就是说,唯一索引可以 保证数据记录的唯一性

主键,是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字 PRIMARY KEY 来创建。

索引可以覆盖多个数据列,如像 INDEX(columnA, columnB)索引,这就是 联合索引

索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度,因为在执行这些写操作时,还要操作索引文件。

4. 有一个留言板,用 mysql 做数据库,用户信息包括:用户名,密码,email,留言内容包括:留言 ID,标题,内容,发表时间,状态(审核,未审核)(新浪网技术部)

请实现下列需求:(1).数据库结构。无需写建表语句,用类似下面的表格,描述清楚即可,注意,要在索引栏中注明是否需要创建索引,以及要创建的索引的类型

表名 table_aaa
字段名 字段说明 字段类型 索引
name 姓名 varchar(64) 唯一索引
gender 性别 enum(‘M’,‘F’)

(2).用一个 sql 语句查询出发表留言数量大于 10 条的用户名及其留言数量,查询结果按文章数量降序排列

参考答案:用户表结构如下:

表名 user
字段名 字段说明 字段类型 索引
user_id 用户编号 int unsigned 主键
name 用户名 varchar(30)
password 密码 char(32)
email 邮箱 varchar(50)

留言表结构如下:

表名 message
字段名 字段说明 字段类型 索引
message_id 留言编号 int unsigned 主键
title 标题 varchr(100)
content 内容 text
user_id 用户 id int unsigned 普通索引
pubtime 发表时间 int unsigned
state 状态 tinyint 0 未审核 1 审核

查询语句如下:

SELECT u.name, COUNT(*) AS total

FROM user AS u INNER JOIN message AS m

ON u.user_id = m.user_id

GROUP BY u.name

HAVING total > 10

ORDER BY total DESC

5. 如何用命令把 mysql 里的数据备份出来(酷讯 PHP 工程师笔试题)

(1). 导出一张表

mysqldump -u 用户名 -p 密码 库名 表名 > 文件名(如 D:/a.sql)

(2). 导出多张表

mysqldump -u 用户名 -p 密码 库名 表名 1 表名 2 表名 3 > 文件名(如 D:/a.sql)

(3). 导出所有表

mysqldump -u 用户名 -p 密码 库名 > 文件名(如 D:/a.sql)

(4). 导出一个库

mysqldump -u 用户名 -p 密码 -B 库名 > 文件名(如 D:/a.sql)

6. 两张表 city 表和 province 表。分别为城市与省份的关系表。

city:

id city provinceid
1 广州 1
2 深圳 1
3 惠州 1
4 长沙 2
5 武汉 3

province:

id province
1 广东
2 湖南
3 湖北

(1). 写一条 sql 语句关系两个表,实现:显示城市的基本信息。

显示字段:城市 id ,城市名, 所属省份 。如:

id(城市 id) cityname(城市名) privence(所属省份)

……

SELECT c.id AS id,c.city AS cityname,p.province

FROM city c LEFT JOIN province p ON c.provinceid=p.id

(2). 如果要统计每个省份有多少个城市,请用 group by 查询出来。

显示字段:省份 id ,省份名,包含多少个城市。

SELECT p.id,p.province,count(c.id) AS num

FROM province p LEFT JOIN city c ON p.id = c.provinceid

GROUP BY p.id;

7. MySQL 数据库中的字段类型 varchar 和 char 的主要区别是什么?哪种字段的查找效率要高,为什么?
  • 区别一,定长和变长

    char 表示定长,长度固定,varchar表示变长,即长度可变。当所插入的字符串超出它们的长度时,视情况来处理,如果是严格模式,则会拒绝插入并提示错误信息,如果是宽松模式,则会截取然后插入。如果插入的字符串长度小于定义长度时,则会以不同的方式来处理,如char(10),表示存储的是10个字符,无论你插入的是多少,都是10个,如果少于10个,则用空格填满。而varchar(10),小于10个的话,则插入多少个字符就存多少个。

    varchar怎么知道所存储字符串的长度呢?实际上,对于varchar字段来说,需要使用一个(如果字符串长度小于255)或两个字节(长度大于255)来存储字符串的长度。

  • 区别之二,存储的容量不同

    对 char 来说,最多能存放的字符个数 255,和编码无关。

    而 varchar 呢,最多能存放 65532 个字符。VARCHAR 的最大有效长度由 最大行大小和使用的字符集 确定。整体最大长度是 65,532字节

最大有效长度是 65532 字节,在 varchar 存字符串的时候,第一个字节是空的,不存任何的数据,然后还需要两个字节来存放字符串的长度。所以有效长度就是 65535 - 1 - 2= 65532

由字符集来确定,字符集分单字节和多字节

Latin1 一个字符占一个字节,最多能存放 65532 个字符

GBK 一个字符占两个字节, 最多能存 32766 个字符

UTF8 一个字符占三个字节, 最多能存 21844 个字符

注意,char 和 varchar 后面的长度表示的是字符的个数,而不是字节数。

两相比较,char 的效率高,没有碎片,尤其更新比较频繁的时候,方便数据文件指针的操作。但不够灵活,在实际使用时,应根据实际需求来选用合适的数据类型。

相关题目:若一个表定义为 create table t1(c int, c2 char(30), c3 varchar(N)) charset=utf8; 问N 的最大值又是多少?

(65535 - 1 - 2 - 4 - 30 * 3 )/3

8. IP 该如何保存?

最简单的办法是使用字符串(varchar)来保存,如果从效率考虑的话,可以将 ip 保存为整型(unsigned int),使用 php 或 mysql 提供的函数将 ip 转换为整型,然后存储即可。

PHP 函数:long2ip()和 ip2long()

MySQL 函数:inet_aton()和 inet_ntop

9. 设有成绩表如下所示,试查询两门及两门以上不及格同学的平均分。
编号 姓名 科目 分数
1 张三 数学 90
2 张三 语文 50
3 张三 地理 40
4 李四 语文 55
5 李四 政治 45
6 王五 政治 30
#创建一个成绩表

CREATE TABLE grade(

id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

name VARCHAR(10) NOT NULL,

subject VARCHAR(10) NOT NULL,

score TINYINT UNSIGNED NOT NULL

);

#插入记录

INSERT INTO grade(name,subject,score) VALUES('张三','数学',90);

INSERT INTO grade(name,subject,score) VALUES('张三','语文',50);

INSERT INTO grade(name,subject,score) VALUES('张三','地理',40);

INSERT INTO grade(name,subject,score) VALUES('李四','语文',55);

INSERT INTO grade(name,subject,score) VALUES('李四','政治',45);

INSERT INTO grade(name,subject,score) VALUES('王五','政治',30);

#查询语句

SELECT name,AVG(score),SUM(score<60) AS gk

FROM grade

GROUP BY name

HAVING gk>=2;

10. 为了记录足球比赛的结果,设计表如下:

team:参赛队伍表

字段名称 类型 描述
teamID int 主键
teamname varchar(20) 队伍名称

match:赛程表

字段名称 类型 描述
matchID int 主键
hostTeamID int 主队的 ID
gusetTeamID int 客队的 ID
marchResult varchar(20) 比赛结果
matchTime date 比赛日期

其中,match 赛程表中的 hostTeamID 与 guestTeamID 都和 team 表中的 teamID 关联,查出2006-6-1 到 2006-7-1 之间举行的所有比赛,并且用以下形式列出:拜仁 2:0 不莱梅 2006-6-21

#创建参赛队伍表 CREATE TABLE team( teamID INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, teamName VARCHAR(30) NOT NULL );
#向参赛队伍表中插入记录 INSERT INTO team(teamName) VALUES('拜仁'); INSERT INTO team(teamName) VALUES('不莱梅'); INSERT INTO team(teamName) VALUES('皇家马德里'); INSERT INTO team(teamName) VALUES('巴塞罗那'); INSERT INTO team(teamName) VALUES('切尔西'); INSERT INTO team(teamName) VALUES('曼联'); INSERT INTO team(teamName) VALUES('AC 米兰'); INSERT INTO team(teamName) VALUES('国际米兰');
#创建 match 赛程表 CREATE TABLE mat( matchID INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEy, hostTeamID INT UNSIGNED NOT NULL, guestTeamID INT UNSIGNED NOT NULL, matchResult VARCHAR(20) NOT NULL, matchTime DATE NOT NULL );
#向赛程表中插入几条记录 INSERT INTO mat(hostTeamID,guestTeamID,matchResult,matchTime) VALUES(1,2,'3:1','2006-6-15'); INSERT INTO mat(hostTeamID,guestTeamID,matchResult,matchTime) VALUES(3,4,'2:2','2006-6-28'); INSERT INTO mat(hostTeamID,guestTeamID,matchResult,matchTime) VALUES(5,6,'0:2','2006-7-10'); INSERT INTO mat(hostTeamID,guestTeamID,matchResult,matchTime) VALUES(7,8,'5:3','2006-5-30');
#查询语句 SELECT t1.teamName,matchResult,t2.teamName,matchTime FROM mat LEFT JOIN team AS t1 ON hostTeamID = t1.teamID LEFT JOIN team AS t2 ON guestTeamID = t2.teamID WHERE matchTime BETWEEN '2006-6-1' AND '2006-7-1';
11. 有如下两张表 a 和 b,请写出得到结果表的查询语句

表a:

id num
a 5
b 10
c 15
d 10

表b:

id num
b 5
c 15
d 20
e 99

结果表:

id sum(num)
a 5
b 15
c 30
d 30
e 99
#创建表 a CREATE TABLE t1_uni( id CHAR(1), num TINYINT )engine=MyISAM charset=utf8;  #创建表 b CREATE TABLE t2_uni( id CHAR(1), num TINYINT )engine=MyISAM charset=utf8;  #向 a 表中插入记录 INSERT INTO t1_uni VALUES('a',5),('b',10),('c',15),('d',10); #向 b 表中插入记录 INSERT INTO t2_uni VALUES('b',5),('c',15),('d',20),('e',99);
#查询语句 SELECT id,SUM(num) FROM( SELECT id,num FROM t1_uni UNION ALL SELECT id,num FROM t2_uni) AS tmp GROUP BY id;
12. MYSQL 取得当前时间的函数是?格式化日期的函数是?

current_time()用于取得当前时间date_format(datetime, format)用于格式化日期,如:select date_format(now(),'%Y%m%d');

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

SELECT members.username

FROM members

ORDER BY posts DESC

LIMIT 10;

[!!]14. 请简述项目中优化 sql 语句执行效率的方法,从哪些方面,sql 语句性能如何分析?
  1. 尽量选择较小的列
  2. 将where中用的比较频繁的字段建立索引
  3. select子句中避免使用‘*’
  4. 避免在索引列上使用计算、not in 和<>等操作
  5. 当只需要一行数据的时候使用limit 1
  6. 保证单表数据不超过200W,适时分割表。

针对查询较慢的语句,可以使用explain 来分析该语句具体的执行情况。

  1. SQL 中 LEFT JOIN 的含义是________,如果 tbl_user 记录了学生的姓名(name)和学号(ID),tbl_score 记录了学生(有的学生考试以后被开除了,没有其记录)的学号(ID)和考试成绩(score)以及考试科目(subject),要想打印出各个学生姓名及对应的的各科总成绩,则可以用 SQL 语句_________。

    left join 表示左外连接,以左表为准,左表中的记录都会出现在查询结果中,如果对应的记录在右表中没有匹配的记录,则右表的字段值以 NULL 填充。

#创建表 tbl_user CREATE TABLE tbl_user( id INT NOT NULL, name VARCHAR(50) NOT NULL, PRIMARY KEY (id) );  #创建表 tbl_socre CREATE 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_score b ON a.id=b.id GROUP BY a.id;
16. 使用 php 写一段简单查询,查出所有姓名为“张三”的内容并打印出来

表 user

name tel content date
张三 13333663366 大专毕业 2006-10-11
张三 13612312331 本科毕业 2006-10-15
张四 021-55665566 中专毕业 2006-10-15

请根据上面的题目完成代码:

 $mysql_db=mysql_connect("local","root","pass"); mysql_select_db("DB",$mysql_db); $result=mysql_query("select * from user where name='张三'");  while($row=mysql_fetch_array($result)){     echo $row['name']. $row['tel']. $row['content']. $row['date'];     echo "<br>"; }
17. 写出 SQL 语句的格式 : 插入 ,更新 ,删除(卓望)

表名 user

name tel content date
张三 13333663366 大专毕业 2006-10-11
张三 13612312331 本科毕业 2006-10-15
张四 021-55665566 中专毕业 2006-10-15

(a).有一新记录(小王 13254748547 高中毕业 2007-05-06)请用 SQL 语句新增至表中

(b).请用 sql 语句把张三的时间更新成为当前系统时间

(c).请写出删除名为张四的全部记录

INSERT INTO user(name,tel,content,date)VALUES('小王','13254748547','高中毕业','2007-05-06'); UPDATE user SET date = date_format(now(),'%Y-%m-%d') WHERE name = '张三' DELETE FROM user WHERE name = '张四'
8. MySQL 自增类型(通常为表 ID 字段)必需将其设为()

整型,并设置为 AUTO_INCREMENT

19. 数据库中的事务是什么?

事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。ACID 四大特性,原子性、隔离性、一致性、持久性。

20. What's the difference between mysql_fetch_row() and mysql_fetch_array()? (Yahoo)

mysql_fetch_row() 从和指定的结果标识关联的结果集中取得一行数据并作为数组返回。每个结果的列储存在一个数组的单元中,偏移量从 0 开始。

mysql_fetch_array() 是 mysql_fetch_row() 的扩展版本。除了将数据以数字索引方式储存在数组中之外,还可以将数据作为关联索引储存,用字段名作为键名。

mysql_fetch_array() 中可选的第二个参数 result_type 是一个常量,可以接受以下值:

MYSQL_ASSOC,MYSQL_NUM 和 MYSQL_BOTH。其默认值是 MYSQL_BOTH。

如 果 用 了 MYSQL_BOTH , 将 得 到 一 个 同 时 包 含 关 联 和 数 字 索 引 的 数 组 。 用MYSQL_ASSOC 只得到关联索引(如同 mysql_fetch_assoc() 那样),用 MYSQL_NUM 只得到数字索引(如同 mysql_fetch_row() 那样)。

21. 请写出 php 连 mysql 连接中,获取下一个自增长 id 值的方法,可以写多个(酷讯)

方法一,使用 show table status ,然后获取 auto_increment 的值

方法二,使用 select max(id) + 1 from table

方法三,如果是刚插入记录,可以使用 last_insert_id() + 1 获得

22. 从表 login 中选出 name 字段包含 admin 的前 10 条结果所有信息的 sql 语句 (酷讯)

SELECT * FROM login WHERE name LIKE ‘%admin%’ LIMIT 10;

23. 表中有 A B C 三列,用 SQL 语句实现:当 A 列大于 B 列时选择 A 列,否则选择 B 列,当B 列大于 C 列时选择 B 列否则选择 C 列。

使用case语句,如下:

SELECT CASE WHEN A > B THEN A ELSE B END, CASE WHEN B > C THEN B ELSE C END FROM table
24. 写出三种以上 MySQL 数据库存储引擎的名称(提示:不区分大小写)

MyISAM、InnoDB、BDB(Berkeley DB)、Merge、Memory(Heap)、Example、Federated、Archive、CSV、Blackhole、MaxDB 等等十几个引擎。

[!]25. 请简述数据库设计的范式及应用。

一般第 3 范式就足以,用于表结构的优化,这样做既可以避免应用程序过于复杂同时也避免了 SQL 语句过于庞大所造成系统效率低下。

第一范式:若关系模式 R 的每一个属性是不可再分解的,且有主键,则属于第一范式。

第二范式:若 R 属于第一范式,且所有的非主键属性都完全函数依赖于主键属性,则满足第二范式。

第三范式:若 R 属于第二范式,且所有的非主键属性没有一个是传递函数依赖于候选主键属性,则满足第三范式。

在实际使用中,可以根据需求适当的逆范式。

26. 取得最新一次添加记录(假设 id 为主键,并且是自增类型)所产生的 id 的函数是什么?

mysql_insert_id();如果上一查询没有产生 AUTO_INCREMENT 的值,则 mysql_insert_id()返回 0。

27. php 连接 mysql 之后,如何设置 mysql 的字符集编码为 utf8?

mysql_query(“set names utf8”);

28. php 访问数据库有哪几步?

主要有以下几个步骤:

  1. 连接数据库服务器:mysql_connect('host','user','password');
  2. 选择数据库:mysql_select_db(数据库名);
  3. 设置从数据库提取数据的字符集:mysql_query("set names utf8");
  4. 执行 sql 语句:mysql_query(sql 语句);
  5. 处理结果集
  6. 关闭结果集,释放资源:mysql_free_result($result);
  7. 关闭与数据库服务器的连接:mysql_close($link);
29. 在平常 mysql 优化方面,最基本的也是最重要的优化是()。(奇矩互动)

查询优化

30. 列出 mysql 数据库常用的几种类型 HEAP、()、()。 (奇矩互动)

MyISAM,innoDB

31. 请对于据 select * from table example where((a and b)and c or(((a and b)and(c and d)))优化的语句。(奇矩互动)

题目多了一个括号,在 where 后面,但不影响题目的意思,可以将 sql 语句优化如下:select * from table example where a and b and c

[!!]32. 解释 MySQL 外连接、内连接与自连接的区别 (小米)

先说什么是 交叉连接 ,交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配。

内连接则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的行。

外连接 其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个表中的所有数据行,这三种情况依次称之为左外连接,右外连接,和全外连接。

左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那

些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以 NULL 来填充。

右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。

左连接和右连接可以互换,MySQL 目前还不支持全外连接。

34. 写出你所知道的数据库。(亿邮)

MySQL,SQL Server, Oracle,Sybase, informix, DB2 等

35. 用户互为好友的 SNS 存储结构怎么设计。(亿邮)

首先是有用户表,如下:

CREATE TABLE user( id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, username VARCHAR(30) NOT NULL DEFAULT '' COMMENT '用户名', email VARCHAR(50) NOT NULL DEFAULT '' COMMENT '邮箱', password CHAR(32) NOT NULL DEFAULT '' COMMENT '密码' )engine=MyISAM charset=utf8 comment='用户表'; ``  其次是用户间的关系,如下:

CREATE TABLE relation(

rel_id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,

fuid INT UNSIGNED NOT NULL COMMENT '关注人的 id',

suid INT UNSIGNED NOT NULL COMMENT '被关注人的 id',

relation_type ENUM('S','D') NOT NULL DEFAULT 'S' COMMENT '关系,s 为关注,

d 表示为好友'

)engine=MyISAM charset=utf8 comment='用户关系表';

 ###### 36. 假设现在有一个数据库服务器,服务器地址为 192.168.0.110,用户名为 root 密码为password 请使用 PHP 编写一个面向过程化的连接该数据库的脚本代码 (亿邮) `$conn = mysql_connect('192.168.0.110','root','password') or die('数据库连接失败');`  ###### [!!!]37. 简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别 (亿邮) 区别主要有以下几个: 1. 构成上,MyISAM 的表在磁盘中有三个文件组成,分别是表定义文件( .frm)、数据文件(.MYD)、索引文件(.MYI),而 InnoDB 的表由表定义文件(.frm)、表空间数据和日志文件组成。 1. 安全方面,MyISAM 强调的是性能,其查询效率较高,但不支持事务和外键等安全性方面的功能,而 InnoDB 支持事务和外键等高级功能,查询效率稍低。 1. 对锁的支持,MyISAM 支持表锁,而 InnoDB 支持行锁。  ###### 38. 现在有下面一个查询语句 select * from tabname where id=2 and password='abc’如何判断它是现在是最优的。(亿邮) 可以使用 explain select * from tabname where id=2 and password='abc’来分析其执行情况。  ###### 39. 请问如何在 Mysql 操作中如何写入 utf8 格式数据 (亿邮) 首先确保数据库中的表是基于 utf8 编码的,其次 php 文件是 utf8 编码,在执行 mysql操作之前,执行 mysql_query(‘set names utf8’)操作,对于要操作的文本如果是 utf8编码,则可以直接操作,如果是其它编码,则可以使用 iconv 函数将其转化为 utf8 编码,然后写入。  ###### 40. mysql 中 varchar 的 最 大 长 度 是 多 少 ? 用 什 么 类 型 的 字 段 存 储 大 文 本 ?date 和datetime 和 timestamp 什么区别?怎么看数据库中有哪些 sql 正在执行? (卓望) varchar 的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是 65532 字节。 在 varchar 存字符串的时候,第一个字节是空的,不存任何的数据,然后还需要两个字节来存放字符串的长度。所以有效长度就是 65535 - 1 - 2 = 65532。 由字符集来确定,字符集分单字节和多字节,如果是单字节,如 latin1,则最多可以存放 65532 个字符,如果是多字节,如 GBK 则可以存放 32766 个字符,UTF8 则可以存放 21844个字符。  存储大文本可以使用 text 类型。 date 表示日期,其范围为 1000-01-01 ~ 9999-12-31 datetime 表示日期时间,其范围为 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 timestamp 是 unix 时 间 戳 的 日 期 时 间 表 示 方 式 , 其 范 围 较 小 为 1970-01-01 00:00:00~2038-01-19 03:14:07 ,timestamp 具备自动初始化和自动更新功能。  查看数据库中正在执行的 sql 语句可以使用日志,也可以使用 show processlist 命令。   41. 现在有一个 mysql 数据库表 visits 记录用户访问情况,表结构如下:

visits(

id int unsigned auto_increment,

user_id int unsigned comment ‘本次访问页面数’,

visit_time timestamp comment‘本次访问开始时间’,

primary key(id)

);

用户每访问过一次网站(从进入到离开),会增加一条记录。记录用户的 ID(user_id),以及访问的页面总数。比如: 1,208,2,//208 这个用户访问 2 个页面 2,2073,3, 3,208,1,//208 用户访问了 1 个页面  (1).请写一个 SQL 语句挑出你是累计访问页面数最多的 10 个用户(user_id)和对应的访问页面数。 (2).请写一个 SQL 语句,输出累计访问页面数分别等于 1,2,3,4,5,6,7,8,9,10 的唯一用户的数量,如果某个数量对应的用户数为 0,可以不输出。 (嘀嗒团)  从题目的描述来看,表结构貌似有些问题,user_id 应为用户 ID,而不是访问页面数,增加一个字段 pages 表示访问页面数。 查询访问页面数最多的 10 个用户的查询语句如下:

SELECT user_id, sum(pages) as total

FROM visits

GROUP BY user_id

ORDER BY total DESC LIMIT 10;

 输出累计访问页面数分别等于 1,2,3,4,5,6,7,8,9,10 的唯一用户的数量的查询语句如下:

SELECT total,count(user_id)

FROM (

SELECT user_id, sum(pages) AS total

FROM visits

GROUP BY user_id) AS temp

WHERE total IN (1,2,3,4,5,6,7,8,9,10)

GROUP BY total ;

```

[!!]42. 简述存储过程的适用情况

当需要处理复杂的查询和运算时,可以使用存储过程。

从应用分层的原则,大量使用存储过程导致业务逻辑分散在 DB 和应用服务器层,不利于维护和更新。

总体来说,存储程序可以用,但要慎重,最好只用来维护,不用于业务逻辑和支撑高并发高性能的东西。

正文到此结束
Loading...