PHP如何插入MySQL数据:从基础到实践的完整指南
在Web开发中,PHP与MySQL的组合是最经典的技术栈之一,无论是用户注册、数据提交还是内容管理,将数据插入MySQL数据库都是核心操作,本文将详细介绍PHP插入MySQL数据的完整流程,从环境准备到代码实现,再到常见问题解决,助你这一关键技能。
环境准备:搭建PHP与MySQL的开发环境
在开始编码前,确保你的开发环境已配置好以下工具:
- PHP环境:推荐使用PHP 7.4+版本(支持现代语法和MySQL扩展)。
- MySQL数据库:可安装本地数据库(如XAMPP、WAMP集成环境),或使用云数据库(如腾讯云RDS、阿里云RDS)。
- 开发工具:VS Code、Sublime Text等代码编辑器,或phpMyAdmin(MySQL管理工具)。
数据库与数据表准备:创建存储目标
插入数据前,需先创建数据库和数据表,以phpMyAdmin为例:
-
创建数据库:
登录phpMyAdmin后,点击“新建”,输入数据库名(如test_db),点击“执行”。 -
创建数据表:
在test_db中,点击“新建”,输入表名(如users),设置字段:id:INT类型,主键,自动递增(AUTO_INCREMENT)username:VARCHAR(50),非空(NOT NULL)email:VARCHAR(100),非空,唯一(UNIQUE)created_at:DATETIME,默认值为当前时间(CURRENT_TIMESTAMP)
点击“执行”创建表。
PHP插入MySQL的两种核心方式
PHP提供了两种方式操作MySQL:MySQLi扩展(推荐)和PDO扩展(支持多种数据库),本文以MySQLi为例讲解,最后补充PDO的实现差异。
(一)使用MySQLi扩展(面向过程)
连接MySQL数据库
<?php
$host = 'localhost'; // 数据库地址
$username = 'root'; // 数据库用户名
$password = ''; // 数据库密码
$dbname = 'test_db'; // 数据库名
// 创建连接
$conn = new mysqli($host, $username, $password, $dbname);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
echo "连接成功!";
?>
执行INSERT语句
插入数据需通过SQL INSERT语句实现,关键点:
- 使用
mysqli_query()执行SQL语句; - 字符串数据需用单引号包裹,变量需用
mysqli_real_escape_string()转义(防止SQL注入); - 通过
mysqli_affected_rows()判断是否插入成功。
示例代码:
<?php
// 接收表单数据(假设从POST请求获取)
$username = $_POST['username'] ?? '';
$email = $_POST['email'] ?? '';
// 转义特殊字符(防止SQL注入)
$username = mysqli_real_escape_string($conn, $username);
$email = mysqli_real_escape_string($conn, $email);
// 构建SQL语句(注意单引号包裹字符串)
$sql = "INSERT INTO users (username, email) VALUES ('$username', '$email')";
// 执行SQL语句
if (mysqli_query($conn, $sql)) {
echo "数据插入成功!";
echo "影响行数: " . mysqli_affected_rows($conn);
} else {
echo "插入失败: " . mysqli_error($conn);
}
// 关闭连接
$conn->close();
?>
完整流程:表单提交+数据插入
实际开发中,数据通常通过HTML表单提交,下面是一个完整的示例(form.html + insert.php):
form.html(表单页面):
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">用户注册</title>
</head>
<body>
<form action="insert.php" method="post">
<label>用户名:<input type="text" name="username" required></label><br>
<label>邮箱:<input type="email" name="email" required></label><br>
<button type="submit">提交</button>
</form>
</body>
</html>
insert.php(处理插入逻辑):
<?php
$host = 'localhost';
$username = 'root';
$password = '';
$dbname = 'test_db';
$conn = new mysqli($host, $username, $password, $dbname);
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$username = $_POST['username'];
$email = $_POST['email'];
// 转义和验证数据(简单示例,实际需更严格验证)
if (!empty($username) && !empty($email) && filter_var($email, FILTER_VALIDATE_EMAIL)) {
$username = mysqli_real_escape_string($conn, $username);
$email = mysqli_real_escape_string($conn, $email);
$sql = "INSERT INTO users (username, email) VALUES ('$username', '$email')";
if (mysqli_query($conn, $sql)) {
echo "注册成功!用户ID: " . mysqli_insert_id($conn); // 获取自增ID
} else {
echo "注册失败: " . mysqli_error($conn);
}
} else {
echo "请填写有效的用户名和邮箱!";
}
}
$conn->close();
?>
(二)使用MySQLi扩展(面向对象)
面向对象的方式更符合现代PHP开发习惯,语法更简洁:
<?php
$host = 'localhost';
$username = 'root';
$password = '';
$dbname = 'test_db';
// 创建连接(面向对象)
$conn = new mysqli($host, $username, $password, $dbname);
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 插入数据
$username = "test_user";
$email = "test@example.com";
// 使用预处理语句(防止SQL注入的最佳实践)
$stmt = $conn->prepare("INSERT INTO users (username, email) VALUES (?, ?)");
$stmt->bind_param("ss", $username, $email); // "ss"表示两个字符串参数
if ($stmt->execute()) {
echo "数据插入成功!ID: " . $stmt->insert_id;
} else {
echo "插入失败: " . $stmt->error;
}
$stmt->close();
$conn->close();
?>
关键改进:
- 预处理语句(Prepare):通过
prepare()和bind_param()绑定参数,避免SQL注入,同时提升性能(重复执行SQL时更高效)。 bind_param()的参数类型:i(整数)、d(浮点数)、s(字符串)、b(二进制数据)。
(三)使用PDO扩展(通用方式)
PDO(PHP Data Objects)支持MySQL、PostgreSQL、SQLite等多种数据库,代码可移植性更强。
<?php
$host = 'localhost';
$dbname = 'test_db';
$username = 'root';
$password = '';
$charset = 'utf8mb4';
// DSN(数据源名称)
$dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 抛出异常
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // 默认关联数组获取
PDO::ATTR_EMULATE_PREPARES => false, // 使用原生预处理
];
try {
$pdo = new PDO($dsn, $username, $password, $options);
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
// 插入数据(预处理语句)
$username = "pdo_user";
$email = "pdo@example.com";
$stmt = $pdo->prepare("INSERT INTO users (username, email) VALUES (:username, :email)");
$stmt->execute([
'username' => $username,
'email' => $email,
]);
echo "插入成功!ID: " . $pdo->lastInsertId();
?>
PDO特点:
- 使用命名参数(如
username)而非问号,可读性更强; - 异常处理机制(
try-catch),错误管理更规范; - 支持多种数据库,切换数据库时只需修改DSN。
常见问题与解决方案
SQL注入风险
问题:直接拼接用户输入到SQL语句中,可能导致恶意代码执行(如' OR '1'='1)。
解决:
- 始终使用预处理语句(
prepare



还没有评论,来说两句吧...