首页 > 编程笔记 > PHP笔记 阅读:55

PHP连接MySQL数据库详解(附带实例)

通义灵码
PHP 是一种简单、面向对象、解释型、健壮、安全、性能非常高、独立于架构、可移植的动态脚本语言。而 MySQL 是快速和开源的网络数据库系统。PHP 和 MySQL 的结合是目前 Web 开发的黄金组合,那么 PHP 是如何操作 MySQL 数据库的呢?

PHP访问MySQL数据库的一般步骤

通过 Web 访问数据库的工作过程一般分为以下几个步骤:
  1. 用户使用浏览器对某个页面发出 HTTP 请求。
  2. 服务器端接收到请求,并发送给 PHP 程序进行处理。
  3. PHP 解析代码。在代码中有连接 MySQ L数据库命令和请求特定数据库的某些特定数据的 SQL 命令。根据这些代码,PHP 打开一个和 MySQL 的连接,并且发送 SQL 命令到 MySQL 数据库。
  4. MySQL 接收到 SQL 语句之后加以执行。执行完毕后,返回执行结果到 PHP 程序。
  5. PHP 执行代码并根据 MySQL 返回的请求结果数据生成特定格式的 HTML 文件,且传递给浏览器。HTML 经过浏览器渲染成为用户请求的展示结果。

PHP连接数据库前的准备工作

默认情况下,从 PHP 5 开始不再自动开启对 MySQL 的支持,而是放到扩展函数库中,所以用户需要在扩展函数库中开启 MySQL 函数库。

首先打开 php.ini,找到“;extension=php_mysqli”,去掉该语句前的分号“;”,如下图所示:


图 1 修改PHP.ini文件

保存 php.ini 文件,重新启动 IIS 或 Apache 服务器即可。

配置文件设置完成后,可以通过 phpinfo() 函数来检查是否配置成功,如果显示出的 PHP 环境配置信息中有 mysql 的项目,就表示已经开启了对 MySQL 数据库的支持,如下图所示。


图 2 PHP的环境配置页面

PHP访问MySQL数据库

1) mysqli_connect()函数连接MySQL服务器

PHP 使用 mysqli_connect() 函数连接 MySQL 数据库。mysqli_connect() 函数的格式如下:
mysqli_connect('MYSQL服务器地址', '用户名', '用户密码', '要连接的数据库名')
例如:
  • <?php
  • $db=mysqli_connect('localhost','root','753951','adatabase'); //连接数据库
  • ?>
该语句通过此函数连接到 MySQL 数据库,并且把此连接生成的对象传递给名为 $db 的变量,也就是对象 $db。其中,“MySQL服务器地址”为 localhost,“用户名”为root,“用户密码”为本环境 root 设定的密码 753951,“要连接的数据库名”为 adatabase。

默认情况下,MySQL 服务的端口号为 3306,如果采用默认的端口号,可以不用指定;如果采用了其他的端口号,比如采用 3308 端口,则需要特别指定,例如 127.0.0.1:3308,表示 MySQL 服务于本地机器的 3308 端口。

提示,localhost 换成本地地址或者 127.0.0.1 都能实现同样的效果。

如果数据库连接失败,PHP 会发出警告信息,如下图所示。


图 3 警告信息

警告信息中,提示用 root 账号无法连接到数据库服务器,并且该警告并不会停止脚本的继续执行。

可见,这样的提示信息会暴露数据库连接的敏感问题,不利于数据库的安全性。如果想提高安全性,避免错误信息的输出,可以加上 @ 屏蔽错误信息,然后加上 die() 函数进行屏蔽的错误处理机制。

例如:
  1. <?php
  2. $db=@mysqli_connect('localhost','root','666666','adatabase')
  3. or die("无法连接到服务器"); //连接数据库
  4. print("成功连接到服务器");
  5. mysqli_close($db);
  6. ?>
如果数据库连接失败,PHP 会发出警告信息,如下图所示。这是安全连接MySQL数据库服务器的方法。


图 4 警告信息

2) 使用mysqli_select_db()函数更改默认的数据库

连接到数据库以后,如果需要更改默认的数据库,可以使用函数 mysqli_select_db()。它的格式为:
mysqli_select_db(数据库服务器连接对象,更改后数据库名)
前面实例中的 $db = mysqli_connect('localhost','root','753951','adatabase'); 语句已经通过传递参数值 adatabase 确定了需要操作的默认数据库。如果不传递此参数,mysqli_connect() 函数只提供“MYSQL服务器地址”“用户名”和“用户密码”,一样可以连接到 MySQL 数据库服务器并且以相应的用户登录。

如果上例的语句变为 $db =mysqli_connect('localhost','root','753951');,一样可以成立。但是,在这但是,在这样的情况下,必须继续选择具体的数据库来进行操作。

如果把前面实例文件中的语句:
  • $db = mysqli_connect('localhost','root','753951','adatabase');
修改为以下两个语句:
  • $db = mysqli_connect('localhost','root','753951');
  • mysqli_select_db($db,'adatabase');
程序运行效果将完全一样。在新的语句中,mysqli_select_db($db,'adatabase'); 语句确定了“数据库服务器连接对象”为$db,“目标数据库名”为 adatabase。

3) 使用mysqli_close()函数关闭MySQL连接

在连接数据库时,可以使用 mysqli_connect() 函数。与之相对应,在完成了一次对服务器的使用的情况下,需要关闭此连接,以免对 MySQL 服务器中的数据进行误操作,并对资源进行释放。一个服务器的连接也是一个对象型的数据类型。

mysqli_close() 函数的格式为:
mysqli_close(需要关闭的数据库连接对象)
前面实例程序中,mysqli_close($db); 语句关闭了“需要关闭的数据库连接对象”为 $db 对象。

4) 使用mysqli_query()函数执行SQL语句

使用 mysqli_query() 函数执行 SQL 语句,需要向此函数中传递两个参数,一个是 MySQL 数据库服务器连接对象;另一个是以字符串表示的 SQL 语句。

mysqli_query() 函数的格式如下:
mysqli_query(数据库服务器连接对象,SQL语句)
在运行下面的实例前,用户要在 MySQL 服务器上创建 adatabase 数据库,添加数据表 user,数据表 user 主要包括 Id(工号)、Name(姓名)、Age(年龄)、Gender(性别)和 Info(个人信息)字段。
  1. <?php
  2. $db=@mysqli_connect('localhost','root','753951','adatabase')
  3. or die("无法连接到服务器"); //连接数据库
  4. //执行插入数据操作
  5. $sql = "insert into user(Id,Name,Age,Gender,Info)
  6. values(1,'lili',17,'female','She is a 17 years lady'),
  7. (2,'xiaoming',19,'female','She is a 19 years lady'),
  8. (3,'huahua',20,'female','She is a 20 years lady'),
  9. (4,'fangfang',18,'female','She is a 18 years lady')";
  10. $result = mysqli_query($db,$sql); //$result 为 boolean 类型
  11. if ($result) {
  12. echo "插入数据成功!<br/>";
  13. } else {
  14. echo "插入数据失败!<br/>";
  15. }
  16. // 执行更新数据操作
  17. $sql = "update user set Name='张芳' where Name='fangfang'";
  18. $result = mysqli_query($db,$sql);
  19. if($result) {
  20. echo "更新数据成功!<br/>";
  21. } else {
  22. echo "更新数据失败!<br/>";
  23. }
  24. // 执行查询数据操作
  25. $sql = "select * from user";
  26. $result = mysqli_query($db,$sql); //如果查询成功,$result 为资源类型,保存查询结果集
  27. mysqli_close($db);
  28. ?>
程序执行后的结果如下图所示:


图 5 程序运行结果

可见,mysqli_query() 函数执行 SQL 语句之后会把结果返回。上例中倒数第 2 行代码就是返回结果并且赋值给 $result 变量。

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

使用 mysqli_num_rows() 函数获取查询结果包含的数据记录的条数,只需要给出返回的数据对象即可。语法格式如下:
mysqli_num_rows(result);
其中 result 指查询结果对象,此函数只对 select 语句有效。

如果想获取查询、插入、更新和删除操作所影响的行数,需要使用 mysqli_affected_rows() 函数。mysqli_affected_rows() 函数返回前一次 MySQL 操作所影响的行数。语法格式如下:
  • mysqli_affected_rows(connection)
其中,connection 为必需参数,表示当前的 MySQL 连接。如果返回结果为 0,就表示没有受影响的记录;返回结果为 -1,则表示查询返回错误。

下面通过实例来讲解它们的使用方法和区别。
  1. <?php
  2. $db=@mysqli_connect('localhost','root','753951','adatabase')
  3. or die("无法连接到服务器"); //连接数据库
  4. //执行查询数据操作
  5. $sq = "select * from user";
  6. $result = mysqli_query($db,$sq);//如果查询成功,$result为资源类型,保存查询结果集
  7. echo"查询结果有".mysqli_num_rows($result)."条记录" <br/>;//输出查询记录集的行数
  8. // 执行更新数据操作
  9. $sq = "update user set Name='mingming' where Name='张芳'";
  10. $result = mysqli_query($db,$sq);
  11. echo "更新了".mysqli_affected_rows($db). "条记录"; //输出更新记录集的行数
  12. mysqli_close($db);
  13. ?>
程序执行后的结果如下图所示:


图 6 程序运行结果

6) 获取结果集中的一条记录作为枚举数组

执行 select 查询操作后,使用 mysqli_fetch_rows() 函数可以从查询结果中取出数据。如果想逐行取出每条数据,可以结合循环语句循环输出。

mysqli_fetch_rows() 函数的语法格式如下:
mysqli_fetch_rows (result);
其中,result 指查询结果对象。

例如:
  1. <?php
  2. $db=@mysqli_connect('localhost','root','753951','adatabase')
  3. or die("无法连接到服务器"); //连接数据库
  4. //执行查询数据操作
  5. $sql = "select * from user";
  6. $result = mysqli_query($db,$sql);//如果查询成功,$result 为资源类型,保存查询结果集
  7. ?>
  8. <table width="370" border="1" cellspacing="0" cellpadding="0">
  9. <tr><th>编号</th><th>姓名</th><th>年龄</th><th>性别</th><th>个人信息</th></tr>
  10. <?php
  11. while($row = mysqli_fetch_row($result)) { //逐行获取结果集中的记录,并显示在表格中
  12. ?>
  13. <tr>
  14. <td><?php echo $row[0] ?></td> <!-- 显示第一列 -->
  15. <td><?php echo $row[1] ?></td> <!-- 显示第二列 -->
  16. <td><?php echo $row[2] ?></td> <!-- 显示第三列 -->
  17. <td><?php echo $row[3] ?></td> <!-- 显示第四列 -->
  18. <td><?php echo $row[4] ?></td> <!-- 显示第五列 -->
  19. </tr>
  20. <?php }
  21. mysqli_close($db);
  22. ?>
程序执行后的结果如下图所示。

图 7 程序运行结果

7) 获取结果集中的记录作为关联数组

使用 mysqli_fetch_assoc() 函数从数组结果集中获取信息,只要确定 SQL 请求返回的对象就可以了。语法格式如下:
mysqli_ fetch_assoc (result);
此函数与 mysqli_fetch_rows() 函数的不同之处就是返回的每一条记录都是关联数组。注意,该函数返回的字段名是区分大小写的。

例如:
  1. <?php
  2. while($row = mysqli_fetch_assoc($result)) { // 逐行获取结果集中的记录
  3. ?>
  4. <tr>
  5. <td><?php echo $row["Id"] ?></td> <!-- 获取当前行“Id”字段值 -->
  6. <td><?php echo $row["Name"] ?></td> <!-- 获取当前行“Name”字段值 -->
  7. <td><?php echo $row["Age"] ?></td> <!-- 获取当前行“Age”字段值 -->
  8. <td><?php echo $row["Gender"] ?></td> <!-- 获取当前行“Gender”字段值 -->
  9. <td><?php echo $row["Info"] ?></td> <!-- 获取当前行“Info”字段值 -->
  10. </tr>
  11. <?php }
  12. mysqli_close($db);
  13. ?>
$row = mysqli_fetch_assoc($result); 语句直接从 $result 结果中取得一行,并且以关联数组的形式返回给 $row。由于获得的是关联数组,因此在读取数组元素的时候要通过字段名称确定数组元素。

8) 获取结果集中的记录作为对象

使用 mysqli_fetch_object() 函数从结果中获取一行记录作为对象。语法格式如下:
mysqli_fetch_object (result);
例如:
  1. <?php
  2. while($row = mysqli_fetch_object($result)) { // 逐行获取结果集中的记录
  3. ?>
  4. <tr>
  5. <td><?php echo $row->Id ?></td> <!-- 获取当前行“Id”字段值 -->
  6. <td><?php echo $row->Name ?></td> <!-- 获取当前行“Name”字段值 -->
  7. <td><?php echo $row->Age ?></td> <!-- 获取当前行“Age”字段值 -->
  8. <td><?php echo $row->Gender ?></td> <!-- 获取当前行“Gender”字段值 -->
  9. <td><?php echo $row->Info ?></td> <!-- 获取当前行“Info”字段值 -->
  10. </tr>
  11. <?php }
  12. mysqli_close($db);
  13. ?>
该程序的整体运行结果和上一节实例相同。不同的是,这里的程序采用了对象和对象属性的表示方法,但是最后输出的数据结果是相同的。

9) 使用mysqli_fetch_array()函数获取结果集记录

mysqli_fetch_array()函数的语法格式如下:
mysqli_fetch_ array (result[,resuilt_type])
参数 resuilt_type 是可选参数,表示一个常量,可以选择 MYSQL_ASSOC(关联数组)、MYSQL_NUM(数字数组)和 MYSQL_BOTH(二者兼有),本参数的默认值为 MYSQL_BOTH。

例如:
  1. <?php
  2. while($row = mysqli_fetch_array($result)) { // 逐行获取结果集中的记录
  3. ?>
  4. <tr>
  5. <td><?php echo $row["Id"] ?></td> <!-- 使用字段名做索引显示字段值 -->
  6. <td><?php echo $row["1"] ?></td> <!-- 使用数字做索引显示字段值 -->
  7. <td><?php echo $row["Age"] ?></td>
  8. <td><?php echo $row["3"] ?></td>
  9. <td><?php echo $row["Info"] ?></td>
  10. </tr>
  11. <?php }
  12. mysqli_close($db);
  13. ?>

10) 使用mysqli_free_result()函数释放资源

释放资源的函数为 mysqli_free_result(),函数的格式为:
mysqli_free_result(SQL请求所返回的数据库对象)
在一切操作都基本完成以后,程序通过 mysqli_free_result($result); 语句释放了 SQL 请求所返回的对象 $result 所占用的资源。

PHP操作数据库实战演练

下面以通过 Web 向 user 数据库请求数据为例,介绍如何使用 PHP 函数处理 MySQL 数据库数据,具体步骤如下:

1) 在网址主目录下创建 phpmysql 文件夹。

2) 在 phpmysql 文件夹下建立文件 htmlform.html,输入如下代码:
  1. <html>
  2. <head>
  3. <meta charset="UTF-8">
  4. <title>Finding User</title>
  5. </head>
  6. <body>
  7. <h2>从数据表 user 中查询数据</h2>
  8. <form action="formhandler.php" method="post">
  9. 姓名:
  10. <input name="username" type="text" size="20"/> <br />
  11. <input name="submit" type="submit" value="搜索"/>
  12. </form>
  13. </body>
  14. </html>

3) 在 phpmysql 文件夹下建立文件 formhandler.php,输入如下代码:
  1. <?php
  2. $username = $_POST['username'];
  3. if(!$username){
  4. echo "Error: There is no data passed.";
  5. exit;
  6. }
  7.  
  8. $username = addslashes($username);
  9. @ $db = mysqli_connect('localhost','root','','adatabase');
  10. if(mysqli_connect_errno()){
  11. echo "Error: Could not connect to mysql database.";
  12. exit;
  13. }
  14.  
  15. $q = "SELECT * FROM user WHERE name = '".$username."'";
  16. $result = mysqli_query($db,$q);
  17. $rownum = mysqli_num_rows($result);
  18. for($i=0; $i<$rownum; $i++){
  19. $row = mysqli_fetch_assoc($result);
  20. echo "编号:".$row['Id']."<br />";
  21. echo "姓名:".$row['Name']."<br />";
  22. echo "年龄:".$row['Age']."<br />";
  23. echo "性别:".$row['Gender']."<br />";
  24. echo "个人信息:".$row['Info']."<br />";
  25. }
  26. mysqli_free_result($result);
  27. mysqli_close($db);
  28. ?>

4) 运行 htmlform.html,结果如下图所示。


图 8 htmlform.html页面

5) 在输入框中输入用户名 lili,单击搜索按钮,页面跳转至 formhandler.php,并且返回请求结果,如下图所示:


图 9 formhandler.php页面

相关文章