js自定义对象

javascript进阶之对象篇

一,概述 

在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类、Hashtable类等等。 

目前在Javascript中,已经存在一些标准的类,例如Date、Array、RegExp、String、Math、Number等等,这为我们编程提供了许多方便。但对于复杂的客户端程序而言,这些还远远不够。 

与Java不同,Java2提供给我们的标准类很多,基本上满足了我们的编程需求,但是Javascript提供的标准类很少,许多编程需求需要我们自己去实现,例如Javascript没有哈西表Hashtable,这样的话在处理键值方面就很不方便。 

因此,我个人认为一个完整的Javascript对象视图应该如下: 



二,基本概念 

1,自定义对象。 
根据JS的对象扩展机制,用户可以自定义JS对象,这与Java语言有类似的地方。 
与自定义对象相对应的是JS标准对象,例如Date、Array、Math等等。 
2,原型(prototype) 
在JS中,这是一种创建对象属性和方法的方式,通过prototype可以为对象添加新的属性和方法。 
通过prototype我们可以为JS标准对象添加新的属性和方法,例如对于String对象,我们可以为其添加一个新的方法trim()。 
与严格的编程语言(例如Java)不同,我们可以在运行期间为JS对象动态添加新的属性。 

三,语法规则 

1,对象创建方式 

1)对象初始化器方式 

格式:objectName = {property1:value1, property2:value2,…, propertyN:valueN} 
property是对象的属性 
value则是对象的值,值可以是字符串、数字或对象三者之一 
例如: var user={name:“user1”,age:18}; 
    var user={name:“user1”,job:{salary:3000,title:programmer} 
以这种方式也可以初始化对象的方法,例如: 
    var user={name:“user1”,age:18,getName:function(){ 
                return this.name; 
          }          
    } 
后面将以构造函数方式为重点进行讲解,包括属性和方法的定义等等,也针对构造函数的方式进行讲解。 


2)构造函数方式 

编写一个构造函数,并通过new方式来创建对象,构造函数本可以带有构造参数 
例如: 
function User(name,age){ 
          this.name=name; 
          this.age=age; 
          this.canFly=false; 
    } 
    var use=new User(); 

2,定义对象属性 

1)JS中可以为对象定义三种类型的属性:私有属性、实例属性和类属性,与Java类似,私有属性只能在对象内部使用,实例属性必须通过对象的实例进行引用,而类属性可以直接通过类名进行引用。 

2)私有属性定义 
私有属性只能在构造函数内部定义与使用。 
语法格式:var propertyName=value; 
例如: 
function User(age){ 
           this.age=age; 
           var isChild=age<12; 
           this.isLittleChild=isChild; 
    } 
    var user=new User(15); 
    alert(user.isLittleChild);//正确的方式 
    alert(user.isChild);//报错:对象不支持此属性或方法 

3)实例属性定义,也存在两种方式: 
prototype方式,语法格式:functionName.prototype.propertyName=value 
this方式,语法格式:this.propertyName=value,注意后面例子中this使用的位置 
上面中value可以是字符创、数字和对象。 
例如: 
function User(){ } 
User.prototype.name=“user1”; 
User.prototype.age=18; 
var user=new User(); 
alert(user.age); 
—————————————– 
function User(name,age,job){ 
         this.name=“user1”; 
         this.age=18; 
         this.job=job; 
    } 
    alert(user.age); 

3)类属性定义 
语法格式:functionName.propertyName=value 
例如: 
function User(){ } 
User.MAX_AGE=200; 
User.MIN_AGE=0; 
alert(User.MAX_AGE); 
参考JS标准对象的类属性: 
Number.MAX_VALUE //最大数值 Math.PI //圆周率 

4)对于属性的定义,除了上面较为正规的方式外,还有一种非常特别的定义方式,语法格式: obj[index]=value 
例子: 
     function User(name){ 
             this.name=name; 
             this.age=18; 
             this[1]=“ok”; 
             this[200]=“year”; 
     } 
     var user=new User(“user1”); 
     alert(user[1]); 
     在上面例子中,要注意:不同通过this[1]来获取age属性,也不能通过this[0]来获取name属性,即通过index方式定义的必须使用index方式来引用,而没有通过index方式定义的,必须以正常方式引用 

3,定义对象方法 

1)JS中可以为对象定义三种类型的方法:私有方法、实例方法和类方法,与Java类似: 
私有方法只能在对象内部使用 
实例方法必须在对象实例化后才能使用 
类方法可以直接通过类名去使用 
注意:方法的定义不能通过前面所说的index方式进行。 
2)定义私有方法 
私有方法必须在构造函数体内定义,而且只能在构造函数体内使用。 
语法格式:function methodName(arg1,…,argN){ } 
例如: 
function User(name){ 
          this.name=name; 
          function getNameLength(nameStr){ 
              return nameStr.length; 
          } 
          this.nameLength=getNameLength(this.name);    
    } 
3)定义实例方法,目前也可以使用两种方式: 
prototype方式,在构造函数外使用,语法格式: 
functionName.prototype.methodName=method; 
或者 
functionName.prototype.methodName=function(arg1,…,argN){}; 
this方式,在构造函数内部使用,语法格式: 
this.methodName=method; 
或者 
this.methodName=function(arg1,…,argN){}; 
上面的语法描述中,method是外部已经存在的一个方法,methodName要定义的对象的方法,意思就是将外部的一个方法直接赋给对象的某个方法。 
以function(arg1,…,argN){}的方式定义对象方法是开发人员应该掌握的。 

定义实例方法的一些例子:例子1 
function User(name){ 
       this.name=name; 
       this.getName=getUserName; 
       this.setName=setUserName; 

function getUserName(){ 
       return this.name; 

Function setUserName(name){ 
       this.name=name; 


定义实例方法的一些例子:例子2 
function User(name){ 
       this.name=name; 
       this.getName=function(){ 
               return this.name; 
       }; 
       this.setName=function(newName){ 
               this.name=newName; 
       }; 


定义实例方法的一些例子:例子3 
function User(name){ 
       this.name=name; 

User.prototype.getName=getUserName; 
User.prototype.setName=setUserName(); 
function getUserName(){ 
       return this.name; 

Function setUserName(name){ 
       this.name=name; 


定义实例方法的一些例子:例子4 
function User(name){ 
       this.name=name; 

User.prototype.getName=function(){ 
       return this.name; 
}; 
User.prototype.setName=function(newName){ 
       this.name=newName; 
}; 

4)定义类方法 
类方法需要在构造函数外面定义,可以直接通过构造函数名对其进行引用。 
语法格式: 
functionName.methodName=method; 
或者 
functionName.methodName=function(arg1,…,argN){}; 
例子: 
function User(name){ 
            this.name=name; 
    } 
    User.getMaxAge=getUserMaxAge; 
    function getUserMaxAge(){ 
           return 200; 
    } 
    或者 
    User.getMaxAge=function(){return 200;}; 
    alert(User.getMaxAge()); 

4,属性与方法的引用 

1)从可见性上说: 
私有属性与方法,只能在对象内部引用。 
实例属性与方法,可以在任何地方使用,但必须通过对象来引用。 
类属性与方法,可以在任何地方使用,但不能通过对象的实例来引用(这与Java不同,在Java中静态成员可以通过实例来访问)。 
2)从对象层次上说: 
与Java bean的引用类似,可以进行深层次的引用。 
几种方式: 
简单属性:obj.propertyName 
对象属性:obj.innerObj.propertyName 
索引属性:obj.propertyName[index] 
对于更深层次的引用与上面类似。 
3)从定义方式上说: 
通过index方式定义的属性,必须通过index方式才能引用。 
通过非index方式定义的属性,必须通过正常的方式才能引用。 
另外注意:对象的方法不能通过index方式来定义。 

5,属性与方法的动态增加和删除 
1)对于已经实例化的对象,我们可以动态增加和删除它的属性与方法,语法如下(假定对象实例为obj): 
动态增加对象属性 
obj.newPropertyName=value; 
动态增加对象方法 
    obj.newMethodName=method或者=function(arg1,…,argN){} 
动态删除对象属性 
    delete obj.propertyName 
动态删除对象方法 
    delete obj.methodName 
    
2)例子: 
    function User(name){ 
             this.name=name; 
             this.age=18; 
    } 
    var user=new User(“user1”); 
    user.sister=“susan”; 
    alert(user.sister);//运行通过 
    delete user.sister; 
    alert(user.sister);//报错:对象不支持该属性 

    user.getMotherName=function(){return “mary”;} 
    alert(user.getMotherName());//运行通过 
    delete user.getMotherName; 
    alert(user.getMotherName());//报错:对象不支持该方法 

四,总结 

1,自定义对象机制,是JS最为吸引人的机制之一,对于C++和Java程序员而言,这简直太棒了! 
2,对象创建存在两种方式:对象初始化器和构造函数。 
3,对象属性和方法,具有可见性的约束,不同可见性的属性和方法,其定义方式也不一样。

PHP:$_SERVER中,QUERY_STRING、REQUEST_URI、SCRIPT_NAME与PHP_SELF四个变量的区别

,$_SERVER["QUERY_STRING"]
说明:查询(query)的字符串

2,$_SERVER["REQUEST_URI"]
说明:访问此页面所需的URI

3,$_SERVER["SCRIPT_NAME"]
说明:包含当前脚本的路径

4,$_SERVER["PHP_SELF"]
说明:当前正在执行脚本的文件名

实例:
1,http://www.sjolzy.com/ (直接打开主页)
结果:
$_SERVER["QUERY_STRING"] = ""
$_SERVER["REQUEST_URI"] = "/"
$_SERVER["SCRIPT_NAME"] = "/index.php"
$_SERVER["PHP_SELF"]     = "/index.php"

2,http://www. sjolzy.com/?p=222 (附带查询)
结果:
$_SERVER["QUERY_STRING"] = "p=222"
$_SERVER["REQUEST_URI"] = "/?p=222"
$_SERVER["SCRIPT_NAME"] = "/index.php"
$_SERVER["PHP_SELF"]     = "/index.php"

3,http://www. sjolzy.com/index.php?p=222&q=sjolzy
结果:
$_SERVER["QUERY_STRING"] = "p=222&q=sjolzy"
$_SERVER["REQUEST_URI"] = "/index.php?p=222&q= sjolzy"
$_SERVER["SCRIPT_NAME"] = "/index.php"
$_SERVER["PHP_SELF"]     = "/index.php"

$_SERVER["QUERY_STRING"]获取查询语句,实例中可知,获取的是?后面的值
$_SERVER["REQUEST_URI"] 获取http://www.biuuu.com后面的值,包括/
$_SERVER["SCRIPT_NAME"] 获取当前脚本的路径,如:index.php
$_SERVER["PHP_SELF"] 当前正在执行脚本的文件名

 

当前url:"http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']

 

总结一下,对于QUERY_STRING,REQUEST_URI,SCRIPT_NAME和PHP_SELF,深入了解将有利于我们在$_SERVER函数中正确调用这四个值。通过实例详解$_SERVER函数中QUERY_STRING,REQUEST_URI,SCRIPT_NAME和PHP_SELF掌握四个变量之间的区别。

HTML代码优化

目录
一. 为什么要优化?
二. 优化原则
三. 优化技巧
四. SEO
五. 关于网页标准

  1. 何谓标准?
  2. 使用标准价值在哪?
  3. 团队合作流程
  4. 如何实现

六. 实例分析

  1. 删除空标签
  2. 合并标签
  3. 合理安排表格布局
  4. 表格列表优化
  5. 利用<div>简化代码

 




一. 为什么要优化?

  1. 节省带宽
    服务器带宽是有限制的,为了支持更多在线人数,可以租用更多带宽,也可以增加服务器,但如果能通过优化代码减小网页体积,例如减少50%,那原本支持1000人同时在线的带宽现在就可以支持2000人了,这样就节省了昂贵的带宽费用
  2. 利于程序员编写代码
    静态页面转为动态页面时,经常要分析结构,把重复代码改为循环,因此简洁的代码有利用提高效率
  3. 减少页面下载及解析时间
    虽然现在大部分都是宽带,带宽非常充足,但一般访客都不只打开一个页面,而是同时访问多个网站,加上聊天、下载等工具占用一定带宽,这样带宽就显得拥挤了,减少页面体积可以缩短下载时间,同时也能减少客户端浏览器的解析时间


二. 优化原则

  1. 不影响原外观
  2. 不要把整个页面放到一个table里面
  3. 不要嵌套太多表格,因为表格需要代码全部下载才能显示出来
  4. 不要用太大、太多Flash动画
  5. 不要用太多JavaScript特效,用户是来看内容不是看特效
  6. 尽量把大图切成小图,可以再次利用的图片就无需再另切图了


三. 优化技巧

  1. 使用静态页面可以有效减少服务器资源占用
  2. 重复使用的样式写到外部CSS文件,一般是整站一个共用CSS文件,各独立栏目共用一个CSS文件,某页面特有的可以写在本页面内
  3. 需要从数据库读取但又不经常更换的内容,写到单独JS文件,例如各个栏目,内容是从数据库获取的,但又不会频繁更换
  4. 需要链接外部的Flash、图片等,可以用iframe标签,避免外部网络延迟而拖慢整体页面显示


四. SEO
SEO全称是Search Engine Optimization,即针对搜索的优化。网站在推出之后,最大的难点莫过于推广,而通过搜索引擎带来的流量是不可忽视的,如何通过优化代码使搜索引擎最大限度的收录,也就成为重要课题。

  1. 明确的标题,即<title>标签
    例如搜索“电脑”,搜索结果有2个页面,一个标题包含“电脑”,另一个只包含在正文<body>标签中,第一个页面会排第一位。
    根据观察,各搜索引擎都会对标题进行截断,具体为baidu20字、google30字、Yahoo20字、MSN Search25字(均为中文)
    所以标题不能过长,要跟正文内容符合,例如一个《碟中碟》电影页面,标题可以为“碟中碟 汤姆克鲁斯 酷娱乐 91Q.com”
  2. META标记
    <meta name="description" content="网页简述">
    <meta name="keywords" content="关键字">
  3. 链接文本
    文章、新闻经常标题过长,为了页面美观而不得不截短,加入title属性,一来有利于访客阅读完整标题,也有利于搜索引擎的收录
    <a href="test.htm" title="浅谈Flash ActionScript代码优化">浅谈Flash ActionScr…</a>
  4. 图像
    同上,相应属性为alt
  5. 另外其它如<h1><input>都可以加入关键字
    SEO还包括其它方面的内容,以上只是在代码方面的优化


五. 关于网页标准

  1. 何谓标准?
    网页标准是进2年流行的话题,简单的说,就是抛弃HTML+Table改用XHTML+CSS来写网页,做到结构和样式分离。XHTML标准分过渡型和严格型,其中过渡型可以使用table,而严格型只能用div来进行布局。
  2. 使用标准价值在哪?
    1. 易于维护
      HTML代码发展到现在,已经变得十分臃肿,这对网页设计师来说是非常不利的,特别在重构大型网站的时候,经常显得力不从心
    2. 加速开发
      通过结构与表现层分离,可以优化团队工作流程,提高工作效率
    3. 拓展访问渠
      不需做大改动即可在PDA等掌上设备浏览
    4. 节约带宽成本
      一般运用网页标准进行网站重构之后,代码可以减少一半以上,每页面如果能减少几十K,乘以访问量,一个月下来,就可以节约昂贵的带宽费用了
    5. 提高用户体验
      干净简介的代码,总比臃肿复杂代码显示得快,用户不必再忍受缓慢的访问速度
  3. 团队合作流程
  4. 如何实现
    1. XHTML标签和属性全部要小写,比如<BODY><HEAD><BR />
    2. 标签注意要关闭,常见的比如<br /><input />等,还有<img src="" alt="" />,别把alt属性忘记了
    3. 不用<font>标签,可以用<span>标签加CSS定义
    4. XHTML不具备HTML标签所有属性和值,例如居中align='absmiddle',在XHTML里面是没有absmiddle值的,只有top/bottom/right/left/center,某些属性例如onload也被废除了
    5. 公用函数<script></script>放在<head></head>之间,共有的写在单独文件再在网页导入
    6. 尽量用div布局而不用table,但table还是可以用的


六. 实例分析

  1. 删除空标签
    <td height="23"><div align="left" class="lineh15 style4"> <a href="#">剧情看点: </a><%=exStr1%></div><div align="left"></div></td>
    <div align="left"></div> 是可以去掉的
  2. 合并标签
    <td height="23"><div align="left"><strong><%=sShowName%></strong></div></td>
    div太多,不仅影响浏览器解析,还可能因为未关闭标签造成错乱,也给编辑带来困难,例如用DW打开,如下图


    表格和div密密麻麻的N多线
    <div align="left"> 的作用是左对其,其实在表格设置水平左对其也一样,修改后为
    <td height="23" align="left"><strong><%=sShowName%></strong></td>
  3. 合理安排表格布局

    上图红色表示表格,绿色表示div层,可以看出里面嵌套了4层表格,同时也用了div来使文字靠左,其实<td>标签也有水平位置的align属性,而且表格默认就是左对齐,所以div标签完全可以取消,整理一下,结果如下图
  4. 表格列表优化


    如上图,红色表示表格,绿色是DIV,可以看出套了很多表格,整理一下所要的效果,无非是外面圆角边框加里面数据,其中数据又分上下两部分,上面是图片加文字,而下面是文字。
    下图是优化后,可以看出只有2个表格嵌套,结构很简洁。


    优化过程:
    1. 将【本类排行】表格,放到外面表格中,作为一行而不是单独表格
    2. 排行第一的电影,原先用了几个表格嵌套,现改用div将图片浮动左边,文字会自动插入到右边空白处
    3. 下面的2-10排行不再用表格分割,改用<li>标签,再用css进行修饰

    代码片段:
    CSS部分
    #test{
    color:#000000;
    list-style:none;
    line-height:200%;
    margin:5px 0 0 10px;
    }
    #test li{
    border-bottom:1px dotted #FFFFFF;
    }

    排行列表
    <li>2.新精武门</li>
    <li>3.赌圣2之街头赌圣</li>
    <li>4.流氓状元</li>
    <li>5.韩2005爆笑性喜..</li>
    <li>6.我的野蛮本色</li>
    <li>7.捣蛋三人组-整蛊王</li>
    <li>8.笑林小子2之乌龙院</li>
    <li>9.妓女竞选总统记</li>
    <li>10.一见钟性</li>

    优化后代码字数为原来32%
  5. 利用<div>简化代码   (该节不全)

    如上图,五部影片所在的表格,先是用<td>分割,再用<div>定义样式(主要是定义字体大小),其中影片截图,为了显示圆边框,又套了一个表格,表格采用九宫格布置。单个电影代码如下:
    <td height="52" align="center" class="lineh15"><div align="left" class="size14">
       <table border="0" cellspacing="0" cellpadding="0">
         <tr>
           <td width="6" height="6"><img src="http://www.21ido.com/bbs/images/ttl.jpg" width="6" height="6"></td>
           <td background="http://www.21ido.com/bbs/images/tt.jpg"><img src="http://www.21ido.com/bbs/images/tt.jpg" width="1" height="6"></td>
           <td width="6" height="6"><img src="http://www.21ido.com/bbs/images/ttr.jpg" width="6" height="6"></td>
         </tr>
         <tr>
           <td background="http://www.21ido.com/bbs/images/tl.jpg"><img src="http://www.21ido.com/bbs/images/tl.jpg" width="6" height="1"></td>
           <td width="65" height="75"><a href="movie2.jsp?sTypeId=164&sPgmId=176"><img src="http://cqmovie.bqol.com.cn:8092/logo/凤凰大视野:天空铁路01.jpg" width="92" height="124" border="0"></a></td>
           <td background="http://www.21ido.com/bbs/images/tr.jpg"><img src="http://www.21ido.com/bbs/images/tr.jpg" width="6" height="1"></td>
         </tr>
         <tr>
           <td width="6" height="6"><img src="http://www.21ido.com/bbs/images/tbl.jpg" width="6" height="6"></td>
           <td background="http://www.21ido.com/bbs/images/tb.jpg"><img src="http://www.21ido.com/bbs/images/tb.jpg" width="1" height="6"></td>
           <td width="6" height="6"><img src="http://www.21ido.com/bbs/images/tbr.jpg" width="6" height="6"></td>
         </tr>
         <tr>
           <td class="lineh15" colspan="3"><div align="center"><span class="title-16px120b-B00000"><a href="movie2.jsp?sTypeId=164&sPgmId=176">北纬17度线</a></span></div></td>
         </tr>
       </table>
    </div></td>

MySQL视图的应用

 

MySQL视图的应用

视图也称虚表,包括执行某个查询返回的一组记录。视图可以简化获取数据的方法,并通过别名来实现抽象查询。

实例258:创建视图

实例说明

为了简化查询,在实际项目开发过程中,通常可以采用为数据库中的某个表建立视图的方式。在建立的视图中只有开发人员所关心的字段。运行本实例,如图9.6所示,分别在图中输入登录用户的用户名和密码,单击“进入”按钮后,如果用户输入错误的用户名或密码,则给出错误提示,反之如果输入的用户名和密码正确,则提示成功登录。由于本实例采用视图建立了虚表,所以应首先在“命令提示符”下建立视图,如图9.7所示。

图9.6 用户身份验证
图9.7 创建视图

技术要点

MySQL中创建视图可以通过create view语句来实现,具体创建格式如下:

$create [ or deplace] [algorithm={merge | temptable | undefined}] view view_name 
[( column_list)] as select_statement [with [cascaded | local] check option]

algorithm={merge | temptable | undefined}属性用于优化MySQL视图的执行,该属性有3个可用的设置。下面将介绍这3个设置的使用方法。

merge:该参数使MySQL执行视图时传入的任何子句合并到视图的查询定义中。
temptable:如果视图低层表中的数据有变化,这些变化将在下次通过表时立即反映出来。
undefined:当查询结果和视图结果为一一对应关系时,MySQL将algorithm设定为temptable。
view_name:新建视图的名称。
select_statement:SQL查询语句用于限定虚表的内容。

实现过程

(1)建立数据库及数据表,本实例中将数据表命名为tb_admin。
(2)建立完数据表后,就可以在命令提示符下建立视图。创建视图的代码如下:

 

create view chkadmin as select name, pwd from tb_admin


创建完视图chkadmin后,该视图中只含有name和pwd两个字段,这样会给密码验证工作带来很大的方便。
(3)建立与MySQL数据库的连接。代码如下:

 

<?php
$conn=mysql_connect("localhost","root","root");
mysql_select_db("db_database09",$conn);
mysql_query("set names gb2312");
?>

(4)判断用户是否单击了“进入”按钮,如果是则通过视图chkadmin对用户身份进行验证。该过程代码如下:

 

<?php
if($_POST[submit]!="")
{
include_once("conn.php");
$name=$_POST[name];
$pwd=$_POST[pwd];
$sql=mysql_query("select * from chkadmin where name='".$name."' and
pwd='".$pwd."'",$conn);
$info=mysql_fetch_array($sql);
if($info==false){
echo "<script>alert('用户名或密码输入错误!');history.back();</script>";
exit;
}
else
{
echo "<br><div align=center>登录成功!</div>";
}
}
?>

举一反三

根据本实例,读者可以:
利用视图实现用户信息注册。
利用视图实现商品信息的降序输出。

实例259:修改视图
这是一个修改视图的实例
录像位置:光盘\mingrisoft\09\259

实例说明

为了提高工作效率,对不满足条件的视图可以通过修改的方式进行更改。实现本实例,首先应在数据库中创建数据表tb_changeview,该表也可以在phpMyAdmin中创建,如图9.8所示。打开“命令提示符”窗口,创建视图userinfo,如图9.9所示。更改视图userinfo,如图9.10所示。

 

图9.8 创建表changeview
图9.9 创建新视图

 

图9.10 修改视图

技术要点

MySQL中修改视图可以通过alter view语句实现,alter view语句具体使用说明如下:

alter view [algorithm={merge | temptable | undefined} ]view view_name 
[(column_list)] as select_statement[with [cascaded | local] check option]

algorithm:该参数已经在创建视图中作了介绍,这里不再赘述。
view_name:视图的名称。
select_statement:SQL语句用于限定视图。

实现过程

(1)建立数据库及数据表,本实例中将数据表命名为tb_changeview。
(2)创建视图userinfo。代码如下:

 

create view userinfo as select * from tb_changeview

(3)查询视图userinfo。代码如下:

 

select * from userinfo

查看执行结果,可以发现tb_changeview表中的所有的字段都一一列出。
(4)下面开始修改视图,要求修改后只列出username字段。代码如下:

 

alter view userinfo as select * from tb_changeview

(5)重新查询视图userinfo,从结果中可以发现这时只列出username一个字段,从而说明视图修改成功。
(2)建立index.php文件,用于实现多表之间的查询,如果学生表和成绩表中有满足条件的记录,则显示这些记录,否则提示没有相关信息。代码如下:

举一反三

根据本实例,读者可以:

实现修改存储商品信息的视图。
实现修改存储用户注册信息的视图。

实例260:应用视图
这是一个应用视图的实例
实例位置:光盘\mingrisoft\09\260

实例说明

在实际的Web开发过程中,多个数据表中可能有很多的字段,但某个模块可能只需要其中的几个字段。为了提高查询速度和简便操作,可以将该模块需要的字段单独提取出来放在某视图中,例如本实例涉及到学生表和成绩表,在建立的视图中只含有与学生成绩有关的字段,如图9.11所示。运行本实例,如图9.12所示,图中的查询结果显示的字段即为视图中的所有字段。

 

图9.11 创建视图
图9.12 学生成绩列表

技术要点

本实例创建的视图涉及到多表查询,这说明多个表之间可以通过视图来组合为一个整体,这样对视图的操作相当于多表查询。但如果这些表中有相同的字段,必须按如下方式书写重名的字段:

表名1.字段名,表名2.字段名……

实现过程

(1)在“命令提示符”窗口下为数据库建立视图。代码如下:

create view scoreinfo as select sno,sname,
yw,wy,sx from tb_student,tb_score where tb_student.id=tb_score.sid


(2)建立数据库连接文件conn.php。代码如下:

<?php
$conn=new mysqli("localhost","root","root","db_database09");
$conn->query("set names gb2312");
?>


(3)查询视图scoreinfo中的内容,并显示查询结果。代码如下:

<?php
include_once("conn.php");
$sql=$conn->query("select * from scoreinfo");
$info=$sql->fetch_array(MYSQLI_ASSOC);
if($info==NULL)
{
echo "暂无学生信息";
}
else
{
do
{
?>
<tr>
<td height="20" bgcolor="#FFFFFF"><div align="center">
<?php echo $info[sno];?></div></td>
<td bgcolor="#FFFFFF"><div align="center"><?php echo $info[sname];?></div></td>
<td bgcolor="#FFFFFF"><div align="center"><?php echo $info[yw];?></div></td>
<td bgcolor="#FFFFFF"><div align="center"><?php echo $info[wy];?></div></td>
<td bgcolor="#FFFFFF"><div align="center"><?php echo $info[sx];?></div></td>
</tr>
<?php
}
while(  $info=$sql->fetch_array(MYSQLI_ASSOC));
}
?>


举一反三

根据本实例,读者可以:

实现多表之间的嵌套查询。
实现多表之间相同信息的提取

MySQL存储过程

 

MySQL存储过程

MySQL 5.0以后的版本开始支持存储过程,存储过程具有一致性、高效性、安全性和体系结构等特点,本节将通过具体的实例讲解PHP是如何操纵MySQL存储过程的。

实例261:存储过程的创建

实例说明

为了保证数据的完整性、一致性,提高应用的性能,常采用存储过程技术。MySQL 5.0之前的版本并不支持存储过程,随着MySQL技术的日趋完善,存储过程将在以后的项目中得到广泛的应用。本实例将介绍在MySQL 5.0以后的版本中创建存储过程。

技术要点

一个存储过程包括名字、参数列表,以及可以包括很多SQL语句的SQL语句集。下面为一个存储过程的定义过程:

create procedure proc_name (in parameter integer)
begin
declare variable varchar(20);
if parameter=1 then
set variable='MySQL';
else
set variable='PHP';
end if;
insert into tb (name) values (variable);
end;

MySQL中存储过程的建立以关键字create procedure开始,后面紧跟存储过程的名称和参数。MySQL的存储过程名称不区分大小写,例如PROCE1()和proce1()代表同一个存储过程名。存储过程名不能与MySQL数据库中的内建函数重名。

存储过程的参数一般由3部分组成。第一部分可以是in、out或inout。in表示向存储过程中传入参数;out表示向外传出参数;inout表示定义的参数可传入存储过程,并可以被存储过程修改后传出存储过程,存储过程默认为传入参数,所以参数in可以省略。第二部分为参数名。第三部分为参数的类型,该类型为MySQL数据库中所有可用的字段类型,如果有多个参数,参数之间可以用逗号进行分割。

MySQL存储过程的语句块以begin开始,以end结束。语句体中可以包含变量的声明、控制语句、SQL查询语句等。由于存储过程内部语句要以分号结束,所以在定义存储过程前应将语句结束标志“;”更改为其他字符,并且该字符在存储过程中出现的几率也应该较低,可以用关键字delimiter更改。例如:

mysql>delimiter //

存储过程创建之后,可用如下语句进行删除,参数proc_name指存储过程名。
drop procedure proc_name

实现过程

(1)MySQL存储过程是在“命令提示符”下创建的,所以首先应该打开“命令提示符”窗口。
(2)进入“命令提示符”窗口后,首先应该登录MySQL数据库服务器,在“命令提示符”下输入如下命令:

mysql –u用户名 –p用户密码

(3)更改语句结束符号,本实例将语句结束符更改为“//”。代码如下:

delimiter //

(4)创建存储过程前应首先选择某个数据库。代码如下:

use 数据库名

(5)创建存储过程。
(6)通过call语句调用存储过程。

举一反三

根据本实例,读者可以:

利用存储过程实现多表查询。
利用存储过程对商品信息进行降序输出。

实例262:使用存储过程实现用户注册

实例说明

在数据库系统开发过程中,如果能够应用存储过程,可以使整个系统的运行效率有明显的提高,本实例将向读者介绍MySQL 5.0版本中存储过程的创建以及PHP调用MySQL存储过程的方式。运行本实例前,首先应在“命令提示符”下创建如图9.13所示的存储过程,然后运行本实例,如图9.14所示,在图中的文本框中输入注册信息后,单击“注册”按钮,即可将用户填写的注册信息保存到数据库中,最终保存结果如图9.15所示。

图9.13 创建存储过程

图9.14 录入注册信息

图9.15 注册信息被存储到MySQL数据库

技术要点

本实例的关键技术是如何创建传入参数的存储过程,具体实现代码如下:

delimiter //
create procedure pro_reg (in nc varchar(50), in pwd varchar(50), 
in email varchar(50),in address varchar(50))
begin
insert into tb_reg (name, pwd ,email ,address) values (nc, pwd, email, address);
end;
//

“delimiter //”的作用是将语句结束符更改为“//”。
“in nc varchar(50)……in address varchar(50)”表示要向存储过程中传入的参数。

实现过程

(1)通过PHP预定义类mysqli,实现与MySQL数据库的连接。代码如下:

$conn=new mysqli("localhost","root","root","db_database09");
$conn->query("set names gb2312");

(2)调用存储过程pro_reg,实现将用户录入的注册信息保存到数据库。代码如下:
if($sql=$conn->query("call pro_reg('".$nc."','".$pwd."','".$email."','".$address."')"))
{
echo "<SCRIPT>alert('用户注册成功!');</SCRIPT>";
}
else
{
echo "<SCRIPT>alert('用户注册失败!');</SCRIPT>";
}

举一反三

根据本实例,读者可以:
在BBS论坛中,利用存储过程实现将用户所发帖子保存到数据库。
在学生信息管理系统中,利用存储过程删除指定的学生信息。

MySQL触发器

 

MySQL触发器

触发器在数据库系统开发过程中具有非常重要的作用,例如可以防止有害数据录入数据库,可以改变或取消insert、update和delete语句的执行及在一个会话中监听数据库中的数据的改变。

实例263:创建触发器

实例说明

如果用户打算在数据库中通过触发器实现某一动作的监听,那么首先应该创建触发器,触发器是在“命令提示符”下创建的,如图9.16所示。

图9.16 触发器创建过程

技术要点

MySQL数据库创建触发器的格式如下:

create trigger <触发器名称>
{ before | after}
{insert | update | delete}
on <表名>
for each row
<触发器SQL语句>


create trigger <触发器名称>:创建一个新触发器,并指定触发器的名称。
{ before | after}:用于指定在insert、update或delete语句执行前触发还是在语句执行后触发。
on <表名>:用于指定响应该触发器的表名。
for each row:触发器的执行间隔,for each row 通知触发器每隔一行执行一次动作,而不是对整个表执行一次。
<触发器SQL语句>:触发器要执行的SQL语句,如果该触发器要执行多条SQL语句,要将多条语句放在begin…end块中。

实现过程

(1)在“命令提示符”下创建数据表tb_test。代码如下:

create table tb_test(t_id varchar(20),t_name varchar(20))


(2)将换行标记转换为“//”。代码如下:

delimiter //


(3)创建触发器,实现无论用户向表tb_test添加什么数据都使字段t_name的内容为“mrsoft”。代码如下:

create trigger test_tri
before insert on tb_test
for each row
set new.t_name='mrsoft'


(4)向表tb_test添加一条记录,并查看添加后的结果。代码如下:

insert into tb_test(t_id,t_name) values('mr0001', '123')//
select * from tb_test


举一反三

根据本实例,读者可以:
为某表创建触发器,要求在更新数据前触发。
为某表创建触发器,要求在删除数据前触发。

实例264:查看触发器

这是一个查看触发器的实例
录像位置:光盘\mingrisoft\09\264

实例说明

在MySQL数据库中,创建触发器前应先查看数据库中的触发器,这样既可以使开发人员对指定的数据库中的所有触发器及功能有一个直观的把握,而且又可以避免创建同名或类似功能的触发器。运行本实例,如图9.17所示,首先在图中的文本框中输入要查看触发器的数据库,然后单击“查看”按钮,即可将该数据库中所有的触发器的详细信息显示出来。

 

图9.17 查看触发器

技术要点

查看MySQL数据库中的触发器详细信息,可以通过如下语句实现:

show triggers

使用show triggers语句前应先指明要查看的数据库。
实现过程

(1)选择要查看触发器的数据库。代码如下:

$dbname=$_POST[name];
$conn=mysql_connect("localhost","root","root");
mysql_select_db($dbname,$conn);
mysql_query("set names gb2312");

(2)执行show triggers语句,并显示所查找到的触发器的详细信息。代码如下:

<?php 
$sql=@mysql_query("show triggers",$conn);
$info=@mysql_fetch_array($sql);
if($info==false)
{
?>
<tr>
<td height="25" colspan="5" bgcolor="#FFFFFF">
<div align="center">该数据库没有设置触发器!</div></td>
</tr>
<?php
}
else
{
do
{
?>
<tr>
<td height="25" bgcolor="#FFFFFF"><div align="center">
<?php echo $info[Trigger];?></div></td>
<td height="25" bgcolor="#FFFFFF"><div align="center">
<?php echo $info[Table];?></div></td>
<td height="25" bgcolor="#FFFFFF"><div align="center">
<?php echo $info[Event];?></div></td>
<td height="25" bgcolor="#FFFFFF"><div align="center">
<?php echo $info[Timing];?></div></td>
<td height="25" bgcolor="#FFFFFF"><div align="center">
<?php echo $info[Statement];?></div></td>
</tr>
<?php
}
while($info=mysql_fetch_array($sql));
}
?>


举一反三

根据本实例,读者可以:
在论坛中,通过触发器实现帖子的自动回复。
在留言板中,通过触发器实现将含有指定非法关键字的留言自动删除。