Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
PHP mysqli 数据库操作:面向对象与过程式风格的转换与最佳实践_创想鸟

PHP mysqli 数据库操作:面向对象与过程式风格的转换与最佳实践

PHP mysqli 数据库操作:面向对象与过程式风格的转换与最佳实践

本文深入探讨了 php `mysqli` 扩展中面向对象 (oop) 和过程式 (procedural) 两种编程风格的异同,通过具体代码示例演示了如何进行转换。文章强调了 oop 风格的优势,并推荐采用简化的 oop 风格或更高级的 pdo 扩展,以提升代码的可读性、维护性和安全性,避免常见的数据库操作误区。

引言

PHP mysqli 扩展为开发者提供了与 MySQL 数据库交互的能力,它支持两种主要的编程风格:面向对象 (OOP) 和过程式 (procedural)。对于习惯了过程式编程的开发者而言,初次接触面向对象风格可能会感到不适,但理解这两种风格的差异及其适用场景,对于编写高效、安全的数据库代码至关重要。本文将详细解析这两种风格,展示它们之间的转换方法,并提出在现代 PHP 开发中推荐的最佳实践。

理解 mysqli 的两种编程风格

mysqli 扩展旨在提供 mysql 扩展的增强替代品,并引入了面向对象接口。尽管如此,它也提供了一套过程式接口,主要是为了方便从旧版 mysql 扩展迁移代码。

面向对象 (OOP) 风格

在 OOP 风格中,我们首先创建一个 mysqli 类的实例来建立数据库连接,然后通过这个对象调用其方法来执行数据库操作。这种风格通常被认为是更现代、更易于理解和维护的方式。

示例:OOP 风格的数据库查询

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

function build_calendar_oop($month, $year){    // 建立数据库连接    $mysqli = new mysqli('localhost', 'root', '', 'ems');    if ($mysqli->connect_error) {        die("数据库连接失败: " . $mysqli->connect_error);    }    // 预处理语句    $stmt = $mysqli->prepare("SELECT event_date FROM bookings WHERE MONTH(event_date) = ? AND YEAR(event_date)=?");    if (!$stmt) {        die("预处理语句失败: " . $mysqli->error);    }    // 绑定参数    $stmt->bind_param('ss', $month, $year);    $bookings = array();    // 执行语句    if($stmt->execute()){        // 获取结果集        $result = $stmt->get_result();        if($result->num_rows > 0){            // 遍历结果            while($row = $result->fetch_assoc()){                $bookings[] = $row['event_date'];            }        }        // 关闭语句        $stmt->close();    } else {        die("语句执行失败: " . $stmt->error);    }    // 关闭连接    $mysqli->close();    // 返回预订日期数组    return $bookings;}

过程式 (Procedural) 风格

过程式风格则通过一系列以 mysqli_ 开头的函数来执行操作,其中许多函数都需要将 mysqli 连接对象作为第一个参数传入。这种风格对于习惯了早期 PHP 数据库函数(如 mysql_connect, mysql_query)的开发者来说可能更熟悉。

示例:过程式风格的数据库查询

function build_calendar_procedural($month, $year){    // 建立数据库连接    $mysqli = mysqli_connect('localhost', 'root', '', 'ems');    // 检查连接是否成功    if (mysqli_connect_errno()) {        die("数据库连接失败: " . mysqli_connect_error());    }    // 预处理语句    $stmt = mysqli_prepare($mysqli, "SELECT event_date FROM bookings WHERE MONTH(event_date) = ? AND YEAR(event_date)=?");    // 检查语句是否准备成功    if (!$stmt) {        die("预处理语句失败: " . mysqli_error($mysqli));    }    // 绑定参数    mysqli_stmt_bind_param($stmt, 'ss', $month, $year);    $bookings = array();    // 执行语句    if (mysqli_stmt_execute($stmt)) {        // 获取结果集        $result = mysqli_stmt_get_result($stmt);        if ($result && mysqli_num_rows($result) > 0) {            // 遍历结果            while ($row = mysqli_fetch_assoc($result)) {                $bookings[] = $row['event_date'];            }        }        // 关闭语句        mysqli_stmt_close($stmt);    } else {        die("语句执行失败: " . mysqli_stmt_error($stmt));    }    // 关闭连接    mysqli_close($mysqli);    return $bookings;}

核心区别:

两种风格的主要区别在于函数调用方式。OOP 风格通过对象方法调用,例如 $mysqli->prepare();而过程式风格则通过全局函数调用,并将连接对象作为第一个参数传入,例如 mysqli_prepare($mysqli, …)。从功能上讲,它们是等效的。

两种风格的等效转换

理解了两种风格后,我们可以看到它们之间存在直接的函数映射关系。以下是一些常见的转换示例:

OOP 风格方法 过程式风格函数 描述

$mysqli = new mysqli(…)mysqli_connect(…)建立数据库连接$mysqli->prepare(…)mysqli_prepare($mysqli, …)预处理 SQL 语句$stmt->bind_param(…)mysqli_stmt_bind_param($stmt, …)绑定参数$stmt->execute()mysqli_stmt_execute($stmt)执行预处理语句$stmt->get_result()mysqli_stmt_get_result($stmt)获取结果集$result->num_rowsmysqli_num_rows($result)获取结果集行数$result->fetch_assoc()mysqli_fetch_assoc($result)关联数组形式获取一行$stmt->close()mysqli_stmt_close($stmt)关闭预处理语句$mysqli->close()mysqli_close($mysqli)关闭数据库连接

通过这些映射,我们可以将 OOP 风格的代码片段完全转换为过程式风格,反之亦然。

最佳实践与现代化建议

尽管 mysqli 提供了两种风格,但在现代 PHP 开发中,有一些重要的考量和更推荐的做法。

为什么推荐面向对象风格

过程式 mysqli 风格的设计初衷主要是为了帮助那些从 PHP 4 的 mysql_* 扩展迁移代码的开发者。在新的代码库中,通常不建议使用过程式风格。OOP 风格提供了更清晰、更一致的接口,尽管使用它并不意味着你必须编写完整的面向对象应用程序,但它确实是 mysqli 扩展推荐和更直观的用法。

简化 mysqli 面向对象代码

原有的 OOP 风格代码在处理结果集时,需要手动遍历 while($row = $result->fetch_assoc()),这在某些情况下可以进一步简化。通过配置 mysqli 的错误报告模式并利用 fetch_all 方法,我们可以使代码更加简洁和健鲁。

推荐的简化 OOP 风格示例:

// 在应用初始化阶段配置错误报告,例如在连接数据库之前// 这会将mysqli的错误转换为PHP异常,有助于更早发现问题mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);// 建立数据库连接,通常作为参数传递或在全局范围内管理$mysqli_conn = new mysqli('localhost', 'root', '', 'ems');// 推荐设置字符集,避免乱码问题$mysqli_conn->set_charset("utf8mb4"); /** * 构建日历预订日期数组 * * @param mysqli $mysqli 数据库连接对象 * @param int $month 月份 * @param int $year 年份 * @return array 预订日期数组 */function build_calendar_simplified_oop(mysqli $mysqli, $month, $year): array{    // 预处理语句    $stmt = $mysqli->prepare("SELECT event_date FROM bookings WHERE MONTH(event_date) = ? AND YEAR(event_date)=?");    // 绑定参数    $stmt->bind_param('ss', $month, $year);    // 执行语句    $stmt->execute();    // 获取所有结果并以关联数组形式返回    $result = $stmt->get_result();    $bookings_raw = $result->fetch_all(MYSQLI_ASSOC);    // 如果只需要event_date的值,可以进一步处理    return array_column($bookings_raw, 'event_date');}// 示例调用$bookings_for_jan_2020 = build_calendar_simplified_oop($mysqli_conn, 1, 2020);print_r($bookings_for_jan_2020);// 在应用结束时关闭连接

以上就是PHP mysqli 数据库操作:面向对象与过程式风格的转换与最佳实践的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1330878.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
MySQL Trigger中执行外部PHP脚本的事务隔离与数据获取
上一篇 2025年12月12日 16:59:23
PHP proc_open 调用 mysqldump:安全处理密码的教程
下一篇 2025年12月12日 16:59:39

相关推荐

  • 香香漫画官方版入口2025 香香漫画正版免费阅读地址

    香香漫画官方版入口2025为https://www.xiangxiangmanhua.com,用户可通过该网址访问平台,享受涵盖恋爱、校园等多种题材的免费高清漫画资源,支持搜索、同步更新与跨设备阅读,并提供夜间模式、离线缓存等优化体验。 香香漫画官方版入口2025在哪里?这是不少网友都关注的,接下来…

    2026年9月24日
    100
  • PCIe 4.0和PCIe 5.0的固态硬盘,实际使用差别大吗?

    PCIe 5.0 SSD相比4.0在游戏加载中提升有限,仅快1-2秒且感知不强;但在视频剪辑、AI训练等生产力场景下,顺序读写速度提升近一倍,渲染和文件传输效率显著提高。 PCIe 4.0和5.0固态硬盘在实际使用中的差别,主要看你怎么用。对大多数普通用户来说,差距没想象中大;但如果你干的是专业活儿…

    2026年9月24日
    200
  • MySQL查询结果的排序和分页实现方法

    在mysql中,可以通过order by和limit关键字高效实现排序和分页。1.使用order by进行排序,支持升序和降序。2.使用limit和offset进行分页,控制返回结果的起始位置和数量。3.通过在排序列上创建索引,可以优化大数据集的查询性能。4.避免使用大offset值,改用主键或唯一…

    2026年9月24日
    000
  • UC浏览器在线使用官方入口 UC浏览器最新官网

    UC浏览器官方入口是https://www.uc.cn/,该官网提供最新版下载及核心功能如智能搜索、流量压缩、视频优化和夜间模式,并支持跨平台使用与数据同步。 UC浏览器在线使用官方入口在哪里?这是不少用户关心的问题,接下来由PHP小编为大家带来UC浏览器最新官网地址以及相关功能特点,想要了解这款浏…

    2026年9月24日
    100
  • Laravel Blade中条件隐藏元素的优雅实践

    本文探讨了在Laravel Blade模板中如何高效地实现HTML元素的条件隐藏。针对传统@if-@else语句导致代码冗余的问题,教程提出使用Blade的内联三元运算符在style属性中动态控制display: none,从而避免重复代码,提升模板的可读性和维护性。此外,还将介绍如何利用CSS类和…

    2026年9月24日
    100
  • mysql中如何排查磁盘空间不足问题

    先检查磁盘使用情况,使用df -h和du -sh定位大文件;再通过SQL查询分析数据库和表的空间占用;接着检查binlog、慢查询日志及临时文件;最后采取删除无用数据、归档、压缩、分区等措施释放空间并优化配置。 当MySQL出现磁盘空间不足时,可能会导致写入失败、服务中断甚至实例崩溃。排查这类问题需…

    2026年9月23日
    100
  • 如何在mysql中使用数值函数计算

    答案:MySQL数值函数用于执行数学运算,如ABS、ROUND、FLOOR、CEIL、MOD、POWER、SQRT等,可对数据直接计算。例如用ROUND四舍五入价格,TRUNCATE截断小数,FLOOR取整,MOD求余判断奇偶,SQRT开方,还可结合AVG、MAX等聚合函数使用,提升查询效率并减少应…

    2026年9月23日
    100
  • laravel API资源类怎么格式化JSON输出_laravel API资源类JSON格式化教程

    使用 Laravel API 资源类可统一 JSON 返回格式,通过 make:resource 创建资源类,在 toArray 中定义字段,控制器中返回 new UserResource($user) 或 UserResource::collection() 实现数据结构化输出。 如果您在使用 L…

    2026年9月23日
    300
  • PHP同页面无限次表单提交与显示:防止数据覆盖的实现技巧

    本教程详细阐述了如何在php中实现同页面多次表单提交而不覆盖先前数据的方法。核心策略是利用html的数组命名输入(`name=”field[]”`)来收集多个值,并在每次页面刷新时,通过隐藏输入字段重新提交已有的数据,从而在不依赖数据库的情况下,实现“无限”次提交并显示所有历…

    2026年9月23日
    100
  • 如何在mysql中优化存储引擎参数

    优化MySQL存储引擎需根据业务场景调整参数。1. InnoDB:设innodb_buffer_pool_size为内存50%~70%,合理配置日志参数提升I/O性能,选用O_DIRECT减少缓存冲突,按磁盘性能设置io_capacity;2. MyISAM:分配足够key_buffer_size,…

    2026年9月23日
    100
  • B站视频平台官网_B站官方网站主页入口

    B站官方网站主页入口是https://www.bilibili.com/,平台涵盖动画、游戏、音乐、科技等多元内容,支持弹幕互动、多端同步与离线缓存,构建了集观看、创作、社交于一体的视频生态体系。 B站视频平台官网入口地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来B站官方网站主页入口…

    2026年9月23日
    700
  • 如何预防单点故障?VIP高可用搭建解决步骤

    如何预防单点故障?VIP高可用搭建解决步骤如何预防单点故障?VIP高可用搭建解决步骤如何预防单点故障?VIP高可用搭建解决步骤如何预防单点故障?VIP高可用搭建解决步骤

    单点故障是系统稳定性最大威胁,因为其一旦发生将导致服务瞬间瘫痪。解决核心在于消除“唯一”组件,通过构建高可用集群实现冗余备份。具体步骤包括:1. 使用虚拟ip(vip)配合keepalived工具实现自动漂移;2. 配置至少两台服务器组成集群并通过心跳机制监测状态;3. 设置track_script…

    2026年9月23日 • 用户投稿
    500
  • 无主之地4桑吉巴特的最后安息之地在哪 桑吉巴特的最后安息之地攻略

    无主之地4桑吉巴特的最后安息之地在哪 桑吉巴特的最后安息之地攻略无主之地4桑吉巴特的最后安息之地在哪 桑吉巴特的最后安息之地攻略无主之地4桑吉巴特的最后安息之地在哪 桑吉巴特的最后安息之地攻略无主之地4桑吉巴特的最后安息之地在哪 桑吉巴特的最后安息之地攻略

    《无主之地4》中“桑吉巴特的最后安息之地”是隐藏支线任务“原谅我”的后续任务之一,玩家需前往特定隐秘地点才能完成该任务。 无主之地4桑吉巴特的最后安息之地位置指南 从当前位置出发,目的地就在地图上图标所指示的位置。 找到图中红框标记的目标区域,并按照箭头所示方向前进。 抵达图示位置后,继续沿箭头指引…

    2026年9月23日 • 用户投稿
    200
  • VSCode 怎样通过插件实现代码的语法检查 VSCode 代码语法检查插件的使用方法​

    VSCode 怎样通过插件实现代码的语法检查 VSCode 代码语法检查插件的使用方法​VSCode 怎样通过插件实现代码的语法检查 VSCode 代码语法检查插件的使用方法​VSCode 怎样通过插件实现代码的语法检查 VSCode 代码语法检查插件的使用方法​VSCode 怎样通过插件实现代码的语法检查 VSCode 代码语法检查插件的使用方法​

    vscode实现代码语法检查的核心是安装对应语言的linter插件,如javascript使用eslint,python使用pylint或ruff;2. 安装后需在项目根目录创建配置文件(如.eslintrc.js或pyproject.toml)或调整vscode设置以启用保存时自动修复等功能;3.…

    2026年9月23日 • 用户投稿
    500
  • mysql中cno是什么意思 mysql列名常见缩写解析

    在mysql中,”cno”通常指的是”course number”(课程编号)。1. “cno”在教育系统中用于唯一标识课程,常作为主键。2. 其他常见缩写包括”sno”(学生编号)、”tno…

    2026年9月23日
    100
  • php-gd怎么处理透明度_php-gd透明图像合并方案

    PHP-GD处理透明图像需正确设置Alpha通道,使用imagealphablending(false)和imagesavealpha(true)保留透明背景,加载PNG时用imagecreatefrompng()并配合imagecopy()进行无损合并,避免透明区域变黑或出现白边。 PHP-GD …

    2026年9月23日
    500
  • 一加R系列手机摄像头如何调整以拍出HDR视频?HDR视频的设置指南

    一加R系列手机摄像头如何调整以拍出HDR视频?HDR视频的设置指南一加R系列手机摄像头如何调整以拍出HDR视频?HDR视频的设置指南一加R系列手机摄像头如何调整以拍出HDR视频?HDR视频的设置指南一加R系列手机摄像头如何调整以拍出HDR视频?HDR视频的设置指南

    一加R系列拍摄HDR视频需开启相机中的HDR模式或选择4K等高分辨率视频模式,最佳光线为高对比度场景如日出日落,避免极暗或过亮环境,拍摄时启用防抖、使用三脚架以提升稳定性,并注意HDR视频具有更广动态范围和更高色深,但文件更大、对设备性能要求高,播放需支持HDR的设备以获得理想效果。 一加R系列手机…

    2026年9月23日 • 用户投稿
    200
  • 使用 Dompdf 一键生成大量 PDF 文件的优化方案

    本文旨在解决使用 Dompdf 生成大量 PDF 文件时遇到的超时问题。通过分析常见原因,提出了从Web服务器环境迁移到命令行环境,并配合 set_time_limit(0) 函数来避免执行超时,从而高效生成多个包含大量数据的 PDF 文件。 问题分析 从提供的代码片段可以看出,程序通过循环遍历 $…

    2026年9月23日
    600
  • mysql安装后怎么锁 mysql锁机制与使用方法详解

    mysql安装后怎么锁 mysql锁机制与使用方法详解mysql安装后怎么锁 mysql锁机制与使用方法详解mysql安装后怎么锁 mysql锁机制与使用方法详解mysql安装后怎么锁 mysql锁机制与使用方法详解

    mysql 的锁机制通过表级锁和行级锁管理并发访问,使用时需结合索引、事务控制以避免阻塞和死锁。1. 锁类型包括 myisam 的表级锁(读锁共享、写锁排他)和 innodb 的行级锁(记录锁、间隙锁、临键锁),后者并发性能更高;2. 手动加锁可通过 select … lock in s…

    2026年9月23日 • 用户投稿
    100
  • 如何在ArtRage中使用AI裁剪图片?快速掌握精准裁剪的技巧

    ArtRage不支持AI裁剪,但可先用稿定设计等AI工具智能裁剪图片,再导入ArtRage进行绘画创作,弥补其裁剪功能简单、无智能识别的不足,结合AI高效预处理与ArtRage真实笔触优势,提升数字绘画效率。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R…

    2026年9月23日
    500

发表回复

登录后才能评论
关注微信