PHP MySQL 插入数据(INSERT INTO)
在 PHP 中,我们可以使用 MySQLi 或 PDO 连接 MySQL 并向表中插入数据。本教程将全面解析 插入数据的不同方式、错误处理、批量插入、预处理语句(防止 SQL 注入),并提供 最佳实践。
1. 使用 MySQLi 插入数据
1.1 过程化风格(MySQLi Procedural)
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
// 连接 MySQL
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 检测连接
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}
// 插入数据 SQL
$sql = "INSERT INTO users (username, email, password)
VALUES ('user1', 'user1@example.com', 'password123')";
if (mysqli_query($conn, $sql)) {
echo "新记录插入成功,ID: " . mysqli_insert_id($conn);
} else {
echo "错误: " . mysqli_error($conn);
}
// 关闭连接
mysqli_close($conn);
?>
📌 解析:
INSERT INTO users (...) VALUES (...)向users表插入数据。mysqli_insert_id($conn)获取刚插入数据的id(适用于AUTO_INCREMENT)。mysqli_error($conn)获取错误信息(如果 SQL 执行失败)。
1.2 面向对象风格(MySQLi OOP)
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检测连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 插入数据 SQL
$sql = "INSERT INTO users (username, email, password)
VALUES ('user2', 'user2@example.com', 'securepass')";
if ($conn->query($sql) === TRUE) {
echo "新记录插入成功,ID: " . $conn->insert_id;
} else {
echo "错误: " . $conn->error;
}
// 关闭连接
$conn->close();
?>
📌 面向对象风格的区别:
new mysqli()连接数据库。$conn->query($sql)执行 SQL 语句。$conn->insert_id获取插入数据的id。
2. 使用 PDO 插入数据(推荐)
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
try {
// 连接 MySQL
$pdo = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 插入数据 SQL
$sql = "INSERT INTO users (username, email, password)
VALUES ('user3', 'user3@example.com', 'mypassword')";
$pdo->exec($sql);
echo "新记录插入成功,ID: " . $pdo->lastInsertId();
} catch (PDOException $e) {
echo "错误: " . $e->getMessage();
}
// 关闭连接
$pdo = null;
?>
📌 PDO 方式的优势:
- 支持多种数据库(MySQL、PostgreSQL、SQLite)。
- 默认开启 异常处理 (
PDO::ERRMODE_EXCEPTION),更易调试。 - 更安全,适用于生产环境。
3. 预处理语句(防止 SQL 注入,推荐)
避免 SQL 注入攻击,建议使用 prepare() + bind_param()(MySQLi)或 prepare() + bindValue()(PDO)。
3.1 MySQLi 预处理(过程化)
<?php
$conn = mysqli_connect("localhost", "root", "", "my_database");
// 检测连接
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}
// 预处理 SQL
$stmt = mysqli_prepare($conn, "INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
// 绑定参数("sss" 表示 3 个字符串)
mysqli_stmt_bind_param($stmt, "sss", $username, $email, $password);
// 设置变量并执行
$username = "user4";
$email = "user4@example.com";
$password = "securepassword";
mysqli_stmt_execute($stmt);
echo "新记录插入成功,ID: " . mysqli_insert_id($conn);
// 关闭
mysqli_stmt_close($stmt);
mysqli_close($conn);
?>
3.2 PDO 预处理(推荐)
<?php
$pdo = new PDO("mysql:host=localhost;dbname=my_database", "root", "");
// 预处理 SQL
$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 = "user5";
$email = "user5@example.com";
$password = "mypassword";
$stmt->execute();
echo "新记录插入成功,ID: " . $pdo->lastInsertId();
// 关闭
$pdo = null;
?>
📌 为什么推荐 PDO 预处理?
- 更安全:自动防 SQL 注入,无需手动转义字符串。
- 更灵活:支持 命名参数(
:username、:email)。 - 更高效:查询 预编译,执行更快。
4. 批量插入数据
<?php
$pdo = new PDO("mysql:host=localhost;dbname=my_database", "root", "");
$stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
$data = [
['user6', 'user6@example.com', 'pass6'],
['user7', 'user7@example.com', 'pass7'],
['user8', 'user8@example.com', 'pass8']
];
foreach ($data as $row) {
$stmt->execute($row);
}
echo "批量插入成功!";
?>
📌 批量插入优势:
- 避免多次查询,提高性能。
- 更安全,自动处理特殊字符。
5. 可能遇到的错误及解决方案
5.1 “Duplicate entry for key ‘PRIMARY'”
原因:id 主键重复。
解决方案:
- 确保
id设置为 AUTO_INCREMENT:
ALTER TABLE users MODIFY id INT AUTO_INCREMENT;
5.2 “Field ’email’ doesn’t have a default value”
原因:未提供 NOT NULL 字段的值。
解决方案:
- 确保插入所有
NOT NULL字段:
INSERT INTO users (username, email, password) VALUES ('user', 'user@example.com', 'pass');
- 或者移除
NOT NULL限制:
ALTER TABLE users MODIFY email VARCHAR(100) NULL;
6. 总结
| 方式 | 代码 | 是否推荐 |
|---|---|---|
| MySQLi 过程化 | mysqli_query($conn, $sql); | ❌ |
| MySQLi 面向对象 | $conn->query($sql); | ❌ |
| PDO 直接执行 | $pdo->exec($sql); | ❌ |
| MySQLi 预处理 | $stmt = mysqli_prepare($conn, $sql); | ✅ |
| PDO 预处理 | $stmt = $pdo->prepare($sql); | ✅ |
| 批量插入 | $stmt->execute($row); | ✅ |
更多详细内容请关注其他相关文章!