PHP Mysqli 扩展常用操作与代码示例指南
本文深入解析PHP Mysqli扩展的核心功能,包括配置文件设置、对象化数据库连接、防SQL注入的预处理语句(Prepared Statements)、多种数据提取方式(索引数组、关联数组、对象)以及基于InnoDB引擎的事务管理。通过具体代码实例,帮助开发者高效、安全地操作MySQL数据库。
准备工作与环境配置
Mysqli是PHP5.0引入的新扩展,采用面向对象设计,相比旧版mysql函数更安全、性能更高效。使用前需确保环境满足以下条件:
- 版本要求:PHP 5及以上,MySQL 4.1及以上。
- 扩展启用:检查
php.ini配置文件,确保以下行未被注释:extension=php_mysqli.dll(Windows环境)或对应Linux模块。 - 重启服务:修改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数据库编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









