PHP MySQLi 扩展
MySQLi(MySQL Improved)是 PHP 中用于与 MySQL 数据库交互的扩展。它提供了面向对象和面向过程两种编程风格,支持预处理语句、事务处理以及更强大的错误处理功能。对于初学者来说,掌握 MySQLi 是学习 PHP 数据库操作的重要一步。
1. MySQLi 简介
MySQLi 是 PHP 中用于与 MySQL 数据库通信的扩展。它是早期 MySQL 扩展的改进版本,提供了更多的功能和更好的性能。MySQLi 支持以下特性:
- 面向对象和面向过程两种编程风格。
- 预处理语句,防止 SQL 注入。
- 事务处理,确保数据一致性。
- 更好的错误处理机制。
2. 连接到 MySQL 数据库
在使用 MySQLi 之前,首先需要连接到 MySQL 数据库。以下是使用面向对象风格连接数据库的示例:
php
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
echo "连接成功";
?>
解释:
$servername
:数据库服务器地址,通常是localhost
。$username
:数据库用户名。$password
:数据库密码。$dbname
:要连接的数据库名称。new mysqli()
:创建一个新的 MySQLi 对象,表示与数据库的连接。$conn->connect_error
:检查连接是否成功,如果失败则输出错误信息。
提示
在实际开发中,建议将数据库连接信息存储在配置文件中,而不是直接写在代码中。
3. 执行 SQL 查询
连接到数据库后,可以执行 SQL 查询。以下是一个简单的查询示例:
php
<?php
$sql = "SELECT id, name, email FROM users";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 输出每行数据
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. "<br />";
}
} else {
echo "0 结果";
}
$conn->close();
?>
解释:
$sql
:SQL 查询语句。$conn->query($sql)
:执行查询并返回结果集。$result->num_rows
:获取结果集中的行数。$result->fetch_assoc()
:以关联数组的形式获取一行数据。$conn->close()
:关闭数据库连接。
警告
在查询结束后,务必关闭数据库连接以释放资源。
4. 使用预处理语句
预处理语句是防止 SQL 注入的有效方法。以下是一个使用预处理语句插入数据的示例:
php
<?php
$stmt = $conn->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
// 设置参数并执行
$name = "John Doe";
$email = "john@example.com";
$stmt->execute();
echo "新记录插入成功";
$stmt->close();
$conn->close();
?>
解释:
$conn->prepare()
:准备一个 SQL 语句,返回一个预处理语句对象。$stmt->bind_param()
:绑定参数到预处理语句。"ss"
表示两个字符串类型的参数。$stmt->execute()
:执行预处理语句。$stmt->close()
:关闭预处理语句。
备注
预处理语句不仅可以防止 SQL 注入,还能提高查询性能,特别是在多次执行相同查询时。
5. 事务处理
事务处理用于确保一组 SQL 操作要么全部成功,要么全部失败。以下是一个事务处理的示例:
php
<?php
$conn->begin_transaction();
try {
$conn->query("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1");
$conn->query("UPDATE accounts SET balance = balance + 100 WHERE user_id = 2");
$conn->commit();
echo "事务成功";
} catch (Exception $e) {
$conn->rollback();
echo "事务失败: " . $e->getMessage();
}
$conn->close();
?>
解释:
$conn->begin_transaction()
:开始一个新事务。$conn->commit()
:提交事务,使所有更改生效。$conn->rollback()
:回滚事务,撤销所有更改。
注意
事务处理通常用于需要确保数据一致性的场景,如银行转账等。
6. 实际案例:用户注册系统
以下是一个简单的用户注册系统示例,展示了如何使用 MySQLi 扩展进行数据库操作:
php
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = $_POST['name'];
$email = $_POST['email'];
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
$stmt = $conn->prepare("INSERT INTO users (name, email, password) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $name, $email, $password);
if ($stmt->execute()) {
echo "注册成功";
} else {
echo "注册失败: " . $stmt->error;
}
$stmt->close();
}
$conn->close();
?>
<form method="post">
姓名: <input type="text" name="name" required><br />
邮箱: <input type="email" name="email" required><br />
密码: <input type="password" name="password" required><br />
<input type="submit" value="注册">
</form>
解释:
- 用户通过表单提交注册信息。
- 使用
password_hash()
对密码进行哈希处理。 - 使用预处理语句将用户信息插入数据库。
7. 总结
MySQLi 扩展是 PHP 中与 MySQL 数据库交互的强大工具。通过本教程,你学习了如何连接数据库、执行查询、使用预处理语句以及处理事务。这些技能是构建动态 Web 应用程序的基础。
8. 附加资源与练习
- 练习:尝试创建一个简单的博客系统,使用 MySQLi 扩展实现文章的增删改查功能。
- 资源:
通过不断练习和探索,你将能够熟练掌握 MySQLi 扩展,并在实际项目中灵活运用。