PHP MySQL 插入数据
创建完数据库和数据表后,下一步通常是向表中插入数据。本教程将介绍如何使用PHP向MySQL数据表中插入数据,包括MySQLi扩展和PDO(PHP数据对象)两种方式,以及如何安全地处理用户输入。
前提条件
要向MySQL数据表中插入数据,您需要:
- 已创建MySQL数据库和数据表
- 具有插入数据权限的MySQL用户账号
- PHP环境中已启用MySQLi或PDO扩展
使用MySQLi插入数据
MySQLi扩展提供了面向对象和过程式两种方式来插入数据。
1. 面向对象方式
<?php
// 数据库连接参数 $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // 创建连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检查连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } // 准备插入数据 $firstname = "John"; $lastname = "Doe"; $email = "john@example.com"; // SQL插入语句 $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('$firstname', '$lastname', '$email')"; if ($conn->query($sql) === true) { $last_id = $conn->insert_id; echo "新记录创建成功,ID: " . $last_id; } else { echo "错误: " . $sql . "
" . $conn->error; } // 关闭连接 $conn->close(); ?>
2. 过程式方式
<?php
// 数据库连接参数 $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // 创建连接 $conn = mysqli_connect($servername, $username, $password, $dbname); // 检查连接 if (!$conn) { die("连接失败: " . mysqli_connect_error()); } // 准备插入数据 $firstname = "John"; $lastname = "Doe"; $email = "john@example.com"; // SQL插入语句 $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('$firstname', '$lastname', '$email')"; if (mysqli_query($conn, $sql)) { $last_id = mysqli_insert_id($conn); echo "新记录创建成功,ID: " . $last_id; } else { echo "错误: " . $sql . "
" . mysqli_error($conn); } // 关闭连接 mysqli_close($conn); ?>
使用PDO插入数据
PDO(PHP数据对象)也提供了插入数据的功能。
<?php
// 数据库连接参数 $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // 尝试连接数据库 try { $conn = new PDO("mysql:host=$servername;dbname=$dbname;charset=utf8mb4", $username, $password); // 设置PDO错误模式为异常 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 准备插入数据 $firstname = "John"; $lastname = "Doe"; $email = "john@example.com"; // SQL插入语句 $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('$firstname', '$lastname', '$email')"; // 使用exec(),因为不需要返回结果 $conn->exec($sql); $last_id = $conn->lastInsertId(); echo "新记录创建成功,ID: " . $last_id; } catch(PDOException $e) { echo "错误: " . $sql . "
" . $e->getMessage(); } // 关闭连接 $conn = null; ?>
安全地插入数据(防止SQL注入)
直接将用户输入插入到SQL语句中是不安全的,可能导致SQL注入攻击。为了安全地插入数据,应该使用预处理语句。
1. MySQLi预处理语句
<?php
// 数据库连接参数
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 准备预处理语句
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);
// 设置参数并执行
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();
$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();
$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute();
echo "新记录插入成功";
// 关闭语句和连接
$stmt->close();
$conn->close();
?>
2. PDO预处理语句
<?php
// 数据库连接参数
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// 尝试连接数据库
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname;charset=utf8mb4", $username, $password);
// 设置PDO错误模式为异常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 准备预处理语句
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (:firstname, :lastname, :email)");
// 绑定参数并执行
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname', $lastname);
$stmt->bindParam(':email', $email);
// 设置参数并执行
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();
$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();
$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute();
echo "新记录插入成功";
} catch(PDOException $e) {
echo "错误: " . $e->getMessage();
}
// 关闭连接
$conn = null;
?>
插入表单数据
在实际应用中,我们经常需要将HTML表单中的数据插入到数据库中。以下是一个完整的示例:
<?php
// 定义变量并设置为空值
$firstname = $lastname = $email = "";
$firstname_err = $lastname_err = $email_err = "";
// 处理表单提交
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// 验证名字
if (empty(trim($_POST["firstname"])) {
$firstname_err = "请输入名字";
} else {
$firstname = trim($_POST["firstname"]);
}
// 验证姓氏
if (empty(trim($_POST["lastname"])) {
$lastname_err = "请输入姓氏";
} else {
$lastname = trim($_POST["lastname"]);
}
// 验证邮箱
if (empty(trim($_POST["email"])) {
$email_err = "请输入邮箱地址";
} elseif (!filter_var(trim($_POST["email"]), FILTER_VALIDATE_EMAIL)) {
$email_err = "请输入有效的邮箱地址";
} else {
$email = trim($_POST["email"]);
}
// 检查输入错误是否存在
if (empty($firstname_err) && empty($lastname_err) && empty($email_err)) {
// 数据库连接参数
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 准备预处理语句
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);
// 执行语句
if ($stmt->execute()) {
// 记录创建成功,重定向到成功页面
header("location: success.php");
exit;
} else {
echo "抱歉,发生了错误,请稍后再试。";
}
// 关闭语句和连接
$stmt->close();
$conn->close();
}
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>创建记录</title>
<style>
.form-group {
margin-bottom: 15px;
}
.error {
color: #ff0000;
}
</style>
</head>
<body>
<h2>创建记录</h2>
<p>请填写此表单以创建记录。</p>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
<div class="form-group <?php echo (!empty($firstname_err)) ? 'has-error' : ''; ?>">
<label>名字</label>
<input type="text" name="firstname" value="<?php echo $firstname; ?>">
<span class="error"><?php echo $firstname_err; ?></span>
</div>
<div class="form-group <?php echo (!empty($lastname_err)) ? 'has-error' : ''; ?>">
<label>姓氏</label>
<input type="text" name="lastname" value="<?php echo $lastname; ?>">
<span class="error"><?php echo $lastname_err; ?></span>
</div>
<div class="form-group <?php echo (!empty($email_err)) ? 'has-error' : ''; ?>">
<label>邮箱</label>
<input type="text" name="email" value="<?php echo $email; ?>">
<span class="error"><?php echo $email_err; ?></span>
</div>
<div class="form-group">
<input type="submit" value="提交">
</div>
</form>
</body>
</html>
获取插入的ID
在插入记录后,我们经常需要获取刚刚插入记录的ID。以下是如何获取插入ID的方法:
MySQLi方式
<?php
// 插入记录后获取ID
$last_id = $conn->insert_id; // 面向对象方式
$last_id = mysqli_insert_id($conn); // 过程式方式
echo "新记录ID: " . $last_id;
?>
PDO方式
<?php
// 插入记录后获取ID
$last_id = $conn->lastInsertId();
echo "新记录ID: " . $last_id;
?>
插入NULL值
有时我们需要向数据库中插入NULL值,以下是如何操作:
MySQLi方式
<?php
// 使用预处理语句插入NULL值
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
// 设置参数,其中email为NULL
$firstname = "John";
$lastname = "Doe";
$email = null;
// 绑定参数时,需要指定类型为NULL
$stmt->bind_param("sss", $firstname, $lastname, $email);
$stmt->execute();
?>
PDO方式
<?php
// 使用预处理语句插入NULL值
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (:firstname, :lastname, :email)");
// 绑定参数,其中email为NULL
$stmt->bindValue(':firstname', 'John');
$stmt->bindValue(':lastname', 'Doe');
$stmt->bindValue(':email', null, PDO::PARAM_NULL);
$stmt->execute();
?>
最佳实践
- 始终使用预处理语句来防止SQL注入
- 对所有用户输入进行验证和过滤
- 使用try/catch块捕获和处理可能的错误
- 插入数据后,验证数据是否成功插入
- 当处理敏感数据时,考虑加密
- 对于大数据量插入,考虑使用事务
- 不要依赖客户端验证,始终在服务器端进行验证
- 使用适当的数据类型来存储数据
- 考虑设置合理的默认值
- 定期备份数据库以防止数据丢失