借助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
扩展:
下面我们通过一个简单的示例来演示如何通过 mysqli
扩展与 MySQL 服务器交互。
数据库连接与查询
示例代码
在 php_learning
目录下新增一个 mysql
子目录,然后在该子目录下新建一个 mysqli.php
文件,编写一段通过 mysqli
扩展 API 建立数据库连接和查询的代码:
<?php $host = '127.0.0.1'; // MySQL 服务器主机地址 $port = 3306; // MySQL 服务器进程端口号 $user = 'root'; // 用户名 $password = 'root'; // 密码 $dbname = 'test'; // 使用的数据库名称 // 通过 mysqli 扩展建立与 mysql 服务器的连接 $conn = mysqli_connect($host, $user, $password, $dbname, $port); // 在连接实例上进行查询 $sql = 'SELECT * FROM `post`'; $res = mysqli_query($conn, $sql); // 获取所有结果 $rows = mysqli_fetch_all($res); var_dump($rows); // 释放资源 mysqli_free_result($res); // 关闭连接 mysqli_close($conn);
可以看到,通过 mysqli_connect 函数即可建立与 MySQL 数据库的连接,我们传入了5个参数,依次是数据库主机、用户名、密码、数据库名称和端口号,建立连接成功后,就可以持有这个连接实例通过 mysqli_query 函数执行数据库查询了,我们将 SQL 语句作为第二个参数传入,该函数的返回结果是一个查询结果集实例,拿到这个实例之后,就可以通过 mysqli_fetch_*
系列函数获取结果数据了。
这里我们通过 mysqli_fetch_all
函数获取所有查询结果,通过 php -S localhost:9000
启动 PHP 内置 HTTP 服务器:
就可以在浏览器中通过 http://localhost:9000/mysql/mysqli.php
打印的查询结果了:
优化渲染效果
这个时候页面样式可读性很差,可以在源码中打印输出结果之前,插入一段 echo '<pre class="brush:php;toolbar:false">' 代码优化渲染效果:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">// 获取所有结果
$rows = mysqli_fetch_all($res);
echo '<pre class="brush:php;toolbar:false">';
var_dump($rows);</pre><div class="contentsignin">登录后复制</div></div><p>刷新浏览器页面,就可以看到如下打印效果:</p><p><img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/000/000/052/0484d0f78604d4034b0aeb405d778106-3.jpg" class="lazy" alt="-w544"></p><blockquote><p>相关学习推荐:<a href="https://www.php.cn/course/list/51.html" target="_blank">mysql教程</a>(视频)</p></blockquote><p><strong>设置字符编码</strong></p><p>这里有个小问题,那就是 Emoji 表情符号没有正常显示出来,乱码了,我们可以像在命令行中设置默认字符编码一样,通过 mysqli_set_charset 函数设置字符编码为 <code>utf8mb4
:
// 通过 mysqli 扩展建立与 mysql 服务器的连接 $conn = mysqli_connect($host, $user, $password, $dbname, $port); // 设置字符编码为 utf8mb4 mysqli_set_charset($conn, 'utf8mb4'); ... // 获取所有结果 $rows = mysqli_fetch_all($res); echo '<pre class="brush:php;toolbar:false">'; var_dump($rows[2]);
刷新页面就可以看到 Emoji 表情了:
返回关联数组
目前返回的结果是索引数组,无法得知数值对应的字段名,要获取完整的字段名与字段值映射,可以将传入 mysqli_fetch_all
函数的第二个参数值设置为 MYSQLI_ASSOC
来实现(默认是 MYSQLI_NUM
):
// 获取所有结果(关联数组) $rows = mysqli_fetch_all($res, MYSQLI_ASSOC); echo '<pre class="brush:php;toolbar:false">'; var_dump($rows[2]);
返回单条结果
上面返回的都是多条结果(即使只返回一条记录,返回的也是多维数组),有时候,我们只想返回结果集中的第一条结果,这时候可以通过 mysqli_fetch_row 函数来实现:
// 在连接实例上进行查询 $sql = 'SELECT * FROM `post` WHERE id = 1'; $res = mysqli_query($conn, $sql); // 获取所有结果 /* $rows = mysqli_fetch_all($res, MYSQLI_ASSOC); echo '<pre class="brush:php;toolbar:false">'; var_dump($rows);*/ // 获取单条结果 $row = mysqli_fetch_row($res); echo '<pre class="brush:php;toolbar:false">'; var_dump($row);
刷新浏览器测试页面,打印结果如下:
可以看到返回结果已经是一个一维数组了,只包含一条记录。如果想要返回关联数组结果,需要通过一个新的函数 mysqli_fetch_assoc 函数来实现:
// 获取单条结果 // $row = mysqli_fetch_row($res); $row = mysqli_fetch_assoc($res); echo '<pre class="brush:php;toolbar:false">'; var_dump($row);
对应的打印结果如下:
将返回结果映射到指定对象
除了返回数组格式结果外,还可以借助 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
打印输出该对象):
避免 SQL 注入攻击
在上述数据库查询操作中,我们直接将原生 SQL 语句传递给 MySQL 数据库执行,如果 SQL 语句中包含了用户传递的参数,则存在 SQL 注入风险,要避免 SQL 注入攻击,在 mysqli
扩展中,可以通过构建预处理语句的方式实现:
- 首先通过 mysqli_prepare 函数构建包含占位符(替代具体参数值)的预处理 SQL 语句;
- 然后通过 mysqli_stmt_bind_param 函数将参数值绑定到预处理语句;
- 最后通过 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 Mysqli扩展实现MySQL数据库交互的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

PHP仍然具有活力,其在现代编程领域中依然占据重要地位。1)PHP的简单易学和强大社区支持使其在Web开发中广泛应用;2)其灵活性和稳定性使其在处理Web表单、数据库操作和文件处理等方面表现出色;3)PHP不断进化和优化,适用于初学者和经验丰富的开发者。

PHP用于构建动态网站,其核心功能包括:1.生成动态内容,通过与数据库对接实时生成网页;2.处理用户交互和表单提交,验证输入并响应操作;3.管理会话和用户认证,提供个性化体验;4.优化性能和遵循最佳实践,提升网站效率和安全性。

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

PHP和Python各有优劣,选择取决于项目需求和个人偏好。1.PHP适合快速开发和维护大型Web应用。2.Python在数据科学和机器学习领域占据主导地位。

在 Docker 中启动 MySQL 的过程包含以下步骤:拉取 MySQL 镜像创建并启动容器,设置根用户密码并映射端口验证连接创建数据库和用户授予对数据库的所有权限

MySQL在Web应用中的主要作用是存储和管理数据。1.MySQL高效处理用户信息、产品目录和交易记录等数据。2.通过SQL查询,开发者能从数据库提取信息生成动态内容。3.MySQL基于客户端-服务器模型工作,确保查询速度可接受。
