PHP mysqli:从基础到实战的数据库操作指南

2025-12-17 2590阅读

一、mysqli简介:为何选择它?

PHP mysqli(MySQL improved extension)是PHP官方提供的MySQL数据库扩展,专为MySQL设计,支持面向对象和面向过程两种编程风格。相比旧版mysql扩展,它新增了预处理语句、事务支持、面向对象接口等核心特性,能有效提升数据库操作的安全性和性能。

二、安装与配置:快速连接数据库

1. 环境准备

  • PHP版本需5.3.0及以上(推荐7.0+),确保已启用mysqli扩展(编译时需添加--with-mysqli参数)。
  • 需提前安装MySQL服务,准备数据库、表及账号信息(如主机localhost、用户名root、密码123456、数据库名test_db)。

2. 连接数据库(面向对象方式)

<?php
// 创建mysqli对象,参数:主机、用户名、密码、数据库名
$conn = new mysqli('localhost', 'root', '123456', 'test_db');

// 检查连接是否成功
if ($conn->connect_error) {
    die("数据库连接失败:" . $conn->connect_error);
}
echo "连接成功!";
?>

3. 面向过程连接方式(兼容旧代码)

<?php
$conn = mysqli_connect('localhost', 'root', '123456', 'test_db');
if (!$conn) {
    die("连接失败:" . mysqli_connect_error());
}
echo "连接成功!";
?>

三、核心操作:CRUD实战指南

1. 数据查询(SELECT)

普通查询(面向对象)

// 查询表中所有用户
$result = $conn->query("SELECT id, name, age FROM users");

// 遍历结果集
if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        echo "ID: " . $row['id'] . ", 姓名: " . $row['name'] . ", 年龄: " . $row['age'] . "<br>";
    }
} else {
    echo "无数据";
}
$result->close(); // 释放结果集

预处理查询(防SQL注入)

// 预处理查询示例:查询指定ID的用户
$id = 1; // 从外部获取的参数(如URL参数)
$sql = "SELECT name, age FROM users WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $id); // "i"表示整数类型
$stmt->execute();

// 获取结果
$stmt->bind_result($name, $age); // 绑定结果列
while ($stmt->fetch()) {
    echo "姓名:$name,年龄:$age";
}
$stmt->close();

2. 数据插入(INSERT)

预处理插入

// 插入用户数据
$name = "张三";
$age = 25;
$email = "zhangsan@example.com";

$sql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ssi", $name, $age, $email); // "ssi":字符串、字符串、整数

if ($stmt->execute()) {
    echo "插入成功,新ID:" . $stmt->insert_id; // 获取自增ID
} else {
    echo "插入失败:" . $stmt->error;
}
$stmt->close();

3. 数据更新(UPDATE)

// 更新用户年龄
$id = 1;
$new_age = 26;

$sql = "UPDATE users SET age = ? WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ii", $new_age, $id);

if ($stmt->execute()) {
    echo "更新成功,影响行数:" . $stmt->affected_rows;
}
$stmt->close();

4. 数据删除(DELETE)

// 删除指定ID用户
$id = 1;
$sql = "DELETE FROM users WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $id);

if ($stmt->execute()) {
    echo "删除成功,影响行数:" . $stmt->affected_rows;
}
$stmt->close();

四、错误处理与事务管理

1. 错误处理机制

  • 连接错误:通过connect_error属性获取连接失败原因。
  • 执行错误:通过error属性获取SQL执行错误(如语法错误、约束冲突)。
// 执行查询时捕获错误
$result = $conn->query("SELECT * FROM invalid_table");
if (!$result) {
    echo "查询失败:" . $conn->error;
}

2. 事务处理(ACID特性)

// 开启事务
$conn->begin_transaction();

try {
    // 插入订单
    $sql = "INSERT INTO orders (order_no, amount) VALUES (?, ?)";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("si", "ORD2023001", 100);
    $stmt->execute();

    // 更新库存
    $sql = "UPDATE products SET stock = stock - 1 WHERE id = ?";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("i", 1);
    $stmt->execute();

    // 提交事务
    $conn->commit();
    echo "事务执行成功";
} catch (Exception $e) {
    // 回滚事务
    $conn->rollback();
    echo "事务失败:" . $e->getMessage();
}

五、进阶技巧与最佳实践

1. 预处理语句批量操作

// 批量插入用户数据
$users = [
    ['name' => '李四', 'age' => 22, 'email' => 'lisi@example.com'],
    ['name' => '王五', 'age' => 28, 'email' => 'wangwu@example.com']
];

$sql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ssi", $name, $age, $email);

foreach ($users as $user) {
    $name = $user['name'];
    $age = $user['age'];
    $email = $user['email'];
    $stmt->execute();
}
$stmt->close();

2. 数据分页实现

// 分页查询(每页10条数据)
$page = 1;
$limit = 10;
$offset = ($page - 1) * $limit;

$sql = "SELECT * FROM users LIMIT ?, ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ii", $offset, $limit);
$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // 处理数据
}
$stmt->close();

六、总结

PHP mysqli是MySQL数据库操作的核心工具,其预处理语句、事务支持和面向对象接口极大提升了开发效率与安全性。掌握以下要点可避免常见问题:

  1. 防SQL注入:始终使用预处理语句(prepare() + bind_param())。
  2. 资源释放:操作完成后关闭结果集(close())和预处理对象(stmt->close())。
  3. 错误处理:通过error属性或异常捕获及时定位问题。

建议结合实际项目练习CRUD、事务、批量操作等场景,逐步提升数据库操作能力。

文章版权声明:除非注明,否则均为Dark零点博客原创文章,转载或复制请以超链接形式并注明出处。

目录[+]