PHP从入门到精通(微视频精编版)
上QQ阅读APP看书,第一时间看更新

9章 PHP操作MySQL数据库

视频讲解:1小时35分钟

第8章中,我们学习了通过MySQL命令行或视图管理工具来操作MySQL,本章将介绍如何使用PHP来操作MySQL。很长时间以来,PHP操作MySQL数据库使用的是mysql扩展库提供的相关函数,但是,随着MySQL的发展,mysql扩展库开始出现一些问题,逐渐被mysqli扩展库取代。本章将介绍如何使用mysqli扩展库来操作MySQL数据库。

学习摘要:

连接MySQL

选择数据库

执行SQL语句

返回结果集

从结果集中获取数据

释放内存

关闭MySQL连接

管理数据库中的记录

9.1 PHP操作MySQL数据库的方法

视频讲解

mysqli函数库和mysql函数库的应用基本类似,而且大部分函数的使用方法都一样,唯一的区别就是mysqli函数库中的函数名称都是以mysqli开始的。

9.1.1 连接MySQL服务器

PHP操作MySQL数据库,首先要建立与MySQL数据库的连接。在第8章中,我们使用如下命令连接数据库:

现在,使用mysqli扩展提供的mysqli_connect()函数实现与MySQL数据库的连接,函数语法如下:

mysqli_connect()函数用于打开一个到MySQL服务器的连接,如果成功则返回一个MySQL连接标识,失败则返回false。该函数的参数如表9.1所示。

表9.1 mysqli_connect()函数的参数说明

例如,应用mysqli_connect()函数创建与MySQL服务器的连接,MySQL数据库服务器地址为localhost,用户名为root,密码为root,代码如下:

运行上述代码,如果在本地计算机中安装了MySQL数据库,并且连接数据库的用户名为root,密码为root,则会弹出如图9.1所示的对话框。

图9.1 数据库连接成功

说明

代码中使用了JavaScript的alert()方法弹出提示框。

9.1.2 选择MySQL数据库

数据库连接完成以后,需要选择数据库。第8章中选择数据库命令如下:

现在,使用mysqli扩展库提供的mysqli_connect()函数可以创建与MySQL服务器的连接,同时也可以指定要选择的数据库名称,例如,在连接MySQL服务器的同时选择名称为db_users的数据库,代码如下:

除此之外,mysqli扩展库还提供了mysqli_select_db()函数用来选择MySQL数据库。其语法格式如下:

参数说明如下。

link:为必选参数,应用mysqli_connect()函数成功连接MySQL数据库服务器后返回的连接标识。

dbname:为必选参数,用户指定要选择的数据库名称。

例如,创建database9数据库,然后使用mysqli_connect()函数建立与MySQL数据库的连接,最后使用mysqli_select_db()函数选择database9数据库,实现代码如下:

运行上述代码,如果本地MySQL数据库服务器中存在名为database9的数据库,将在页面中输出如下内容:

否则输出:

说明

在实际的程序开发过程中,通常将MySQL服务器的连接和数据库的选择存储于一个单独文件中,在需要使用的脚本中通过require语句包含这个文件即可。这样做既有利于程序的维护,同时也避免了代码的冗余。

9.1.3 执行SQL语句

在第8章中,使用SQL语句对数据库中的表进行操作。在mysqli扩展库中,同样使用SQL语句对数据表进行操作,但是需要使用mysqli_query()函数来执行SQL语句。其语法格式如下:

参数说明如下。

link:为必选参数,mysqli_connect()函数成功连接MySQL数据库服务器后所返回的连接标识。

query:为必选参数,所要执行的SQL语句。

resultmode:为可选参数,该参数取值有MYSQLI_USE_RESULT和MYSQLI_STORE_RESULT。其中MYSQLI_STORE_RESULT为该函数的默认值。如果返回大量数据可以应用MYSQLI_ USE_RESULT,但应用该值时,以后的查询调用可能返回一个commands out of sync错误,解决办法是应用mysqli_free_result()函数释放内存。

如果SQL语句是查询指令select,成功则返回查询结果集,否则返回false;如果SQL语句是insert、delete、update等操作指令,成功则返回true,否则返回false。

下面看一下如何通过mysqli_query()函数执行简单的SQL语句。

执行一个添加会员记录的SQL语句的代码如下:

执行一个修改会员记录的SQL语句的代码如下:

执行一个删除会员记录的SQL语句的代码如下:

执行一个查询会员记录的SQL语句的代码如下:

mysqli_query()函数不仅可以执行诸如select、update和insert等SQL指令,而且可以选择数据库和设置数据库编码格式。选择数据库的功能与mysqli_select_db()函数是相同的,代码如下:

设置数据库编码格式的代码如下:

9.1.4 将结果集返回到数组

使用mysqli_query()函数执行select语句,如果成功将返回查询结果集。下面介绍一个对查询结果集进行操作的函数mysqli_fetch_array()。它将结果集返回到数组中。其语法格式如下:

参数说明如下。

result:资源类型的参数,要传入的是由mysqli_query()函数返回的数据指针。

result_type:可选项,设置结果集数组的表述方式。有以下3种取值。

·MYSQLI_ASSOC:返回一个关联数组。数组下标由表的字段名组成,如id、name。

·MYSQLI_NUM:返回一个索引数组。数组下标由数字组成,如0、1、2。

·MYSQLI_BOTH:返回一个同时包含关联和数字索引的数组。默认值是MYSQLI_BOTH。

说明

本函数返回的字段名要区分大小写,这是初学者最容易忽略的问题。

到此,PHP操作MySQL数据库的方法已经初露端倪,已经可以实现MySQL服务器的连接、选择数据库、执行查询语句,并且可以将查询结果集中的数据返回到数组中。下面编写一个实例,通过PHP操作MySQL数据库,读取数据库中存储的数据。

【例9.01】 使用mysqli_fetch_array()函数读取数据。实例位置:资源包\源码\09\9.01

本例将利用mysqli_fetch_array()函数,读取database9数据库中books图书表中的数据。具体步骤如下。

(1)创建database9数据库,并选择database9数据库。SQL语句如下:

(2)创建books数据表,并设置数据库编码格式为utf8。SQL语句如下:

上述SQL语句创建了books表,该表共5个字段。其中,id字段是表的主键,并且是自增的;name字段用于保存图书名称;category字段用于保存图书分类;price字段用于保存图书价格;publish_ time字段用于保存出版时间。

(3)插入测试数据。为了显示图书信息,我们需要先在books表中插入几条测试数据。SQL语句如下:

(4)连接数据库,获取数据。创建index.php文件,具体代码如下:

在上述代码中,使用mysqli_connect()函数连接数据库,如果连接失败,终止程序,并使用mysqli_error()函数显示错误信息。接下来设置数据库编码格式为UTF-8。代码第5行使用mysqli_ query()执行select语句,从数据库中查询获取结果集。最后使用include_once()函数,引入模板文件,即HTML页面。

注意

为保证数据能正确显示,建议读者保持以下几个编码格式统一为UTF-8:PHP文件的编码格式、HTML文件的编码格式(可以使用PhpStorm编辑器设置)和数据表编码格式(可以使用图形化工具设置)。与PHP中不同的是,MySQL中指定的UTF-8编码格式使用utf8,而不是utf-8。

(5)显示图书信息。创建lists.html文件,该文件就是HTML模板文件。使用mysqli_fetch_ array(),将结果集返回到数组中,通过while语句循环遍历图书数组,将每本图书数据插入到<table>表格中,具体代码如下:

运行结果如图9.2所示。

图9.2 显示图书列表

9.1.5 从结果集中获取一行作为对象

9.1.4 节中讲解了应用mysqli_fetch_array()函数来获取结果集中的数据。除了这个方法以外,应用mysqli_fetch_object()函数也可以轻松实现这一功能,下面通过同一个实例的不同方法来体验一下这两个函数在使用上的区别。

首先介绍mysqli_fetch_object()函数,其语法格式如下:

mysqli_fetch_object()函数和mysqli_fetch_array()函数类似,只有一点区别:它返回的是一个对象而不是数组,即该函数只能通过字段名来访问数组。访问结果集中行的元素的语法结构如下:

例如,如果从某数据表中检索id和name值,可以用$row->id和$row->name访问行中的元素值。

注意

本函数返回的字段名同样是区分大小写的。

【例9.02】 使用mysqli_fetch_object()函数读取所有图书数据。实例位置:资源包\源码\09\9.02

本例中同样是读取database9数据库中books数据表中的数据,不同的是应用mysqli_fetch_object()函数逐行获取结果集中的记录。由于在例9.01中,已经创建了数据库和数据表,并且连接了数据库,所以只需修改lists.html文件即可。

在lists.html文件中,使用mysqli_fetch_object()函数逐行获取结果集,该结果集是一个对象,使用while语句循环遍历对象,将每本图书数据插入到<table>表格中,关键代码如下:

本实例的运行结果与例9.01相同,如图9.2所示。

9.1.6 从结果集中获取一行作为枚举数组

mysqli_fetch_row()函数可以从结果集中取得一行作为枚举数组,即数组的键用数字索引来表示。其语法格式如下:

mysqli_fetch_row()函数返回根据所取得的行生成的数组,如果没有更多行则返回null。返回数组的偏移量从0开始,即以$row[0]的形式访问第一个元素(只有一个元素时也是如此)。

例如,使用mysqli_fetch_row()函数实现图书列表的功能,只需修改lists.html文件,修改代码如下:

上述代码中使用mysqli_fetch_row()函数逐行获取结果集中的记录时,只能使用数字索引来读取数组中的数据,而不能像mysqli_fetch_array()函数那样可以使用关联索引获取数组中的数据。

本实例的运行结果与例9.01相同,如图9.2所示。

9.1.7 从结果集中获取一行作为关联数组

mysqli_fetch_assoc()函数可以从结果集中取得一行作为关联数组,即数组的键用字段名来表示。其语法格式如下:

mysqli_fetch_assoc()函数返回根据所取得的行生成的数组,如果没有更多行则返回null。该数组的下标为数据表中字段的名称。

等价于:

9.1.8 获取查询结果集中的记录数

使用mysqli_num_rows()函数,可以获取由select语句查询到的结果集中行的数目。mysqli_num_ rows()函数的语法格式如下:

mysqli_num_rows()返回结果集中行的数目。此函数仅对select语句有效。要取得被insert、update或者delete语句所影响到的行的数目,要使用mysqli_affected_rows()函数。

【例9.03】 使用mysqli_num_rows()函数获取图书总数。实例位置:资源包\源码\09\9.03

本例中应用mysqli_fetch_array()函数逐行获取结果集中的记录,同时应用mysqli_ num_rows()函数获取结果集中行的数目,并输出返回值。具体步骤如下。

由于本例是在例9.01的基础上进行操作,所以这里只给出关键代码,不再赘述它的创建步骤。

(1)在index.php文件中,增加mysqli_num_rows()函数,获取结果集中记录数。代码如下:

(2)在lists.html文件中,新增显示记录条数代码,关键代码如下:

运行结果如图9.3所示。

图9.3 获取查询结果的记录数

9.1.9 释放内存

mysqli_free_result()函数用于释放内存,数据库操作完成后,需要关闭结果集,以释放系统资源,该函数的语法格式如下:

mysqli_free_result()函数将释放所有与结果标识符$result所关联的内存。该函数仅需要在考虑到返回很大的结果集会占用较多内存时调用。在执行结束后所有关联的内存都会被自动释放。

9.1.10 关闭连接

完成对数据库的操作后,需要及时断开与数据库的连接并释放内存,否则会浪费大量的内存空间,在访问量较大的Web项目中,很可能导致服务器崩溃。在MySQL函数库中,使用mysqli_close()函数断开与MySQL服务器的连接,该函数的语法格式如下:

参数link为mysqli_connect()函数成功连接MySQL数据库服务器后所返回的连接标识。如果成功则返回true,失败则返回false。

例如,读取database9数据库中books数据表中的数据,然后使用mysqli_free_result()函数释放内存并使用mysqli_close()函数断开与MySQL数据库的连接。代码如下:

说明

PHP中与数据库的连接是非持久连接,系统会自动回收内存,一般不用设置关闭。但如果一次性返回的结果集比较大,或网站访问量比较多,则最好使用mysqli_close()函数手动进行释放。

9.2 管理MySQL数据库中的数据

视频讲解

在开发网站的后台管理系统中,对数据库的操作不仅局限于查询,对数据的添加、修改和删除等操作也是必不可少的。本节重点介绍如何在PHP页面中对数据库进行增、改、删的操作。

9.2.1 添加数据

【例9.04】 向图书信息表中添加图书信息。实例位置:资源包\源码\09\9.04

本实例将通过insert语句和mysqli_query()函数向图书信息表中添加一条记录。具体步骤如下。

(1)创建<form>表单页面add.html,表单中包含name(书名)、category(分类)、price(价格)、publish_time(出版时间)4个字段。当单击“提交”按钮时,将表单提交到addBook.php文件。具体代码如下:

运行结果如图9.4所示。

图9.4 添加图书页面效果

(2)创建addBook.php文件,用于连接数据库,发送查询,最后检查结果。此时,发送的查询是insert而不是select。在将数据插入数据库时,为避免SQL注入攻击,使用prepare语句进行预处理,然后使用bind_param()进行参数绑定,最后使用execute()函数执行SQL语句。具体代码如下:

上述代码中,使用mysqli_prepare()时,SQL语句中包含了4个“?”,它们是占位符,没有实际意义,后面会被mysqli_stmt_bind_param()中的相应参数替换。mysqli_stmt_bind_param()语法格式如下:

参数说明如下。

stmt:statement标识。

types:绑定的变量的数据类型,它接受的字符种类包括4个,如表9.2所示。

表9.2 绑定变量的数据类型

var:绑定的变量,其数量必须要与SQL语句中的参数数量保持一致。

本实例中应用到的该函数的代码如下:

在代码中,ssds分别表示$name为string类型,$category为string类型,$price为double类型,$publish_time为string类型。

mysqli_stmt_affected_rows()函数获取受影响的行数,如果返回0,表示没有记录被更新,或者查询语句条件不匹配,或者没有执行查询语句。如果返回-1,则表示查询返回错误。

填写表单,单击“提交”按钮,运行结果如图9.5所示。

图9.5 添加成功页面

添加成功后,页面跳转到列表页。在列表页中,会显示提交的图书,如图9.6所示。

图9.6 列表页数据

9.2.2 编辑数据

有时插入数据后,才发现录入的是错误信息或一段时间以后数据需要更新,这时就要对数据进行编辑。数据更新使用update语句,依然通过mysqli_query()函数来执行该语句。

【例9.05】 编辑图书信息。实例位置:资源包\源码\09\9.05

本实例将通过update语句和mysqli_query()函数实现对数据的更新操作。具体步骤如下。

(1)创建editBook.php文件,获取需要编辑的图书信息。在lists.html图书列表页中,有如下代码:

当单击“编辑”按钮时,页面跳转至editBook.php,并传递图书id参数。在editBook.php文件中,接收传递的id,根据id查找图书信息。editBook.php文件的具体代码如下:

(2)创建edit.html文件。图书编辑页面和新增图书页面相似,不同之处在于编辑页面需要显示输入框内的值,即value的值。edit.html文件的关键代码如下:

上述代码中,为<input>标签的value属性赋值后,编辑页中将会显示相应的图书内容。此外还需要注意两点:

使用<input>标签的隐藏域type=“hidden“,传递图书id,为下一步保存图书信息做准备。

在图书类别select下拉列表中,默认选中的是select的第一项(本代码中为PHP),使用selected属性可以设置选中为当前项。所以在每个<option>标签中,使用if语句来判断当前选项是否被选中。

在浏览器中运行index.php图书列表页,选择id为2的记录(PHP自学宝典),单击右侧“编辑”按钮,进入“编辑”页面。运行效果如图9.7所示。

图9.7 图书编辑页

(3)创建updateBook.php文件,获取表单中提交的数据,根据隐藏域传递的id值,定义更新语句完成数据的更新操作,代码如下:

上述代码中,预处理和参数绑定的内容与新增图书相同,不再赘述。注意SQL语句使用update和where条件来实现数据更新。

运行本实例,修改id为2的记录(PHP自学宝典),修改效果如图9.8所示。

图9.8 编辑图书

修改成功后,单击“确定”按钮,页面跳转到图书列表页,显示修改后的信息,如图9.9所示。

图9.9 编辑后图书列表页

9.2.3 删除数据

删除数据库中的数据,使用的是delete语句,如果在不指定删除条件的情况下,那么将删除指定数据表中所有的数据,如果定义了删除条件,那么将删除数据表中指定的记录。删除操作的执行是一件非常慎重的事情,因为一旦执行该操作,数据就没有恢复的可能。

【例9.06】 删除图书信息。实例位置:资源包\源码\09\9.06

在添加图书过程中,如果输入了无效的图书信息,那么,就会用到删除数据的功能。删除数据只需利用mysqli_query()函数执行delete语句即可。在lists.html图书列表页中,有如下代码:

当单击“删除”按钮时,页面跳转至deleteBook.php,并传递图书id参数。在deleteBook.php文件中,接收传递的id,删除该id的图书记录。deleteBook.php具体代码如下:

运行本实例,单击id为2记录右侧的“删除”按钮,运行结果如图9.10所示。

图9.10 删除数据成功

单击“确定”按钮,页面跳转至图书列表页,此时id为2的记录被删除,不会在列表页中显示。删除后的列表页如图9.11所示。

图9.11 删除数据后的列表页

注意

由于删除后,数据不可恢复,通常删除前弹出提示框,确定是否删除。当单击“确认”按钮后,再执行删除操作。

9.3 小结

本章主要介绍了使用PHP操作MySQL数据库的方法。通过本章的学习,读者能够掌握PHP操作MySQL数据库的一般流程,掌握mysqli扩展库中常用函数的使用方法,并能够具备独立完成基本数据库程序的能力。希望本章能够起到抛砖引玉的作用,能够帮助读者在此基础上更深层次地学习PHP操作MySQL数据库的相关技术,并进一步学习使用面向对象的方式操作MySQL数据库的方法。

9.4 实战

9.4.1 实现会员注册功能

实例位置:资源包\源码\09\实战\01

在database9数据库中新建member表,实现会员注册功能。注册页面如图9.12所示,注册成功后,member表数据如图9.13所示。

图9.12 注册页面

图9.13 member表数据

9.4.2 实现博客添加文章功能

实例位置:资源包\源码\09\实战\02

在database9数据库中新建blog表,包含title、author、post和publish_time 4个字段。实现博客的添加文章功能,如图9.14所示。

图9.14 添加博客

9.4.3 实现多选删除功能

实例位置:资源包\源码\09\实战\03

修改例9.06,实现多选删除功能,如图9.15所示。

图9.15 删除多条记录