MySQL高级应用技术.doc_第1页
MySQL高级应用技术.doc_第2页
MySQL高级应用技术.doc_第3页
MySQL高级应用技术.doc_第4页
MySQL高级应用技术.doc_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

9.1 PHP的mysqli扩展在PHP5.0以后的版本中,不仅可以使用早期的MySQL数据库操纵函数,而且还可以使用mysqli扩展技术实现与MySQL数据库的信息交流。利用mysqli扩展技术不仅可以调用MySQL的存储过程、处理MySQL事务,而且还可以使访问数据库工作变得更加稳定。实例254 通过mysqli扩展技术实现数据库信息的检索实例说明在实际Web项目开发过程中,经常需要对大量信息进行检索,为了营造一种稳定快速的查询环境,本实例将介绍如何利用mysqli扩展技术实现商品信息的检索。运行本实例,如图9.1所示,在图中文本框中输入要查找的商品名称,单击“查找”按钮,如果该商品存在,则显示该商品的所有信息,否则提示没有查找到该商品。图9.1 商品信息检索技术要点本实例的关键技术是如何利用mysqli技术连接MySQL数据库,并实现数据库信息的检索。mysqli技术可以使用面向对象和面向过程两种编程思想,本实例将采用当今较为流行的面向对象的编程方式。采用面向对象的编程方式连接MySQL数据库,将通过PHP的预定义类mysqli实现,该类构造函数说明如下。mysqli类的构造函数一般由以下4个参数构成。hostname:MySQL服务器的地址或主机名。username:MySQL服务器中某用户的用户名。userpwd:MySQL服务器中某用户对应的用户密码。databasename:MySQL服务器中某数据库的名称,该参数可省,如果省略了该参数,则需要利用mysqli的成员函数select_db()指定数据库名称。所以mysqli预定义类的实例化形式如下:new mysqli(string hostname, string username, string userpwd ,string databasename );实现过程(1)建立如图9.1所示的页面,并建立conn.php文件实现与数据库的连接。代码如下:query(set names gb2312);?(2)判断提交按钮的值是否为空,如果不为空则开始执行查询。如果查询到用户要查询的商品,则显示商品的信息,否则提示没有查到该商品。该过程代码如下:query(select * from tb_goods where name like %.$name.%);$info=$sql-fetch_array(MYSQLI_ASSOC);if($info=NULL)echo 没有查找到该商品!;else?   商品名称 商品价格 商品数量 进货日期 fetch_array(MYSQLI_ASSOC);? 举一反三根据本实例,读者可以: 利用mysqli扩展技术,实现指定进货时间段内的商品信息检索。 利用mysqli扩展技术,实现论坛中注册用户信息的模糊查找。实例255 查看服务器连接错误报告实例说明作为PHP的黄金搭档MySQL数据库,在PHP项目开发过程中有着举足轻重的作用,这不仅因为MySQL是完全免费的,而且和PHP一样都是完全跨平台的。但在实际项目开发过程中,PHP与MySQL数据库产生连接错误是不可避免的,本实例将讲解如何实现尽可能早地发现这种连接错误。运行本实例,分别如图9.2及图9.3所示,图中错误的原因都是当连接数据库服务器时,用户密码输入错误所致。图9.2 显示错误内容图9.3 显示错误号技术要点在mysqli扩展技术中,可以使用两种方式获得错误报告,第一种是直接获取错误的原因,第二种是获取连接错误所代表的错误号。直接获取错误的名称可以使用函数mysqli_connect_error(),该函数的说明如下:string mysqli_connect_error(mysqli link)mysqli_connect_error()函数将返回一个错误消息,该消息对应利用mysqli扩展技术连接MySQL数据库时所产生的错误。获取连接MySQL数据库时产生的错误号可以使用函数mysqli_connect_errno(),该函数说明如下:int mysqli_connect_errno()如果在连接MySQL数据库服务器时出现了错误,就会产生一个该错误对应的消息数字,利用该函数就可以获取该数字。下面为连接MySQL数据库时可能发生错误的错误号及错误内容:1045:Access denied for user 用户名用户密码 (user password: YES)上述错误代表用户密码输入错误。2005:Unknown MySQL server host MySQL数据库服务器名(11004)上述错误代表MySQL数据库服务器名输入错误2013:Loset connection to MySQL server during query上述错误代表在执行查询时失去与MySQL数据库的连接。实现过程(1)建立index.php文件,用于建立PHP与MySQL数据库的连接,并输入错误的用户密码。代码如下:(2)建立index_1.php文件,用于建立PHP与MySQL数据库的连接,并输入错误的用户密码。代码如下:(3)分别执行index.php文件和index_1.php文件查看结果。举一反三根据本实例,读者可以: 输出MySQL数据库服务器名输入错误时的错误号。 输出MySQL数据库服务器名输入错误时的错误名称。实例256 通过mysqli扩展技术实现多表查询实例说明在实际的项目开发过程中,一个项目经常需要多个数据表来存储信息,并且这些表之间通过主键彼此相互联系。本实例将讲解如何实现多表之间的查询。运行本实例,如图9.4所示,图中的“学号”和“姓名”字段来自tb_student表,而其他字段来自tb_score表。图9.4 显示查询的结果技术要点利用mysqli技术实现多表查询,关键是如何实现多表之间通过主键进行连接。下面是本实例实现多表查询的代码:$sql=$conn-query(select * from tb_student,tb_score wheretb_student.id=tb_score.sid);实现多表之间的查询应在from关键字后列出所有的表名,并且表名之间用逗号进行分割。同时应在where关键字中指明多表之间的连接条件,例如本例中的tb_student.id=tb_score.sid,表明学生表和成绩表之间通过学生表的id字段和成绩表的sid字段进行连接。实现过程(1)建立conn.php文件,实现与MySQL数据库之间的连接。代码如下:query(set names gb2312);?(2)建立index.php文件,用于实现多表之间的查询,如果学生表和成绩表中有满足条件的记录,则显示这些记录,否则提示没有相关信息。代码如下:query(select * from tb_student,tb_score where tb_student.id=tb_score.sid);$info=$sql-fetch_array(MYSQLI_ASSOC);if($info=NULL) echo 暂无学生信息; else do? fetch_array(MYSQLI_ASSOC);?举一反三根据本实例,读者可以: 实现检索多表信息同时分页显示。 实现检索多表信息同时降序输出。实例257 通过mysqli扩展技术实现内存的回收实例说明为了有效利用服务器的内存空间,在获取较大结果集时,一旦结束操作,则有必要回收集合所需要的内存,由于mysqli技术可以采用面向对象和面向过程两种编程方式,所以与之对应的内存回收方式就有两种,将通过本实例讲解内存回收机制在项目开发过程中的价值和使用方法。运行本实例,如图9.5所示,图中为某班级3门主科成绩,并在显示完该班成绩后,对内存进行了回收。图9.5 显示查询结果技术要点PHP为了迎合不同开发习惯的程序员,在mysqli扩展技术中提供了面向对象和面向过程两种编程方式,所以实现内存回收也存在与之对应的两种方式。如果采用面向过程的编程方式可以通过如下函数实现内存回收:bool mysqli_close ( object link)link指mysqli_connect()函数返回的数据库连接句柄。如果采用面向对象的编程方式,可以通过如下语句实现:link-close()link指PHP预定义的mysqli类实例化后的对象。实现过程(1)建立conn.php文件,实现与MySQL数据库之间的连接。代码如下:query(set names gb2312);?(2)通过dowhile循环显示该班级所有学生的成绩。代码如下:query(select * from tb_student,tb_score where tb_student.id=tb_score.sid); $info=$sql-fetch_array(MYSQLI_ASSOC); if($info=NULL) echo 暂无学生信息; else do ? fetch_array(MYSQLI_ASSOC); (3)实现内存的回收。代码如下:$sql-close();$conn-close();举一反三根据本实例,读者可以: 在图书管理系统中,查询完图书信息后实现内存回收。 在聊天室中,用户每发一次信息实现一次内存回收。9.2 MySQL视图的应用视图也称虚表,包括执行某个查询返回的一组记录。视图可以简化获取数据的方法,并通过别名来实现抽象查询。实例258 创建视图实例说明为了简化查询,在实际项目开发过程中,通常可以采用为数据库中的某个表建立视图的方式。在建立的视图中只有开发人员所关心的字段。运行本实例,如图9.6所示,分别在图中输入登录用户的用户名和密码,单击“进入”按钮后,如果用户输入错误的用户名或密码,则给出错误提示,反之如果输入的用户名和密码正确,则提示成功登录。由于本实例采用视图建立了虚表,所以应首先在“命令提示符”下建立视图,如图9.7所示。图9.7 创建视图技术要点MySQL中创建视图可以通过create view语句来实现,具体创建格式如下:create or deplace algorithm=merge | temptable | undefined view view_name ( column_list) as select_statement with cascaded | local check optionalgorithm=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数据库的连接。代码如下:(4)判断用户是否单击了“进入”按钮,如果是则通过视图chkadmin对用户身份进行验证。该过程代码如下:?phpif($_POSTsubmit!=)include_once(conn.php);$name=$_POSTname;$pwd=$_POSTpwd;$sql=mysql_query(select * from chkadmin where name=.$name. andpwd=.$pwd.,$conn);$info=mysql_fetch_array($sql);if($info=false) echo alert(用户名或密码输入错误!);history.back(); exit;else echo 登录成功!;?举一反三根据本实例,读者可以: 利用视图实现用户信息注册。 利用视图实现商品信息的降序输出。实例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_statementwith cascaded | local check optionalgorithm:该参数已经在创建视图中作了介绍,这里不再赘述。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一个字段,从而说明视图修改成功。举一反三根据本实例,读者可以: 实现修改存储商品信息的视图。 实现修改存储用户注册信息的视图。实例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。代码如下:query(set names gb2312);?(3)查询视图scoreinfo中的内容,并显示查询结果。代码如下:query(select * from scoreinfo);$info=$sql-fetch_array(MYSQLI_ASSOC);if($info=NULL) echo 暂无学生信息;else do? fetch_array(MYSQLI_ASSOC);?举一反三根据本实例,读者可以: 实现多表之间的嵌套查询。 实现多表之间相同信息的提取。9.3 MySQL存储过程MySQL 5.0以后的版本开始支持存储过程,存储过程具有一致性、高效性、安全性和体系结构等特点,本节将通过具体的实例讲解PHP是如何操纵MySQL存储过程的。实例261 存储过程的创建实例说明为了保证数据的完整性、一致性,提高应用的性能,常采用存储过程技术。MySQL 5.0之前的版本并不支持存储过程,随着MySQL技术的日趋完善,存储过程将在以后的项目中得到广泛的应用。本实例将介绍在MySQL 5.0以后的版本中创建存储过程。技术要点一个存储过程包括名字、参数列表,以及可以包括很多SQL语句的SQL语句集。下面为一个存储过程的定义过程:create procedure proc_name (in parameter integer)begindeclare variable varchar(20);if parameter=1 thenset variable=MySQL;elseset 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更改。例如:mysqldelimiter /存储过程创建之后,可用如下语句进行删除,参数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)begininsert into tb_reg (name, pwd ,email ,address) values (nc, pwd, email, address);end;/“delimiter /”的作用是将语句结束符更改为“/”。“in nc varchar(50)in address varchar(50)”表示要向存储过程中传入的参数。“beginend”表示存储过程中的语句块,它的作用类似于PHP语言中的“”。实现过程(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 alert(用户注册成功!); else echo alert(用户注册失败!); 举一反三根据本实例,读者可以: 在BBS论坛中,利用存储过程实现将用户所发帖子保存到数据库。 在学生信息管理系统中,利用存储过程删除指定的学生信息。9.4 MySQL触发器触发器在数据库系统开发过程中具有非常重要的作用,例如可以防止有害数据录入数据库,可以改变或取消insert、update和delete语句的执行及在一个会话中监听数据库中的数据的改变。 实例263 创建触发器实例说明如果用户打算在数据库中通过触发器实现某一动作的监听,那么首先应该创建触发器,触发器是在“命令提示符”下创建的,如图9.16所示。图9.16 触发器创建过程技术要点MySQL数据库创建触发器的格式如下:create trigger before | afterinsert | update | deleteon for each rowcreate trigger :创建一个新触发器,并指定触发器的名称。 before | after:用于指定在insert、update或delete语句执行前触发还是在语句执行后触发。on :用于指定响应该触发器的表名。for each row:触发器的执行间隔,for each row 通知触发器每隔一行执行一次动作,而不是对整个表执行一次。:触发器要执行的SQL语句,如果该触发器要执行多条SQL语句,要将多条语句放在beginend块中。实现过程(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_tribefore insert on tb_testfor each rowset new.t_name=mrsoft(4)向表tb_test添加一条记录,并查看添加后的结果。代码如下:insert into tb_test(t_id,t_name) values(mr0001, 123)/select * from tb_test举一反三根据本实例,读者可以: 为某表创建触发器,要求在更新数据前触发。 为某表创建触发器,要求在删除数据前触发。实例264 查看触发器实例说明在MySQL数据库中,创建触发器前应先查看数据库中的触发器,这样既可以使开发人员对指定的数据库中的所有触发器及功能有一个直观的把握,而且又可以避免创建同名或类似功能的触发器。运行本实例,如图9.17所示,首先在图中的文本框中输入要查看触发器的数据库,然后单击“查看”按钮,即可将该数据库中所有的触发器的详细信息显示出来。图9.17 查看触发器技术要点查看MySQL数据库中的触发器详细信息,可以通过如下语句实现:show triggers使用show triggers语句前应先指明要查看的数据库。实现过程(1)选择要查看触发器的数据库。代码如下:$dbname=$_POSTname;$conn=mysql_connect(localhost,root,root);mysql_select_db($dbname,$conn);mysql_query(set names gb2312);(2)执行show triggers语句,并显示所查找到的触发器的详细信息。代码如下: 该数据库没有设置触发器! 举一反三根据本实例,读者可以: 在论坛中,通过触发器实现帖子的自动回复。 在留言板中,通过触发器实现将含有指定非法关键字的留言自动删除。9.5 MySQL事务事务处理机制在程序开发过程中有着非常重要的作用,它可以使整个系统更加安全,例如在银行处理转账业务时,如果A账户中的金额刚被发出,而B账户还没来得及接收就发生停电,这会给银行和个人带来很大的经济损失。采用事务处理机制,一旦在转账过程中发生意外,则程序将回滚,不做任何处理。实例265 使用事务处理技术实现关联表间信息的删除实例说明MySQL数据库中的表可以通过主键相互关联,例如学生成绩管理系统中,学生表和成绩表可以通过id实现关联,所以在删除某个学生信息时,只需删除这两个表中为该id的所有记录。但是,当对成绩表实现删除相关id工作后,还没来得及删除学生信息表中该学生的信息时就发生停电等意外,则再重新查找该学生的成绩时,是无法查找到该学生成绩的。本实例将采用事务处理方式,对学生信息表和学生成绩表中的数据进行删除,运行本实例,学生信息及学生成绩信息分别如图9.18及图9.19所示。当删除图9.18中的学生信息后,查看学生成绩信息可以发现与该学生对应的成绩全部删除。图9.18 查看学生信息图9.19 查看学生成绩技术要点实现事务的处理可以通过PHP预定义类mysqli的以下方法实现。autocommit(boolean):该方法用于限定查询结果是否自动提交,如果该方法的参数为true则自动提交,如果参数为false则关闭自动提交。MySQL数据库默认为自动提交。rollback():利用mysqli类中的该方法可以实现事务的回滚。commit():利用该方法可以实现提交所有查询。实现过程(1)建立数据库及数据表,并实现与数据库的连接。实现与数据库建立连接的代码如下:query(set names gb2312);?(2)显示所有学生基本信息。代码如下:query(select * from tb_stu);$info=$sql-fetch_array(MYSQLI_ASSOC);if($info=NULL) echo 暂无学生信息!;else do ? a href=javascript:if(window.confirm(确定删除该学生信息么?)=true) window.location.href=delete.php?id=;删除 fetch_array(MYSQLI_ASSOC); ?在实现该模块功能时,可以利用JavaScript实现该页与delete.php页面的信息传递。代码如下:a href=javascript:if(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论