PHP mysqli:从基础到实战的数据库操作指南
一、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数据库操作的核心工具,其预处理语句、事务支持和面向对象接口极大提升了开发效率与安全性。掌握以下要点可避免常见问题:
- 防SQL注入:始终使用预处理语句(
prepare()+bind_param())。 - 资源释放:操作完成后关闭结果集(
close())和预处理对象(stmt->close())。 - 错误处理:通过
error属性或异常捕获及时定位问题。
建议结合实际项目练习CRUD、事务、批量操作等场景,逐步提升数据库操作能力。
文章版权声明:除非注明,否则均为Dark零点博客原创文章,转载或复制请以超链接形式并注明出处。

