PHP Mysqli 扩展常用操作与代码示例指南

林见深
林见深
发布时间:2026-10-13| 2人浏览过
原创

本文深入解析PHP Mysqli扩展的核心功能,包括配置文件设置、对象化数据库连接、防SQL注入的预处理语句(Prepared Statements)、多种数据提取方式(索引数组、关联数组、对象)以及基于InnoDB引擎的事务管理。通过具体代码实例,帮助开发者高效、安全地操作MySQL数据库。

准备工作与环境配置

Mysqli是PHP5.0引入的新扩展,采用面向对象设计,相比旧版mysql函数更安全、性能更高效。使用前需确保环境满足以下条件:

  1. 版本要求:PHP 5及以上,MySQL 4.1及以上。
  2. 扩展启用:检查 php.ini 配置文件,确保以下行未被注释:
    extension=php_mysqli.dll(Windows环境)或对应Linux模块。
  3. 重启服务:修改ini后需重启Web服务器(如Apache/Nginx+PHP-FPM)生效。

建立数据库连接

推荐使用全局配置文件统一管理数据库凭据,避免硬编码。

第1步:创建配置文件

新建 config.ini.php,定义基础参数。注意修正原文中的拼写错误(如 locallhost 改为 localhost),并根据实际字符集需求设置编码(推荐utf8mb4)。

<?php
$dbhost = "localhost";
$dbuser = "root";
$dbpwd  = "password";
$dbname = "student_db";
$charset = "utf8mb4";
?>

第2步:实例化连接对象并检测状态

在业务逻辑文件中引入配置,实例化 mysqli 类,并捕获连接错误。

<?php
require_once 'config.ini.php';
// 语法:new mysqli(主机, 用户名, 密码, 数据库名)
$conn = new mysqli($dbhost, $dbuser, $dbpwd, $dbname);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// 设置默认字符集,防止中文乱码
$conn->set_charset($charset);
?>

常用数据操作方法

第3步:执行非查询SQL(插入/更新/删除)

对于 INSERT、UPDATE、DELETE 语句,直接调用 query() 并获取影响行数或自增ID。

<?php
$sql = "INSERT INTO user (name, pwd) VALUES ('test_user', '123456')";

if ($conn->query($sql) === TRUE) {
    // 获取最后插入的ID
    $lastId = $conn->insert_id;
    echo "New record created successfully. Last insert ID: " . $lastId;
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

// 获取受影响的行数
$affectedRows = $conn->affected_rows;
$conn->close();
?>

第4步:执行查询并处理结果集

使用 SELECT 获取数据时,可通过不同方法将结果转换为PHP数据结构。

<?php
$sql = "SELECT id, name FROM user WHERE status = 'active'";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // 方式1:fetch_row() - 返回索引数组
    while($row = $result->fetch_row()) {
        echo "ID: " . $row[0] . " Name: " . $row[1] . "<br>";
    }

    // 方式2:fetch_assoc() - 返回关联数组(推荐)
    $result->data_seek(0); // 重置指针
    while($row = $result->fetch_assoc()) {
        echo "ID: " . $row['id'] . " Name: " . $row['name'] . "<br>";
    }

    // 方式3:fetch_object() - 返回对象
    $result->data_seek(0);
    while($row = $result->fetch_object()) {
        echo "ID: " . $row->id . " Name: " . $row->name . "<br>";
    }
} else {
    echo "0 results";
}
?>

安全核心:预处理语句(Prepared Statements)

为防止SQL注入,务必对包含用户输入的动态SQL使用预处理。它先发送SQL模板,再绑定参数执行,效率更高且安全。

第5步:预处理与参数绑定

以登录验证为例,演示占位符 ? 的使用及类型绑定。

<?php
// 1. 准备SQL模板
$stmt = $conn->prepare("SELECT username, password FROM member WHERE username = ? AND password = ?");

if ($stmt) {
    // 2. 绑定参数:'ss' 表示两个字符串参数
    // 类型说明: i(integer), d(double), s(string), b(blob)
    $username = "admin";
    $password = "secret";
    $stmt->bind_param("ss", $username, $password);

    // 3. 执行
    $stmt->execute();

    // 4. 绑定结果变量以便读取
    $stmt->bind_result($dbUser, $dbPass);

    // 5. 遍历结果
    $hasData = false;
    while ($stmt->fetch()) {
        $hasData = true;
        echo "Found: " . $dbUser . "<br>";
    }

    if (!$hasData) {
        echo "No matching user.";
    }

    // 6. 关闭资源
    $stmt->close();
}
$conn->close();
?>

高级功能:事务处理(Transaction)

当事务涉及多个相关SQL操作时(如转账、库存扣减),需保证原子性。仅支持 InnoDB 存储引擎的表才能进行事务操作。

第6步:事务执行流程

关闭自动提交 → 执行SQL → 判断成功则提交,失败则回滚 → 恢复自动提交。

<?php
// 1. 关闭自动提交
$conn->autocommit(FALSE);

$success = true;
$sql1 = "UPDATE account SET balance = balance - 100 WHERE id = 1";
$sql2 = "UPDATE account SET balance = balance + 100 WHERE id = 2";

// 2. 执行第一条
if (!$conn->query($sql1) || $conn->affected_rows != 1) {
    $success = false;
}

// 3. 执行第二条
if (!$conn->query($sql2) || $conn->affected_rows != 1) {
    $success = false;
}

// 4. 根据结果决定提交或回滚
if ($success) {
    $conn->commit();
    echo "Transaction committed successfully.";
} else {
    $conn->rollback();
    echo "Transaction rolled back due to error.";
}

// 5. 恢复自动提交模式
$conn->autocommit(TRUE);
$conn->close();
?>

常见问题排查

  • 中文乱码:除了连接时设置 set_charset('utf8mb4'),还需确保PHP文件本身保存为UTF-8无BOM格式,HTML头部声明 <meta charset="utf-8">,以及数据库表字符集一致。
  • 连接超时:检查防火墙是否放行3306端口,确认 $dbhost 地址正确(本地可用 localhost 或 127.0.0.1)。
  • 事务无效:若使用 rollback() 无效,请检查数据库表引擎是否为 InnoDB。查看表的SQL定义应包含 ENGINE=InnoDB。

以上就是PHP Mysqli扩展常用操作的详细内容,更多关于PHP数据库编程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。