18.1 PHP操作mysql数据库的方法
MySQLi函数库和MySQL函数库的应用基本类似,而且大部分函数的使用方法都一样,唯一的区别就是MySQLi函数库中的函数名称都是以mysqli开始的。
18.1.1 连接MySQL服务器
视频讲解:光盘TMlx1801 连接MySQL服务器.mp4
PHP操作MySQL数据库,首先要建立与MySQL数据库的连接,MySQLi扩展提供了mysqli_connect()函数实现与MySQL数据库的连接,函数语法如下:
mysqli mysqli_connect ( [string server [, string username [, string password [, string dbname [, int port [, string socket]]]]]] )
mysqli_connect()函数用于打开一个到MySQL服务器的连接,如果成功则返回一个MySQL连接标识,失败则返回false。该函数的参数如表18.1所示。
表18.1 mysqli_connect()函数的参数说明
【例18.1】应用mysqli_connect()函数创建与MySQL服务器的连接,MySQL数据库服务器地址为127.0.0.1,用户名为root,密码为111,代码如下:(实例位置:光盘TMsl181)
<?php $host="127.0.0.1"; //MySQL服务器地址 $userName="root"; //用户名 $password="111"; //密码 if ($connID = mysqli_connect($host, $userName, $password)){ //建立与MySQL数据库的连接,并弹出提示对话框 echo "<script type='text/javascript'>alert(’数据库连接成功!'); </script>"; }else{ echo "<script type='text/Javascript'>alert(’数据库连接失败!'); </script>"; } ?>
运行上述代码,如果在本地计算机中安装了MySQL数据库,并且连接数据库的用户名为root,密码为111,则会弹出如图18.1所示的对话框。
图18.1 数据库连接成功
说明
为了屏蔽由于数据库连接失败而显示的不友好的错误信息,可以在mysqli_connect()函数前加“@”,该符号用来屏蔽错误提示。
18.1.2 选择MySQL数据库
视频讲解:光盘TMlx1802 选择MySQL数据库.mp4
应用mysqli_connect()函数可以创建与MySQL服务器的连接,同时也可以指定要选择的数据库名称。例如,在连接MySQL服务器的同时选择名称为db_database18的数据库,代码如下:
$connID = mysqli_connect("127.0.0.1", "root", "111", "db_database18");
除此之外,MySQLi扩展还提供了mysqli_select_db()函数用来选择MySQL数据库。其语法如下:
bool mysqli_select_db ( mysqli link, string dbname )
link为必选参数,应用mysqli_connect()函数成功连接MySQL数据库服务器后返回的连接标识。
dbname为必选参数,用户指定要选择的数据库名称。
【例18.2】首先使用mysqli_connect()函数建立与MySQL数据库的连接并返回数据库连接ID,然后使用mysqli_select_db()函数选择MySQL数据库服务器中名为db_database18的数据库,实现代码如下:(实例位置:光盘TMsl182)
<?php $host="127.0.0.1"; //MySQL服务器地址 $userName="root"; //用户名 $password="111"; //密码 $dbName="db_database18"; //数据库名称 $connID=mysqli_connect($host, $userName, $password); //建立与MySQL数据库服务器的连接 if(mysqli_select_db($connID, $dbName)){ //选择数据库 echo "数据库选择成功!"; }else{ echo "数据库选择失败!"; } ?>
运行上述代码,如果本地MySQL数据库服务器中存在名为db_database18的数据库,将在页面中显示如图18.2所示的提示信息。
图18.2 数据库选择成功
说明
在实际的程序开发过程中,将MySQL服务器的连接和数据库的选择存储于一个单独文件中,在需要使用的脚本中通过require语句包含这个文件即可。这样做既有利于程序的维护,同时也避免了代码的冗余。在本章后面的章节中,将MySQL服务器的连接和数据库的选择存储在根目录下的conn文件夹下,文件名称为conn.php。
18.1.3 执行SQL语句
视频讲解:光盘TMlx1803 执行SQL语句.mp4
要对数据库中的表进行操作,通常使用mysqli_query()函数执行SQL语句。其语法如下:
mixed mysqli_query( mysqli link, string query [, int resultmode] )
link为必选参数,mysqli_connect()函数成功连接MySQL数据库服务器后所返回的连接标识。
query为必选参数,所要执行的查询语句。
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语句的代码如下:
$result=mysqli_query($conn, "insert into tb_member values('mrsoft', '123', '[email protected]')");
例如,执行一个修改会员记录的SQL语句的代码如下:
$result=mysqli_query($conn, "update tb_member set user='mrbook', pwd='111' where user='mrsoft'");
例如,执行一个删除会员记录的SQL语句的代码如下:
$result=mysqli_query($conn, "delete from tb_member where user='mrbook'");
例如,执行一个查询会员记录的SQL语句的代码如下:
$result=mysqli_query($conn, "select * from tb_member");
mysqli_query()函数不仅可以执行诸如select、update和insert等SQL指令,而且可以选择数据库和设置数据库编码格式。选择数据库的功能与mysqli_select_db()函数是相同的,代码如下:
mysqli_query($conn, "use db_database18"); //选择数据库db_database18
设置数据库编码格式的代码如下:
mysqli_query($conn, "set names utf8"); //设置数据库的编码为utf8
18.1.4 将结果集返回到数组中
视频讲解:光盘TMlx1804 将结果集返回到数组中.mp4
使用mysqli_query()函数执行select语句,如果成功将返回查询结果集。下面介绍一个对查询结果集进行操作的函数mysqli_fetch_array()。它将结果集返回到数组中。其语法如下:
array mysqli_fetch_array ( resource result [, int result_type] )
result:资源类型的参数,要传入的是由mysqli_query()函数返回的数据指针。
result_type:可选项,设置结果集数组的表述方式。有以下3种取值:
MYSQLI_ASSOC:返回一个关联数组。数组下标由表的字段名组成。
MYSQLI_NUM:返回一个索引数组。数组下标由数字组成。
MYSQLI_BOTH:返回一个同时包含关联和数字索引的数组。默认值是MYSQLI_BOTH。
注意
mysqli_fetch_array()函数返回的字段名区分大小写,这是初学者最容易忽略的问题。
至此,PHP操作MySQL数据库的方法已经初露端倪,已经可以实现MySQL服务器的连接、选择数据库、执行查询语句,并且可以将查询结果集中的数据返回到数组中。下面编写一个实例,通过PHP操作MySQL数据库,读取数据库中存储的数据。
【例18.3】本例中利用mysqli_fetch_array()函数读取db_database18数据库中tb_demo01数据表中的数据。(实例位置:光盘TM sl183)
具体步骤如下:
(1)创建conn文件夹,编写conn.php文件,实现与MySQL服务器的连接,选择db_database18数据库,并设置数据库编码格式为utf8。conn.php的代码如下:
<?php $conn = mysqli_connect("localhost", "root", "111", "db_database18") or die("连接数据库服务器失败!" .mysqli_error()); //连接MySQL服务器,选择数据库 mysqli_query($conn, "set names utf8"); //设置数据库编码格式utf8 ?>
(2)创建index.php文件,通过include_once语句包含数据库连接文件;通过mysqli_query()函数执行查询语句,查询tb_demo01数据表中的数据;通过mysqli_fetch_array()函数将查询结果集中的数据返回到数组中;通过while语句循环输出数组中的数据。其代码如下:
<?php include_once("conn/conn.php"); //包含连接数据库文件 $result=mysqli_query($conn, "select*from tb_demo01"); //执行查询语句 while($myrow=mysqli_fetch_array($result)){ //循环输出查询结果 ?> <tr> <td align="center"><span class="STYLE2"><?php echo $myrow[0]; ?></span></td> <td align="left"><span class="STYLE2"><?php echo $myrow[1]; ?></span></td> <td align="center"><span class="STYLE2"><?php echo $myrow[2]; ?></span></td> <td align="center"><span class="STYLE2"><?php echo $myrow['date']; ?></span></td> <td align="center"><span class="STYLE2"><?php echo $myrow['type']; ?></span></td> </tr> <?php } ?>
运行结果如图18.3所示。
图18.3 通过mysqli_fetch_array()函数输出数据表中的数据
说明
本例中,在输出mysqli_fetch_array()函数返回数组中的数据时,既应用了数字索引,同时也使用了关联索引。
18.1.5 从结果集中获取一行作为对象
视频讲解:光盘TMlx1805 从结果集中获取一行作为对象.mp4
18.1.4节中讲解了应用mysqli_fetch_array()函数来获取结果集中的数据。除了这个方法以外,应用mysqli_fetch_object()函数也可以轻松实现这一功能,下面通过同一个实例的不同方法来体验一下这两个函数在使用上的区别。首先介绍mysqli_fetch_object()函数。
语法格式如下:
mixed mysqli_fetch_object ( resource result )
mysqli_fetch_object()函数和mysqli_fetch_array()函数类似,只有一点区别:它返回的是一个对象而不是数组,即该函数只能通过字段名来访问数组。访问结果集中行的元素的语法结构如下:
$row->col_name //col_name为字段名,$row代表结果集
例如,如果从某数据表中检索id和name值,可以用$row->id和$row-> name访问行中的元素值。
注意
mysqli_fetch_object()函数返回的字段名同样是区分大小写的。
【例18.4】本例中同样是读取db_database18数据库中tb_demo01数据表中的数据,但是与例18.3不同的是应用mysqli_fetch_object()函数逐行获取结果集中的记录。(实例位置:光盘TM sl184)
具体步骤如下:
(1)创建数据库的连接文件conn.php。
(2)编写index.php文件。包含数据库连接文件conn.php实现与数据库的连接,利用mysqli_query()函数执行SQL查询语句并返回结果集。通过while语句和mysqli_fetch_object()函数循环输出查询结果集。其代码如下:
<?php include_once("conn/conn.php"); //包含数据库连接页 $result=mysqli_query($conn, "select*from tb_demo01"); //执行查询操作并返回结果集 while($myrow=mysqli_fetch_object($result)){ //循环输出数据 ?> <tr> <td align="center"><span class="STYLE2"><?php echo $myrow->id; ?></span></td> <td align="left"><span class="STYLE2"><?php echo $myrow->name; ?></span></td> <td align="center"><span class="STYLE2"><?php echo $myrow->price; ?></span></td> <td align="center"><span class="STYLE2"><?php echo $myrow->date; ?></span></td> <td align="center"><span class="STYLE2"><?php echo $myrow->type; ?></span></td> </tr> <?php } ?>
本例的运行结果与例18.3相同,如图18.3所示。
18.1.6 从结果集中获取一行作为枚举数组
视频讲解:光盘TMlx1806 从结果集中获取一行作为枚举数组.mp4
mysqli_fetch_row()函数从结果集中取得一行作为枚举数组。其语法如下:
mixed mysqli_fetch_row ( resource result )
mysqli_fetch_row()函数返回根据所取得的行生成的数组,如果没有更多行则返回null。返回数组的偏移量从0开始,即以$row[0]的形式访问第一个元素(只有一个元素时也是如此)。
【例18.5】本例中同样是读取db_database18数据库中tb_demo01数据表中的数据,但是与例18.3不同的是应用mysqli_fetch_row()函数逐行获取结果集中的记录。(实例位置:光盘TM sl185)
具体步骤如下:
(1)创建数据库的连接文件conn.php。
(2)编写index.php文件。包含数据库连接文件conn.php实现与数据库的连接,利用mysqli_query()函数执行SQL查询语句并返回结果集。通过while语句和mysqli_fetch_row()函数循环输出查询结果集。其代码如下:
<?php include_once("conn/conn.php"); //包含数据库连接页 $result=mysqli_query($conn, "select*from tb_demo01"); //执行查询操作并返回结果集 while($myrow=mysqli_fetch_row($result)){ //循环输出数据 ?> <tr> <td align="center"><span class="STYLE2"><?php echo $myrow[0]; ?></span></td> <td align="left"><span class="STYLE2"><?php echo $myrow[1]; ?></span></td> <td align="center"><span class="STYLE2"><?php echo $myrow[2]; ?></span></td> <td align="center"><span class="STYLE2"><?php echo $myrow[3]; ?></span></td> <td align="center"><span class="STYLE2"><?php echo $myrow[4]; ?></span></td> </tr> <?php } ?>
本例的运行结果与例18.3相同。
说明
在应用mysqli_fetch_row()函数逐行获取结果集中的记录时,只能使用数字索引来读取数组中的数据,而不能像mysqli_fetch_array()函数那样可以使用关联索引获取数组中的数据。
18.1.7 从结果集中获取一行作为关联数组
视频讲解:光盘TMlx1807 从结果集中获取一行作为关联数组.mp4
mysqli_fetch_assoc()函数从结果集中取得一行作为关联数组。其语法如下:
mixed mysqli_fetch_assoc ( resource result )
mysqli_fetch_assoc()函数返回根据所取得的行生成的数组,如果没有更多行则返回null。该数组的下标为数据表中字段的名称。
【例18.6】本例中同样是读取db_database18数据库中tb_demo01数据表中的数据,但是与例18.3不同的是应用mysqli_fetch_assoc()函数逐行获取结果集中的记录。(实例位置:光盘TM sl186)
具体步骤如下:
(1)创建数据库的连接文件conn.php。
(2)编写index.php文件。包含数据库连接文件conn.php实现与数据库的连接,利用mysqli_query()函数执行SQL查询语句并返回结果集。通过while语句和mysqli_fetch_assoc()函数循环输出查询结果集。其代码如下:
<?php include_once("conn/conn.php"); //包含数据库连接页 $result=mysqli_query($conn, "select*from tb_demo01"); //执行查询操作并返回结果集 while($myrow=mysqli_fetch_assoc($result)){ //循环输出数据 ?> <tr> <td align="center"><span class="STYLE2"><?php echo $myrow['id']; ?></span></td> <td align="left"><span class="STYLE2"><?php echo $myrow['name']; ?></span></td> <td align="center"><span class="STYLE2"><?php echo $myrow['price']; ?></span></td> <td align="center"><span class="STYLE2"><?php echo $myrow['date']; ?></span></td> <td align="center"><span class="STYLE2"><?php echo $myrow['type']; ?></span></td> </tr> <?php } ?>
本例的运行结果与例18.3相同。
18.1.8 获取查询结果集中的记录数
视频讲解:光盘TMlx1808 获取查询结果集中的记录数.mp4
使用mysqli_num_rows()函数,可以获取由select语句查询到的结果集中行的数目。mysqli_num_rows()函数的语法如下:
int mysqli_num_rows ( resource result )
mysqli_num_rows()函数返回结果集中行的数目。此命令仅对select语句有效。要取得被insert、update或者delete语句所影响到的行的数目,要使用mysqli_affected_rows()函数。
【例18.7】本例中应用mysqli_fetch_row()函数逐行获取结果集中的记录,同时应用mysqli_num_rows()函数获取结果集中行的数目,并输出返回值。(实例位置:光盘TM sl187)
由于本例是在例18.5的基础上进行操作,所以这里只给出关键代码,不再赘述它的创建步骤。其通过mysqli_num_rows()函数获取结果集中记录数的关键代码如下:
<?php $nums=mysqli_num_rows($result); //获取查询结果的行数 echo$nums; //输出返回值 ?>
运行结果如图18.4所示。
图18.4 获取查询结果的记录数
18.1.9 释放内存
视频讲解:光盘TMlx1809 释放内存.mp4
mysqli_free_result()函数用于释放内存,数据库操作完成后,需要关闭结果集,以释放系统资源,该函数的语法格式如下:
void mysqli_free_result(resource result);
mysqli_free_result()函数将释放所有与结果标识符result所关联的内存。该函数仅需要在考虑到返回很大的结果集时会占用多少内存时调用。在脚本结束后所有关联的内存都会被自动释放。
18.1.10 关闭连接
视频讲解:光盘TMlx1810 关闭连接.mp4
完成对数据库的操作后,需要及时断开与数据库的连接并释放内存,否则会浪费大量的内存空间,在访问量较大的web项目中,很可能导致服务器崩溃。在MySQL函数库中,使用mysqli_close()函数断开与MySQL服务器的连接,该函数的语法格式如下:
bool mysqli_close ( mysqli link )
参数link为mysqli_connect()函数成功连接MySQL数据库服务器后所返回的连接标识。如果成功则返回true,失败则返回false。
例如,读取db_database18数据库中tb_demo01数据表中的数据,然后使用mysqli_free_result()函数释放内存并使用mysqli_close()函数断开与MySQL数据库的连接。代码如下:
<?php include_once("conn/conn.php"); //包含数据库连接页 $result=mysqli_query($conn, "select*from tb_demo01"); //执行查询操作并返回结果集 while($myrow=mysqli_fetch_row($result)){ //循环输出数据 ?> <tr> <td align="center"><?php echo $myrow[0]; ?></td> <td align="left"><?php echo $myrow[1]; ?></td> <td align="center"><?php echo $myrow[2]; ?></td> <td align="center"><?php echo $myrow[3]; ?></td> <td align="center"><?php echo $myrow[4]; ?></td> </tr> <?php } mysqli_free_result($result); //释放内存 mysqli_close($conn); //断开与数据库连接 ?>
说明
PHP中与数据库的连接是非持久连接,系统会自动回收,一般不用设置关闭。但如果一次性返回的结果集比较大,或网站访问量比较多,则最好使用mysqli_close()函数手动进行释放。
18.1.11 连接与关闭MySQL服务器的最佳时机
视频讲解:光盘TMlx1811 连接与关闭MySQL服务器的最佳时机.mp4
MySQL服务器连接应该及时关闭,但并不是说每一次数据库操作后都要立即关闭MySQL连接。例如,在book_query()函数中实现MySQL服务器的连接,在查询数据表中的数据之后释放内存并关闭MySQL服务器的连接,代码如下:
<?php function book_query(){ $conn = mysqli_connect("localhost", "root", "111", "db_database18") or die("连接数据库服务器失败!" .mysqli_error()); //连接MySQL服务器,选择数据库 mysqli_query($conn, "set names utf8"); //设置数据库编码格式utf8 $result=mysqli_query($conn, "select*from tb_demo01"); //执行查询语句 while($myrow=mysqli_fetch_row($result)){ //循环输出查询结果 echo $myrow[1]." "; echo $myrow[2]."<br />"; } mysqli_free_result($result); //释放内存 mysqli_close($conn); //关闭服务器连接 } book_query(); //调用函数 book_query(); //调用函数 ?>
在上面的代码中,每调用一次book_query()函数,都会打开新的MySQL服务器连接和关闭MySQL服务器连接,耗费了服务器资源,这时可以将上述代码修改如下:
<?php function book_query(){ global$conn; //定义全局变量 $result=mysqli_query($conn, "select*from tb_demo01"); //执行查询语句 while($myrow=mysqli_fetch_row($result)){ //循环输出查询结果 echo $myrow[1]." "; echo $myrow[2]."<br />"; } mysqli_free_result($result); //释放内存 } $conn = mysqli_connect("localhost", "root", "111", "db_database18") or die("连接数据库服务器失败!" .mysqli_error()); //连接MySQL服务器,选择数据库 mysqli_query($conn, "set names utf8"); //设置数据库编码格式utf8 book_query(); //调用函数 book_query(); //调用函数 mysqli_close($conn); //关闭服务器连接 ?>
这样在多次调用book_query()函数时,仅打开了一次MySQL服务器连接,节省了网络和服务器资源。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。