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

PHP MySQLi操作数据库详解(附带实例)

PHP 作为一门编程语言,其本身并不具备操作数据库的功能。若想要通过 PHP 操作数据库,就需要借助 PHP 提供的数据库扩展。

MySQLi 扩展是 PHP 中专门用于与 MySQL 数据库交互的扩展,它是 PHP 早期版本中的 MySQL 扩展的增强版,不仅包含所有 MySQL 扩展的功能函数,还可以使用 MySQL 新版本中的高级特性。

例如,多语言执行和事务的执行,采用预处理方式解决 SQL 注入问题等。MySQLi 扩展只支持 MySQL 数据库,如果不考虑使用其他数据库,该扩展是一个非常好的选择。

MySQLi 扩展提供了大量的函数来操作 MySQL,使得在 PHP 程序中操作数据库变得轻松、便捷。本节将对 MySQLi 扩展的使用进行详细讲解。

开启MySQLi扩展

PHP 中的 MySQLi 扩展默认没有开启,使用时需要开启。开启的方法是:在 PHP 的配置文件 php.ini 中找到“;extension= mysqli”配置项,去掉前面的分号“;”,即可开启 MySQLi 扩展。

修改后的配置代码如下:
extension=mysqli
修改配置后,保存配置文件并重启 Apache 使配置生效。可通过 phpinfo() 函数查看 MySQLi 扩展是否开启成功,具体如下图所示。


图 1 查看MySQLi扩展是否开启成功

MySQLi扩展的常用函数

MySQLi 扩展内置了用于实现连接数据库、设置字符集、获取结果集中的信息等功能的函数。

MySQLi 扩展的常用函数如下表所示:

表:MySQLi扩展的常用函数
函数 描述
mysqli_connect(string $hostname, string $username, string $password, string $database, int $port, string $socket) 连接数据库,连接成功返回连接对象,失败返回 false
mysqli_connect_error() 获取连接时的错误信息,返回带有错误描述的字符串
mysqli_select_db(mysqli $mysqli, string $database) 选择数据库,若成功返回 true,失败返回 false
mysqli_set_charset(mysqli $mysqli, string $charset) 设置客户端字符集,若成功返回 true,失败返回 false
mysqli_query(mysqli $mysqli, string $query) 执行数据库查询,写操作返回 true,读操作返回结果集对象,失败返回 false
mysqli_insert_id(mysqli $mysqli) 获取上一次插入操作产生的 id
mysqli_affected_rows(mysqli $mysqli) 获取上一次操作受影响的行数
mysqli_num_rows(mysqli_result $result) 获取结果中的行数
mysqli_fetch_assoc(mysqli_result $result) 获取一行结果并以关联数组返回
mysqli_fetch_row(mysqli_result $result) 获取一行结果并以索引数组返回
mysqli_fetch_all(mysqli_result $result, int $mode) 获取所有的结果,并以数组方式返回
mysqli_fetch_array(mysqli_result $result, int $mode) 从结果集中获取一行作为索引数组或关联数组
mysqli_free_result(mysqli_result $result) 释放结果集
mysqli_errno(mysqli $mysqli) 返回最近函数的错误编号
mysqli_error(mysqli $mysqli) 返回最近函数的错误信息
mysqli_report(int $flags) 开启或禁用 MySQL 内部错误报告
mysqli_close(mysqli $mysqli) 关闭数据库连接

使用MySQLi扩展操作数据库

使用 MySQLi 扩展连接数据库包括个步骤,分别是连接数据库、错误处理、设置字符集和关闭数据库连接。下面对这个步骤进行讲解。

1) 连接数据库

使用 MySQLi 扩展操作数据前,需要连接数据库。使用 mysqli_connect() 函数连接数据库的语法格式如下:
mysqli_connect(
    string hostname,    // 主机名或IP地址
    string username,    // 用户名
    string password,    // 密码
    string dbname,  // 数据库名
    int port,         // 端口号
    string socket      // socket通信(适用于Linux环境)
)
在上述语法格式中,mysqli_connect() 函数共有个可选参数,当省略参数时,将自动使用 php.ini 中配置的默认值。若数据库连接成功,返回一个数据库连接对象;若数据库连接失败,返回 false 并显示 Fatal error 类型的错误信息。

为了帮助读者更好地理解,下面演示如何使用 mysqli_connect() 函数连接数据库,具体步骤如下:、
① 登录 MySQL 数据库后,创建 mydb 数据库,具体 SQL 语句如下:
CREATE DATABASE IF NOT EXISTS `mydb`;

② 在 mydb 数据库中创建 student 数据表并插入数据,具体 SQL 语句如下:
# 创建student数据表
CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
# 插入数据
INSERT INTO `student` VALUES ('1', 'Tom', '18'), ('2', 'Jack', '20'),
('3', 'Alex', '16'), ('4', 'Andy', '19');

③ 创建 connect.php,使用 mysqli_connect() 函数连接数据库,具体代码如下:
<?php
// 连接数据库
$link = mysqli_connect('localhost', 'root', '123456', 'mydb', '3306');
// 查看连接结果
echo $link ? '数据库连接成功' : '数据库连接失败';
上述代码用于连接主机名是 localhost、用户名是 root、密码是的 MySQL 服务器,选择的数据库是 mydb,端口号是 3306,$link 是返回的数据库连接对象。

通过浏览器访问 connect.php,数据库连接成功的提示信息如下图所示:


图 2 数据库连接成功的提示信息

从图中可以看出,页面输出“数据库连接成功”的提示信息。如果将函数的密码参数修改为“123”,由于密码是错误的,数据库会连接失败,提示信息如下图所示:


图 3 数据库连接失败的提示信息

从图中可以看出,当使用错误的密码连接数据库时,会出现 Fatal error 类型的错误,提示应使用正确的密码连接数据库。

2) 错误处理

当数据库连接失败时,mysqli_connect() 函数会返回很长的错误提示信息,这些错误提示信息的可读性比较差。为此,在连接数据库失败时可使用 mysqli_connect_error() 函数获取错误提示信息。mysqli_connect_error() 函数没有参数,返回值是一个字符串;如果没有发生错误,返回值为 NULL。

修改 connect.php 中连接数据库的代码,使用 mysqli_connect_error() 函数获取错误提示信息,具体代码如下:
<?php
// 禁用MySQL内部错误报告
mysqli_report(MYSQLI_REPORT_OFF);
// 连接数据库
$link = @mysqli_connect('localhost', 'root', '123', 'mydb');
if (!$link) {
    exit('mysqli connection error: ' . mysqli_connect_error());
}
在上述代码中,第 3 行代码使用 mysqli_report() 函数禁用 MySQL 内部错误报告,第 5 行代码使用“@”屏蔽 mysqli_connect() 函数的错误提示信息。当数据库连接对象 $link 的值为 false 时,执行第 7 行代码,使用 exit() 函数停止脚本运行,同时使用 mysqli_connect_error() 函数获取连接时错误提示信息并输出。第 5 行代码连接数据库时使用错误的密码“123”,运行程序后的输出结果如下图所示:


图 4 连接数据库时的错误提示信息

从图的输出结果可以看出,网页中显示了数据库连接失败的错误提示信息。为了不影响后面的使用,需要将连接数据库的代码中的密码修改为 123456。

3) 设置字符集

数据库连接成功后,还需要设置客户端字符集,以确保 PHP 与 MySQL 使用相同的字符集。使用 mysqli_set_charset() 函数设置字符集的语法格式如下:
mysqli_set_charset(mysqli $mysql, string $charset )
在上述语法格式中,mysqli_set_charset() 函数共有个参数:
在 connect.php 的现有代码后面,使用 mysqli_set_charset() 函数设置字符集,具体代码如下:
if (!mysqli_set_charset($link, 'utf8mb4')) {
    exit(mysqli_error($link));
}
上述代码中,使用 mysqli_set_charset() 函数设置字符集为 utf8mb4,使用 mysqli_error() 函数获取代码执行失败时的错误信息。

注意,为了避免中文乱码问题,需要保证 PHP 脚本文件、Web 服务器返回的编码、网页的 <meta> 标签、PHP 访问 MySQL 使用的字符集是统一的。

4) 关闭数据库连接

当不需要使用数据库连接时,需要关闭数据库连接。使用 mysqli_close() 函数关闭数据库连接的语法格式如下:
mysqli_close(mysqli $mysql)
在上述语法格式中,参数 $mysql 是数据库连接对象。传入要关闭的数据库连接对象,即可关闭已经打开的数据库连接。

在 connect.php 的现有代码后面,使用 mysqli_close() 函数关闭数据库连接,具体代码如下:
mysqli_close($link);
在上述代码中,使用 mysqli_close() 函数关闭了数据库连接。关闭数据库连接后,$link 将不能继续使用。

至此,已经实现了通过 MySQLi 扩展连接数据库,读者只需要掌握连接数据库的基本步骤。为了不影响后面的学习,暂时将关闭数据库连接的代码注释起来,以完成后续的数据操作。

使用MySQLi扩展操作数据

使用 MySQLi 扩展连接数据库后就可以实现对数据的操作,下面介绍新增数据、更新数据、删除数据和查询数据等操作。

1) 新增数据

在 connect.php 中添加新增数据的代码,具体代码如下:
// 新增数据的SQL语句
$query = 'INSERT INTO `student` VALUES(NULL, \'Bob\', 20)';
// 执行新增操作
$result = mysqli_query($link, $query);
if (!$result) {
    exit(mysqli_error($link));
}
echo '新增数据的id值: ' . mysqli_insert_id($link); // 获取自增id
在上述代码中,第 4 行代码通过 mysqli_query() 函数执行新增数据的 SQL 语句,如果执行 SQL 语句时出现错误,则使用 mysqli_error() 函数获取错误信息;执行完成后,通过 mysqli_insert_id() 函数获取新增数据的自增 id。

通过浏览器访问 connect.php,运行结果如下图所示:


图 5 新增数据

从图可以看出,页面输出了新增数据的 id 值。

脚本执行完成后,通过命令提示符窗口登录 MySQL,查询 student 数据表中的数据,验证数据是否新增成功,具体 SQL 语句及执行结果如下:
mysql> SELECT * FROM `student`;
+----+------+-----+
| id | name | age |
+----+------+-----+
| | Tom  | |
| | Jack | |
| | Alex | |
| | Andy | |
| | Bob  | |
+----+------+-----+
5 row in set (0.00 sec)
在上述查询结果中,显示了 id 为 5 的记录,说明新增数据成功。

2) 更新数据

通过 MySQLi 扩展对已有的数据进行更新操作,将 student 数据表中 id 值为的 age 字段修改为 21,具体代码如下:
// 更新数据的SQL语句
$query = 'UPDATE `student` SET `age`=21 WHERE `id`=5';
// 执行更新操作
$result = mysqli_query($link, $query);
if (!$result) {
    exit(mysqli_error($link));
}
// 返回结果
echo mysqli_affected_rows($link);
在上述代码中,执行更新语句后,第行代码通过 mysqli_affected_rows() 函数获取受影响的行数,根据受影响的行数可以判断是否更新成功。运行上述代码后输出的受影响的行数值为 1。

更新数据后,通过命令提示符窗口查询 student 数据表中 id 值为的数据,验证更新后的数据是否正确,具体 SQL 语句及执行结果如下:
mysql> SELECT * FROM `student` WHERE `id`=5;
+----+------+-----+
| id | name | age |
+----+------+-----+
| | Bob  | |
+----+------+-----+
1 rows in set(0.00sec)
在上述结果中,age 字段的值从原来的修改为了 21,说明更新数据成功。

3) 删除数据

通过 MySQLi 扩展对已有的数据进行删除操作,将 student 数据表中 id 值为的记录删除,具体代码如下:
// 删除数据的SQL语句
$query = 'DELETE FROM `student` WHERE `id`=5';
// 执行删除操作
$result = mysqli_query($link, $query);
if (!$result) {
    exit(mysqli_error($link));
}
// 返回结果
echo mysqli_affected_rows($link);
// 关闭连接
mysqli_close($link);

删除数据后,查询 student 数据表中的数据,具体 SQL 语句及执行结果如下:
mysql> SELECT * FROM `student`;
+----+------+-----+
| id | name | age |
+----+------+-----+
| | Tom  | |
| | Jack | |
| | Alex | |
| | Andy | |
+----+------+-----+
4 rows in set(0.00sec)
上述查询结果中没有 id 为的记录,说明删除数据成功。

4) 查询数据

通过 MySQLi 扩展查询 student 数据表的所有数据,具体代码如下:
// 查询数据的SQL语句
$query = 'SELECT * FROM `student`';
// 执行查询操作
$result = mysqli_query($link, $query);
if (!$result) {
     exit(mysqli_error($link));
}
// 处理结果集
$lists = [];
while ($row = mysqli_fetch_assoc($result)) {
    $lists[] = $row;
}
// 释放结果集资源
mysqli_free_result($result);
上述代码通过while语句和mysqli_fetch_assoc()函数的结合使用,将结果集中的每一行数据取出来保存到$lists变量中。

将查询出来的结果在页面中展示,具体代码如下:
echo '<table><tr><th>id</th><th>姓名</th><th>年龄</th></tr>';
foreach ($lists as $val) {
    echo
"<tr><td>{$val['id']}</td><td>{$val['name']}</td><td>{$val['age']}</td></tr>";
}
echo '</table>';
在上述代码中,第 2~4 行代码使用 foreach 语句将 $lists 中的内容遍历输出。

通过浏览器访问 connect.php,查询数据的运行结果如下图所示:


图 6 查询数据的运行结果

除了上述的方式外,当需要一次查询出所有的记录时,可以通过 mysqli_fetch_all() 函数来实现,示例代码如下:
// 一次查询所有记录
$data = mysqli_fet
// 输出查询结果
var_dump($data);
在上述代码中,$data 中存入了一个包含所有行的二维数组,其中每一行记录都是一个数字,使用 var_dump() 函数可以查看数组的结构。

另外,当需要一次查询一行记录时,还可以使用 mysqli_fetch_row() 函数或 mysqli_fetch_array() 函数来实现,它们的用法与 mysqli_fetch_assoc() 函数的用法类似。

相关文章