
在 PHP 中操作 My态数据库(MySQL)时,插入数据是常见的任务之一。你可以通过多种方法进行数据插入,包括使用 MySQLi 或 PDO 扩展进行数据库操作。本文将详细介绍 PHP 中的插入操作,包括基本的插入方法、参数化查询、防止 SQL 注入、批量插入、事务操作等。
1. 基本的插入操作
1.1 使用 MySQLi 插入数据
MySQLi
是 PHP 中一种提供 MySQL 数据库操作的扩展,支持面向对象(OOP)和过程式编程。
1.1.1 面向过程的写法
<?php
// 连接数据库
$conn = mysqli_connect("localhost", "username", "password", "database");
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}
// 插入数据
$sql = "INSERT INTO users (username, email, password) VALUES ('john_doe', 'john@example.com', 'password123')";
if (mysqli_query($conn, $sql)) {
echo "数据插入成功!";
} else {
echo "错误: " . $sql . "<br>" . mysqli_error($conn);
}
// 关闭连接
mysqli_close($conn);
?>
1.1.2 面向对象的写法
<?php
// 连接数据库
$conn = new mysqli("localhost", "username", "password", "database");
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 插入数据
$sql = "INSERT INTO users (username, email, password) VALUES ('john_doe', 'john@example.com', 'password123')";
if ($conn->query($sql) === TRUE) {
echo "数据插入成功!";
} else {
echo "错误: " . $sql . "<br>" . $conn->error;
}
// 关闭连接
$conn->close();
?>
1.2 使用 PDO 插入数据
PDO
(PHP 数据对象)是一个数据库访问接口,它支持多种数据库,包括 MySQL。与 MySQLi
相比,PDO
提供了更好的数据库抽象,支持多数据库操作,且更适合于大规模开发。
1.2.1 PDO 插入数据
<?php
try {
// 连接数据库
$pdo = new PDO("mysql:host=localhost;dbname=database", "username", "password");
// 设置错误模式
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 插入数据
$sql = "INSERT INTO users (username, email, password) VALUES (:username, :email, :password)";
$stmt = $pdo->prepare($sql);
// 绑定参数
$stmt->bindParam(':username', $username);
$stmt->bindParam(':email', $email);
$stmt->bindParam(':password', $password);
// 设置参数并执行
$username = "john_doe";
$email = "john@example.com";
$password = "password123";
$stmt->execute();
echo "数据插入成功!";
} catch (PDOException $e) {
echo "错误: " . $e->getMessage();
}
// 关闭连接
$pdo = null;
?>
2. 防止 SQL 注入
在进行数据库操作时,SQL 注入 是一个常见的安全漏洞。它允许攻击者通过输入恶意 SQL 代码来篡改数据库内容。为了防止 SQL 注入,建议使用 参数化查询。
2.1 MySQLi 防止 SQL 注入
通过预处理语句和参数化查询来防止 SQL 注入。
2.1.1 MySQLi 参数化查询
<?php
// 连接数据库
$conn = new mysqli("localhost", "username", "password", "database");
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 插入数据:使用预处理语句
$stmt = $conn->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $username, $email, $password); // "sss"表示三个字符串参数
// 设置参数并执行
$username = "john_doe";
$email = "john@example.com";
$password = "password123";
$stmt->execute();
echo "数据插入成功!";
// 关闭连接
$stmt->close();
$conn->close();
?>
2.2 PDO 防止 SQL 注入
PDO 本身也支持预处理语句和参数化查询,能够有效防止 SQL 注入。
2.2.1 PDO 参数化查询
<?php
try {
// 连接数据库
$pdo = new PDO("mysql:host=localhost;dbname=database", "username", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 插入数据:使用预处理语句
$stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (:username, :email, :password)");
// 绑定参数并执行
$stmt->bindParam(':username', $username);
$stmt->bindParam(':email', $email);
$stmt->bindParam(':password', $password);
$username = "john_doe";
$email = "john@example.com";
$password = "password123";
$stmt->execute();
echo "数据插入成功!";
} catch (PDOException $e) {
echo "错误: " . $e->getMessage();
}
// 关闭连接
$pdo = null;
?>
3. 批量插入数据
有时你可能需要一次性插入多条数据,批量插入比逐条插入要高效得多,尤其是在大量数据插入时。
3.1 MySQLi 批量插入
<?php
// 连接数据库
$conn = new mysqli("localhost", "username", "password", "database");
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 多条插入数据
$sql = "INSERT INTO users (username, email, password) VALUES
('user1', 'user1@example.com', 'password123'),
('user2', 'user2@example.com', 'password456'),
('user3', 'user3@example.com', 'password789')";
if ($conn->query($sql) === TRUE) {
echo "批量插入成功!";
} else {
echo "错误: " . $conn->error;
}
// 关闭连接
$conn->close();
?>
3.2 PDO 批量插入
<?php
try {
// 连接数据库
$pdo = new PDO("mysql:host=localhost;dbname=database", "username", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 开始事务
$pdo->beginTransaction();
// 批量插入数据
$stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
$stmt->execute(['user1', 'user1@example.com', 'password123']);
$stmt->execute(['user2', 'user2@example.com', 'password456']);
$stmt->execute(['user3', 'user3@example.com', 'password789']);
// 提交事务
$pdo->commit();
echo "批量插入成功!";
} catch (PDOException $e) {
// 回滚事务
$pdo->rollBack();
echo "错误: " . $e->getMessage();
}
// 关闭连接
$pdo = null;
?>
4. 事务操作
在进行批量插入或者需要确保多个操作同时成功的情况下,事务 是非常重要的。事务可以确保在一组 SQL 操作中,如果某个操作失败,所有操作都会回滚,保证数据的一致性。
4.1 使用 MySQLi 事务
<?php
// 连接数据库
$conn = new mysqli("localhost", "username", "password", "database");
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 开始事务
$conn->begin_transaction();
try {
// 插入数据
$conn->query("INSERT INTO users (username, email, password) VALUES ('user1', 'user1@example.com', 'password123')");
$conn->query("INSERT INTO users (username, email, password) VALUES ('user2', 'user2@example.com', 'password456')");
// 提交事务
$conn->commit();
echo "事务提交成功!";
} catch (Exception $e) {
// 回滚事务
$conn->rollback();
echo "错误: " . $e->getMessage();
}
// 关闭连接
$conn->close();
?>
4.2 使用 PDO 事务
<?php
try {
// 连接
数据库
$pdo = new PDO(“mysql:host=localhost;dbname=database”, “username”, “password”);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 开始事务
$pdo->beginTransaction();
// 插入数据
$stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
$stmt->execute(['user1', 'user1@example.com', 'password123']);
$stmt->execute(['user2', 'user2@example.com', 'password456']);
// 提交事务
$pdo->commit();
echo "事务提交成功!";
} catch (PDOException $e) {
// 回滚事务
$pdo->rollBack();
echo “错误: ” . $e->getMessage();
}
// 关闭连接
$pdo = null;
?>
### 5. **总结**
- **基本插入**:可以使用 `MySQLi` 或 `PDO` 来执行插入操作,`PDO` 提供了更好的跨数据库支持。
- **防止 SQL 注入**:使用 **参数化查询** 来防止 SQL 注入。
- **批量插入**:通过一次性插入多条数据来提高性能。
- **事务操作**:在执行多条 SQL 语句时,使用事务确保数据的一致性和完整性。
掌握了这些技巧,你就可以在 PHP 中更加高效、安全地进行 MySQL 数据插入操作。