跳到主要内容

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 扩展,并在实际项目中灵活运用。