DTD,文档类型定义,是一种保证 html 文档格式正确的有效方法,在解析网页时,浏
览器将使用 DTD 来检查页面的有效性(是否符合规范,元素和标签使用是否正确)并且采
取相应的措施。同时它还会影响浏览器的渲染模式(工作模式)。
<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>
<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>
A. <ul>
B. <dl>
C. <ol>
D. <list>
答案:C
A. a {text-decoration:none}
B. a {text-decoration:no underline}
C. a {underline:none}
D. a {decoration:no underline}
答案:A
<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 标签没有关闭。
(1).XHTML 必须强制指定文档类型 DocType,HTML 不需要
(2).XHTML 所有标签必须闭合,HTML 比较随意
(3).XHTML 严格区分大小写,所有标签的元素和属性的名字都必须使用小写
(4).XHTML 要求所有的标记都必须要有一个相应的结束标记
(5).XHTML 规定所有属性都必须有一个值,没有值的就重复本身
从 语义化的角度 来讲:div和span标签对于它们包含的元素是没有意义的,所以div 和 span 一般是用来布局。;而p标签则是一个语义化标签,表示一个段落。
从 显示的角度 来讲:span 是内联的,用在一小块的内联 HTML 中,前后不断行;div 元
素是块级的,等同于其前后有断行;p 元素是块级的,前后断行,而且还要再隔一行,相当
于断两行。
id:每个页 ID 是唯一的不能重复。class:可以设置多个 class 为同一个值。
<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 时间格式
所谓的 标准模式 是指,浏览器按 W3C 标准解析执行代码; 怪异模式 则是使用浏览器自己的方式解析执行代码,因为不同浏览器解析执行的方式不一样,所以我们称之为怪异模式。
浏览器解析时到底使用标准模式还是怪异模式,与你网页中的 DTD 声明直接相关,DTD声明定义了标准文档的类型(标准模式解析)文档类型,会使浏览器使用相应的方式加载网页并显示,忽略 DTD 声明,将使网页进入怪异模式(quirks mode)。
在 XHTML 模式下,声明一个元素的宽度,仅仅指的是在 css 中设置的 width,而在怪异模式下,元素的宽度包括 width 和 padding。
<frameset cols="25%,50%,25%"> <frame src="frame_a.htm" /> <frame src="frame_b.htm" /> <frame src="frame_c.htm" /> </frameset>
<input />
标签用于搜集用户信息。根据不同的 type 属性值,输入字段拥有很多种形式。
输入字段可以是文本字段、复选框、掩码后的文本控件、单选按钮、按钮等等。
<form>
标签用于为用户输入创建 HTML 表单。表单能够包含 input 元素,比如文本字段、复选框、单选框、提交按钮等等。
<script>
标签用于定义客户端脚本,比如 JavaScript。script 元素既可以包含脚本语句,也可以通过 src 属性指向外部脚本文件。
<style>
标签用于为 HTML 文档定义样式信息。
<table>
标签定义 HTML 表格。简单的 HTML 表格由 table 元素以及一个或多个 tr、th 或 td 元素组成。
<b>
呈现粗体文本效果。
<img />
元素向网页中嵌入一幅图像。
方案 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>
这种方案,兼容性好,但是会产生额外的标签。
弹出对话框函数:alert(), prompt(), confirm()获得输入焦点函数:focus()
转向使用 window.location.href = ""
引入外部 js 使用 <script src=""></script>
获取 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>
<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>
主窗口:
<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>
使用 XMLHttpRequest 对象异步请求
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]。
<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>
A. var obj = ( );
B. var obj = [ ];
C. var obj = { };
D. var obj = //;
答案:A
A. null instanceof Object
B. null === undefined
C. null == undefined
D. NaN == NaN
答案:C
A. foo.att
B. foo("att")
C. foo["att"]
D. foo{"att"}
E. foo["a"+"t"+"t"]
答案:ACE
(1).直接作为元素的属性,如 <img onclick="alert( 'hello' );" src="hello.jpg">
(2).使用 DOM 0 级事件,简单,兼容性好,如 img.onclick = function(){}
(3).使用 DOM 2 级事件,功能更强大,在非 IE 等标准浏览其中,使用 addEventListener,在IE 浏览器中则使用 attachEvent 来实现。
JavaScript 不支持二维数组定义,可以用 arr[0] = new array()来解决。
<script type="text/javascript"> function go2b() { window.location.href = "b.html"; window.close(); } setTimeout("go2b()",5000);//5秒后自动执行go2b方法 </script>
(1). var img = new Image();
(2). var img = document.createElement("image")
(3). img.innerHTML = "<img src='xxx.jpg' />"
前进: history.forward();
或者 history.go(1);
后退: history.back ();
或者 history.go(-1);
<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>
document.getElementById( 'button' ).onclick = function(){ window.open ('page.html'); }
其中,button 是按钮的 id,page.html 是要弹出的窗口页面。
JavaScript 中包括 5 种基本数据类型,分别是 Number,String,Boolean,Null 和 Undefined。
strlen和mb_strlen都是用于获取字符串长度。
strlen只针对单字节编码字符,也就是说它计算的是字符串的总字节数。如果是多字节编码,如 gbk 和 utf-8,使用 strlen 得到是该字符的总字节数;
可以使用mb_strlen获取其字符个数,使用mb_strlen 要注意两点,一是要开启 mbstring 扩展,二是要指定字符集。
总结:
<?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),多字节编码 ?>
方法一,使用 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);//输出 我的温暖 ?>
方法一,使用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);//输出 北 ?>
A. split
B. implode
C. explode
D. join
答案:A
<?php /* 写出下列程序的输出结果(新浪网技术部) */ $x = 87; $y = ($x % 7) * 16; $z = $x > $y ? 1 : 0; echo $z; ?>
答案:1
$_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']//和该文件上传相关的错误代码
二者区别只有一个,那就是对包含文件的需求程度。include 就是包含,如果被包含的文件不存在的话,那么则会提示一个错误,但是程序会继续执行下去。而 require 意思是需要,如果被包含文件不存在或者无法打开的时候,则会提示错误,并且会终止程序的执行。
这两种结构除了在如何处理失败之外完全一样。
once 的意思是一次,那么 include_once 和 require_once 表示只包含一次,避免重复包含。
来代替它们。
在如何处理失败时,include()产生一个警告而require()则导致一个致命错误;require
once()/include_once()include、require
<?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); ?>
POST 根据你 php.ini 文件配置(默认是 8M)GET 的话大小限制在 2KB
get 是发送请求 HTTP 协议通过 url 参数传递进行接收,而 post 是实体数据,可以通过表单提交大量信息。
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 避免重复包含。
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 />';//使用逗号时报错。 ?>
说明 :
,
是 echo 本身支持的一种语法,而 .
则是字符串连接操作符,使用 ,
的效率要高一些。(少了连接运算) ,
来分隔字符串变量,也可以使用 ,
来分隔字符串变量;print只能使用 .
来分隔字符串变量。 总结:
echo命令和print命令相同,没有区别
echo()和print()有区别:
echo()没有返回值,与echo命令相同
print()有返回值,总是返回1
补充:printf()和sprintf()类似,均为格式化输出,不同的是前者输出到标准输出,后者输出到变量
answer: print is a function,echo is a language construct
<?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("2009-4-4")-strtotime("2009-3-1"))/3600*24
<?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 />'; ?>
请说明 php 中传值与传引用的区别。什么时候传值什么时候传引用?
变量默认总是传值赋值。
那也就是说,当将一个表达式的值赋予一个变量时,整个原始表达式的值被赋值到目标变量。这意味着,例如,当一个变量的值赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量。
PHP 也提供了另外一种方式给变量赋值:引用赋值。
这意味着新的变量简单的引用(换言之,“成为其别名” 或者 “指向”)了原始变量。改动新的变量将影响到原始变量,反之亦然。使用引用赋值,简单地将一个 &
符号加到将要赋值的变量前(源变量)。
对象默认是传引用。
对于较大的数据,传引用比较好,这样可以节省内存的开销。
<?php $num = 10; function multipy($num){ $num = $num +10; } multipy($num); echo $num; ?>
输出 10
reference 传送的是变量的地址而非它的值,所以在函数中改变一个变量的值时,整个应用都见到这个变量的新值。一个 regular variable 传送给函数的是它的值,当函数改变这个变量的值时,只有这个函数才见到新值,应用的其他部分仍然见到旧值。
<?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); ?>
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); ?>
<?php $str = "www.baidu.com"; echo strrev(str_replace('www','',$str)); ?>
客户端 IP: $_SERVER["REMOTE_ADDR"]
服务器端 IP: $_SERVER["SERVER_ADDR"]
获取当前执行脚本路径使用 $_SERVER["SCRIPT_FILENAME"]
或 __FILE__
获取参数,使用 $_SERVER["QUERY_STRING"]
foo() 会执行这个函式,任何解译错误、语法错误、执行错误都会在页面上显示出来。
@foo() 在执行这个函式时,会隐藏所有上述的错误讯息。
很多应用程序都使用 @mysql_connect() 和 @mysql_query 来隐藏 mysql 的错误信息,这是不对的,因为错误不该被隐藏,你必须妥善处理它们,可能的话解决它们。
A. $users[ ] = "john";
B. array_add($users, "john");
C. array_push($users, "john");
D. $users ||= "john" ;
答案:BD
isset 检测一个变量是否设置
empty 检测是否为空
注意二者的区别,如果 变量 是非空或非零的值,则 empty() 返回 FALSE。换句话说,""、0、"0"、NULL、FALSE、array() 以及没有任何属性的对象都将被认为是空的。
isset是检测变量是否设置/定义,empty是检测已定义的变量的值是否为空。
当前脚本名称:$ SERVER["PHP_SELF"]或者 $ SERVER["SCRIPT_NAME"];
链接到当前页面的前一页面的 URL 地址:$_SERVER["HTTP_REFERER"]。
sort(),根据数组中元素的值,以英文字母顺序排序,索引键会由 0 到 n-1 重新编号。主要是当数组索引键的值无关紧要时用来把数组排序。
assort(),PHP 没有 assort() 函式,所以可能是 asort() 的笔误。
asort(),对数组进行排序,数组的索引保持和单元的关联。主要用于对那些单元顺序很重要的结合数组进行排序。
ksort(),根据数组中索引键的值,以英文字母顺序排序,特别适合用于希望把索引键排序的关联数组。
打开或者关闭错误报告,如:
error_reporting(0);
error_reporting(E_ALL & ~ E_NOTICE);
error_reporting(E_ALL);
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)意味着上述错误都会显示出来。
写出以下程序的输出结果 (CBSI)
<?php $str = 'cd'; $$str = 'hotdog';//$cd = 'hotdog'; $$str .= 'ok';//$cd .= 'ok'; echo $cd; ?>
hotdogok
获取一个普通变量的值作为这个可变变量的变量名。
定义常量:define()
检测常量是否定义:defined()
如:
define("TEST","happy new year!"); if( defined("TEST")){ echo TEST; }
执行程序段 <?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 题中相关题目。
使得 Apache 把所有扩展名为 php 的文件都作为 PHP 脚本处理。
LoadModule php5
module "c:/php/php5apache2.dll";AddType application/x-httpd-php .php
设为 on.
allow
call_time_pass_reference :是否启用在函数调用时强制参数被按照引用传递,默认关闭。echo count("abc")
; 输出什么?(新浪?) 输出 1
count :计算数组中的单元数目或对象中的属性个数,通常是一个 array,任何其它类型都只有一个单元。
对于对象,如果安装了 SPL,可以通过实现 Countable 接口来调用 count()。该接口只有一个方法 count(),此方法返回 count() 函数的返回值。
如果 var 不是数组类型或者实现了 Countable 接口的对象,将返回 1,有一个例外,如果 var 是 NULL 则结果是 0。
<?php echo count(strlen("http://php.net")); ?>
answer: 1
<?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>"; ?>
<?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 />"; ?>
PHP( Hypertext Preprocessor,超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML 中,尤其适合 web 开发。
PHP 主要是用于服务端的脚本程序,因此可以用 PHP 来完成任何其它的 CGI 程序能够完成的工作,例如收集表单数据,生成动态网页,或者发送/接收Cookies。但 PHP 的功能远不局限于此。
PHP 脚本主要用于以下三个领域:
你可以使用 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;
<?php $b = 201; $c = 40; $a = $b > $c ? 4 : 5; echo $a; ?>
输出结果为 4
$arr = array('james', 'tom', 'symfony');
$arr = array('james', 'tom', 'symfony');
请打印出第一个元素的值,并请将数组的值用','号分隔并合并成字串输出。
echo $arr[0];
以’,’合并成字符串: echo implode(',',$arr);
echo $a{0} 或 echo $a[0]
值是 e
=== 表示全等,是指的两个变量的值和类型都相等。如 if (strpos('abc','a') == false) 和 if (strpos('abc','a') === false)
A. printf("%.2d/n", 42);
B. printf("%1.2f/n", 42);
C. printf("%1.2u/n", 42);
answer:B
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 />"; ?>
<?php $a = in_array('01',array('1')) == var_dump('01' == 1); ?>
A. True
B. False
answer:A
<?php function timesTwo($int) { $int = $int * 2; } $int = 2; $result = timesTwo($int); ?>
answer: NULL
A. Using the strpos function
B. Using the == operator
C. Using strcasecmp()
D. Using strcmp()
answer:C
<?php /* 运行以下程序,$a 的值是多少? */ $a = "hello"; $b = &$a; unset($b); $b = "world"; echo $a,$b; ?>
answer:hello
<?php /* 运行以下程序,$b的值是多少? */ $a = 1; $b = $a++; echo $a,$b; ?>
answer:1
<?php /* 运行以下程序,$x 的值是多少? */ $array = array(); $x = empty($array); echo $x ? "true":"false"; ?>
answer:ture
使用 intval 函数,echo intval("09"),或者使用 int 强制类型转换。
<?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 ?>
<?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); ?>
<?php $array = array ('a', 'b', 'c', 'd'); ?>
A. array_flip()
B. array_reverse()
C. sort()
D. rsort()
答案:BD
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); ?>
define("MYPI",3.14);
双引号串中的内容可以被解释而且替换,而单引号串中的内容总被认为是普通字符。
使用 Switch 语句可以避免冗长的 if..elseif..else 代码块,case只能处理整数,或者能像整数一样运算的类型,比如char,使用时case 后用'',注意 break不能少,default是为了处理一些之前没有包含到的情况,这样更为安全。
date_default_timezone_set('PRC');echo date("Y-m-d H:i:s",time());
GB2312 支持的汉字较少,GBK 是相比 GB2312 汉字更为丰富,包括全部中日韩汉字,GB18030 相比 GBK 增加了一些少数名族汉字汉字库更为多样,但是常人很难用到,一般简体中文使用 GBK 而繁体中文使用 BIG5。
$text = 'gdfgfdgd59gmkblg'; echo substr_count ( $text,'g');
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){}
// 无,但给参数默认值应尽量从右向左
<?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 ? '相等' : '不相等';//相等 ?>
<?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 ?>
<?php $test = 'aaaa'; $abc = &$test; unset($test); echo $abc; ?>
aaaa
<?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 来引用。
<?php $GLOBALS['var1'] = 5; $var2 = 1; function get_value() { global $var2; $var1 = 0; return $var2++; } get_value(); echo $var1;//5 echo $var2;//2 ?>
52
<?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
array_unshift($arr,’jack’); echo $arr[0];
echo implode(‘,’,$arr);
$arr = explode(‘,’,$str);
arsort($arr); print_r($arr);
echo strstr($mail,'163'); echo substr($mail,7); echo substr($mail, strpos($mail, '@')+1); $arr = explode("@",$mail); echo $arr[1];
// 注释内容
C 风格的单行注释
# 注释内容
unix 风格的单行注释
/* 注释内容 */
C 风格的多行注释
global $a 或者 $GLOBALS['a']
aa is 'aa'
<?php $a = '123'; $a = (int)$a; //第一种方式 $a = intval($a); //第二种方式 settype($a,'int'); //第三种方式 ?>
break 和 continue 可以用在 switch 语句中,或是循环结构中它们的区别主要是体现在循环语句中,break 表示 跳出整个循环,不再执行,循环将终止,而 continue 则表示跳出本次循环,继续下一次的循环,不会终止循环。
当使用默认参数时,任何默认参数必须放在任何非默认参数的右侧;否则,函数将不会按照预期的情况工作。
$arr[ ] = $value; array_push($arr, $value);
array --声明一个数组
count -- 计算数组中的单元数目或对象中的属性个数
foreach -- 遍历数组
list -- 将数组中元素的值赋值给变量,批量声明变量
explode -- 将字符串转成数组
implode -- 将数组转成一个新字符串
array_merge -- 合并一个或多个数组
is_array -- 检查是否是数组
print_r -- 输出数组
sort -- 数组排序
array_keys -- 返回数组中所有的键名
array_values -- 返回数组中所有的值
key -- 从关联数组中取得键名
trim()-- 去除字符串首尾处的空白字符(或者其他字符)
strlen()-- 字符串长度
substr()-- 截取字符串
str_replace()-- 替换字符串函数
strstr()-- 查找字符串的首次出现位置,返回 第一次出现的位置开始到结尾的字符串
explode()-- 将字符串分割成数组
implode()-- 将数组分割成字符串
str_repeat() -- 重复一个字符串
addslashes() -- 转义字符串
htmlspecialchars() -- HTML 实体转义
<?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 函数,返回结果要么是键名,要么是数组,在这个例子中,数组是索引数组,所以返回的是整型。
<?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
A. 不区分
B. 区分
答案:A
函数名是大小写无关的,不过在调用函数的时候,通常使用其在定义时相同的形式。
<?php $x = ''; $result = is_null($x); ?>
A. null
B. true
C. false
D. 1
答案:C
is_null -- 检测变量是否为 NULL,如果变量是 null 则返回 TRUE,否则返回 FALSE。在下列情况下一个变量被认为是 NULL:
<?php function reverse($str) { $arr = explode(' ',$str); $arr = array_reverse($arr); return implode(' ',$arr); } $str = 'This is PHP'; echo reverse($str); ?>
ENV;
SERVER;REQUEST;
FILES;SESSION;
COOKIE;GET;
POST;$GLOBALS;
使用 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"; } ?>
使用 array_merge()函数
<?php $a = $b = $c = 0; $a = $b && $c; ?>
$a 为 false,$b = $c = 0
public:公有,任何地方都可以访问
protected:继承,只能在本类或子类中访问,在其它地方不允许访问
private:私有,只能在本类中访问,在其他地方不允许访问
private protected public
请用 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(); ?>
<?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
__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
实例化一个对象时,如果对应的类不存在,则该方法被调用
构造函数: __construct
析构函数: __destruct
<?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 加密
class myclass{};
$obj= new myclass();
使用语句:$this->propertyName,例如:
<?php class mycalss{ private $propertyName; public function __construct() { $this->propertyName = "value"; } } ?>
<?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
<?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
抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。抽象类是通过关键字abstract 来声明的。
抽象类与普通类相似,都包含成员变量和成员方法,两者的区别在于,抽象类中至少要包含一个抽象方法,抽象方法没有方法体,该方法天生就是要被子类重写的。
抽象方法的格式为:abstract function abstractMethod();
接口是通过 interface 关键字来声明的,接口中的成员常量和方法都是 public 的,方法可以不写关键字 public,接口中的方法也是没有方法体。接口中的方法也天生就是要被子类实现的。
抽象类和接口实现的功能十分相似,最大的不同是接口能实现多继承。在应用中选择抽象类还是接口要看具体实现。
子类继承抽象类使用 extends,子类实现接口使用 implements。
类中的常量也就是成员常量,常量就是不会改变的量,是一个恒值。定义常量使用关键字 const,例如:const PI = 3.1415326;
无论是类内还是类外,常量的访问和变量是不一样的,常量不需要实例化对象,访问常量的格式都是类名加作用域操作符号(双冒号)来调用,即: 类名:: 类常量名
。
使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。
当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行 __autoload()
函数。
这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后就执行 include 或者 require 来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。
A. MVC
B. 代理模式
C. 状态模式
D. 抽象工厂模式
E. 单件模式
答案:E
A. 1个
B. 2个
C. 取决于系统资源
D. 3个
E. 想要几个有几个
答案:A
<?php abstract class a{ function __construct() { echo "a"; } } $a = new a(); ?>
A. a
B. 一个错误警告
C. 一个致命性的报错
答案:C 因为类a是抽象类,不能被实例化
<?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()
来显示调用父类构造函数。
<?php class MyClass{ public static function justDoIt(){ } } ?>
是的
单例模式,工厂模式单例模式 实现代码 见 第二题
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()
防止 Sql 注入,对特殊字符进行转义、过滤或者使用预编译的 sql 语句绑定变量。
最小权限原则,特别是不要用 root 账户,为不同的类型的动作或者组建使用不同的账户。
当 sql 运行出错时,不要把数据库返回的错误信息全部显示给用户,以防止泄露服务器和数据库相关信息。
索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),它们包含对数据表里所有记录的引用指针。
普通索引(由关键字 KEY 或 INDEX 定义的索引)的唯一任务是 加快对数据的访问速度 。
普通索引允许被索引的数据列包含重复的值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字 UNIQUE 把它定义为一个 唯一索引 。
也就是说,唯一索引可以 保证数据记录的唯一性 。
主键,是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字 PRIMARY KEY 来创建。
索引可以覆盖多个数据列,如像 INDEX(columnA, columnB)索引,这就是 联合索引 。
索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度,因为在执行这些写操作时,还要操作索引文件。
请实现下列需求:(1).数据库结构。无需写建表语句,用类似下面的表格,描述清楚即可,注意,要在索引栏中注明是否需要创建索引,以及要创建的索引的类型
表名 | table_aaa | ||
---|---|---|---|
字段名 | 字段说明 | 字段类型 | 索引 |
name | 姓名 | varchar(64) | 唯一索引 |
gender | 性别 | enum(‘M’,‘F’) |
(2).用一个 sql 语句查询出发表留言数量大于 10 条的用户名及其留言数量,查询结果按文章数量降序排列
参考答案:用户表结构如下:
表名 | user | ||
---|---|---|---|
字段名 | 字段说明 | 字段类型 | 索引 |
user_id | 用户编号 | int unsigned | 主键 |
name | 用户名 | varchar(30) | |
password | 密码 | char(32) | |
邮箱 | 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
(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)
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;
区别一,定长和变长
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 的效率高,没有碎片,尤其更新比较频繁的时候,方便数据文件指针的操作。但不够灵活,在实际使用时,应根据实际需求来选用合适的数据类型。
(65535 - 1 - 2 - 4 - 30 * 3 )/3
最简单的办法是使用字符串(varchar)来保存,如果从效率考虑的话,可以将 ip 保存为整型(unsigned int),使用 php 或 mysql 提供的函数将 ip 转换为整型,然后存储即可。
PHP 函数:long2ip()和 ip2long()
MySQL 函数:inet_aton()和 inet_ntop
编号 | 姓名 | 科目 | 分数 |
---|---|---|---|
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;
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';
表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;
current_time()用于取得当前时间date_format(datetime, format)用于格式化日期,如:select date_format(now(),'%Y%m%d');
SELECT members.username
FROM members
ORDER BY posts DESC
LIMIT 10;
针对查询较慢的语句,可以使用explain 来分析该语句具体的执行情况。
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;
表 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>"; }
表名 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 = '张四'
整型,并设置为 AUTO_INCREMENT
事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。ACID 四大特性,原子性、隔离性、一致性、持久性。
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() 那样)。
方法一,使用 show table status ,然后获取 auto_increment 的值
方法二,使用 select max(id) + 1 from table
方法三,如果是刚插入记录,可以使用 last_insert_id() + 1 获得
SELECT * FROM login WHERE name LIKE ‘%admin%’ LIMIT 10;
使用case语句,如下:
SELECT CASE WHEN A > B THEN A ELSE B END, CASE WHEN B > C THEN B ELSE C END FROM table
MyISAM、InnoDB、BDB(Berkeley DB)、Merge、Memory(Heap)、Example、Federated、Archive、CSV、Blackhole、MaxDB 等等十几个引擎。
一般第 3 范式就足以,用于表结构的优化,这样做既可以避免应用程序过于复杂同时也避免了 SQL 语句过于庞大所造成系统效率低下。
第一范式:若关系模式 R 的每一个属性是不可再分解的,且有主键,则属于第一范式。
第二范式:若 R 属于第一范式,且所有的非主键属性都完全函数依赖于主键属性,则满足第二范式。
第三范式:若 R 属于第二范式,且所有的非主键属性没有一个是传递函数依赖于候选主键属性,则满足第三范式。
在实际使用中,可以根据需求适当的逆范式。
mysql_insert_id();如果上一查询没有产生 AUTO_INCREMENT 的值,则 mysql_insert_id()返回 0。
mysql_query(“set names utf8”);
主要有以下几个步骤:
查询优化
MyISAM,innoDB
题目多了一个括号,在 where 后面,但不影响题目的意思,可以将 sql 语句优化如下:select * from table example where a and b and c
先说什么是 交叉连接 ,交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配。
内连接则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的行。
而 外连接 其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个表中的所有数据行,这三种情况依次称之为左外连接,右外连接,和全外连接。
左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那
些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以 NULL 来填充。
右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。
左连接和右连接可以互换,MySQL 目前还不支持全外连接。
MySQL,SQL Server, Oracle,Sybase, informix, DB2 等
首先是有用户表,如下:
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 ;
```
当需要处理复杂的查询和运算时,可以使用存储过程。
从应用分层的原则,大量使用存储过程导致业务逻辑分散在 DB 和应用服务器层,不利于维护和更新。
总体来说,存储程序可以用,但要慎重,最好只用来维护,不用于业务逻辑和支撑高并发高性能的东西。