0

0

借助PHP Mysqli扩展实现MySQL数据库交互

coldplay.xixi

coldplay.xixi

发布时间:2020-09-07 09:20:02

|

2760人浏览过

|

来源于xueyuanjun

转载

借助PHP Mysqli扩展实现MySQL数据库交互

【相关学习推荐:php编程(视频)】

引言

前面给大家简单介绍了如何在本地安装 MySQL 以及通过命令行和 GUI 客户端软件与 MySQL 服务器进行交互。

在命令行可以通过命令与 MySQL 交互,在客户端软件可以通过图形化界面与 MySQL 交互,那么在 PHP 程序中如何建立与 MySQL 的连接和交互呢?实际上,我们完全可以把 PHP 应用看作是 MySQL 服务器的客户端,然后通过封装好的 PHP 扩展包提供的 API 与 MySQL 服务器进行交互,就好像我们在命令行和客户端软件中所做的一样,只不过现在这种交互由手动操作转变成了通过编写对应的 PHP 代码来完成。

PHP MySQLi 扩展

PHP 官方提供了很多用于与 MySQL 服务器进行交互的扩展,从最早的 mysql 到后来增强版的 mysqli(更加安全),它们都是 PHP 函数式编程时代的扩展包,一般来说,本地 PHP 集成开发环境都会自带 mysqli 扩展:

立即学习PHP免费学习笔记(深入)”;

-w364

下面我们通过一个简单的示例来演示如何通过 mysqli 扩展与 MySQL 服务器交互。

数据库连接与查询

示例代码

php_learning 目录下新增一个 mysql 子目录,然后在该子目录下新建一个 mysqli.php 文件,编写一段通过 mysqli 扩展 API 建立数据库连接和查询的代码:

可以看到,通过 mysqli_connect 函数即可建立与 MySQL 数据库的连接,我们传入了5个参数,依次是数据库主机、用户名、密码、数据库名称和端口号,建立连接成功后,就可以持有这个连接实例通过 mysqli_query 函数执行数据库查询了,我们将 SQL 语句作为第二个参数传入,该函数的返回结果是一个查询结果集实例,拿到这个实例之后,就可以通过 mysqli_fetch_* 系列函数获取结果数据了。

这里我们通过 mysqli_fetch_all 函数获取所有查询结果,通过 php -S localhost:9000 启动 PHP 内置 HTTP 服务器:

-w615

就可以在浏览器中通过 http://localhost:9000/mysql/mysqli.php 打印的查询结果了:

-w798

优化渲染效果

这个时候页面样式可读性很差,可以在源码中打印输出结果之前,插入一段 echo '

' 代码优化渲染效果:

// 获取所有结果
$rows = mysqli_fetch_all($res);
echo '
';
var_dump($rows);

刷新浏览器页面,就可以看到如下打印效果:

-w544

相关学习推荐:mysql教程(视频)

设置字符编码

这里有个小问题,那就是 Emoji 表情符号没有正常显示出来,乱码了,我们可以像在命令行中设置默认字符编码一样,通过 mysqli_set_charset 函数设置字符编码为 utf8mb4

PHP Apache和MySQL 网页开发初步
PHP Apache和MySQL 网页开发初步

本书全面介绍PHP脚本语言和MySOL数据库这两种目前最流行的开源软件,主要包括PHP和MySQL基本概念、PHP扩展与应用库、日期和时间功能、PHP数据对象扩展、PHP的mysqli扩展、MySQL 5的存储例程、解发器和视图等。本书帮助读者学习PHP编程语言和MySQL数据库服务器的最佳实践,了解如何创建数据库驱动的动态Web应用程序。

下载
// 通过 mysqli 扩展建立与 mysql 服务器的连接
$conn = mysqli_connect($host, $user, $password, $dbname, $port);
// 设置字符编码为 utf8mb4
mysqli_set_charset($conn, 'utf8mb4');

...

// 获取所有结果
$rows = mysqli_fetch_all($res);
echo '
';
var_dump($rows[2]);

刷新页面就可以看到 Emoji 表情了:

-w482

返回关联数组

目前返回的结果是索引数组,无法得知数值对应的字段名,要获取完整的字段名与字段值映射,可以将传入 mysqli_fetch_all 函数的第二个参数值设置为 MYSQLI_ASSOC 来实现(默认是 MYSQLI_NUM):

// 获取所有结果(关联数组)
$rows = mysqli_fetch_all($res, MYSQLI_ASSOC);
echo '
';
var_dump($rows[2]);

-w528

返回单条结果

上面返回的都是多条结果(即使只返回一条记录,返回的也是多维数组),有时候,我们只想返回结果集中的第一条结果,这时候可以通过 mysqli_fetch_row 函数来实现:

// 在连接实例上进行查询
$sql = 'SELECT * FROM `post` WHERE id = 1';
$res = mysqli_query($conn, $sql);

// 获取所有结果
/*
$rows = mysqli_fetch_all($res, MYSQLI_ASSOC);
echo '
';
var_dump($rows);*/

// 获取单条结果
$row = mysqli_fetch_row($res);
echo '
';
var_dump($row);

刷新浏览器测试页面,打印结果如下:

-w579

可以看到返回结果已经是一个一维数组了,只包含一条记录。如果想要返回关联数组结果,需要通过一个新的函数 mysqli_fetch_assoc 函数来实现:

// 获取单条结果
// $row = mysqli_fetch_row($res);
$row = mysqli_fetch_assoc($res);
echo '
';
var_dump($row);

对应的打印结果如下:

-w560

将返回结果映射到指定对象

除了返回数组格式结果外,还可以借助 mysqli_fetch_object 函数将数据库查询结果映射到指定对象实例并返回:

class Post
{
    public $id;
    public $title;
    public $content;
    public $created_at;

    public function __toString()
    {
        return '[#' . $this->id . ']' . $this->title;
    }
}
// 将数据库返回结果映射到指定个对象
$post = mysqli_fetch_object($res, Post::class);
echo $post;

对应的打印结果如下,说明对象映射成功(调用了对象的魔术方法 __toString 打印输出该对象):

-w510

避免 SQL 注入攻击

在上述数据库查询操作中,我们直接将原生 SQL 语句传递给 MySQL 数据库执行,如果 SQL 语句中包含了用户传递的参数,则存在 SQL 注入风险,要避免 SQL 注入攻击,在 mysqli 扩展中,可以通过构建预处理语句的方式实现:

  1. 首先通过 mysqli_prepare 函数构建包含占位符(替代具体参数值)的预处理 SQL 语句;
  2. 然后通过 mysqli_stmt_bind_param 函数将参数值绑定到预处理语句;
  3. 最后通过 mysqli_stmt_execute 函数执行填充参数值之后的完整 SQL 语句,由于底层做了转化处理,所以这时候执行的 SQL 语句不存在 SQL 注入风险。

下面,我们以插入记录到数据库为例,演示如何通过预处理语句的方式与数据库交互,提高代码安全性。

插入记录到数据库

我们首先基于预处理语句编写插入记录到数据库的代码如下(基于上面的 $conn 连接实例):

// 插入记录到数据库
$sql = 'INSERT INTO `post` (title, content, created_at) VALUES (?, ?, ?)';
// 构建预处理 SQL 语句
$stmt = mysqli_prepare($conn, $sql);

// 绑定参数值
$title = '这是一篇测试文章';
$content = '测试文章啊啊啊

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

57

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

57

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

237

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

393

2026.01.23

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

17

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

103

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

73

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

81

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

70

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 9.4万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.1万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号