PHP 后端开发入门:表单处理与数据库交互
PHP 后端开发入门:表单处理与数据库交互
为什么学习表单与数据库?
表单是 Web 应用与用户交互的第一道门,而数据库是数据持久存储的核心。PHP 作为后端语言,天然适用于处理表单提交并与 MySQL 等数据库联动。本教程将带你从零开始,掌握 PHP 处理表单、操作 MySQL 数据库的全过程,并构建一个可运行的留言板应用。
环境准备
开始之前,请确保已安装以下环境:
- PHP 7.4+(推荐 8.0+)
- MySQL 5.7+ 或 MariaDB
- Web 服务器:Apache(XAMPP/WAMP/MAMP)或 Nginx 均可。我们假设使用 XAMPP,本地项目根目录为
htdocs。 - 数据库管理工具:phpMyAdmin(通常随 XAMPP 自带)或命令行。
创建项目文件夹 php_form_db,新文件统一放置于此。
数据库设计
首先创建一张留言表。打开 MySQL 客户端或 phpMyAdmin,执行以下 SQL:
CREATE DATABASE IF NOT EXISTS demo_db;
USE demo_db;
CREATE TABLE messages (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100),
content TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
id:自增主键,唯一标识每条留言。username、email、content:来自表单的用户数据。created_at:记录提交时间,默认当前时间。
PHP 连接数据库
数据库操作统一封装在连接文件中,便于复用。新建 db.php:
<?php
$host = 'localhost';
$dbname = 'demo_db';
$username = 'root'; // 默认 XAMPP 用户
$password = ''; // 默认 XAMPP 密码为空
$charset = 'utf8mb4';
$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) {
die("数据库连接失败: " . $e->getMessage());
}
关键点:
- 使用 PDO 扩展,提供统一接口与预处理语句防护。
- 设置错误模式为异常,便于调试。
FETCH_ASSOC让查询结果默认返回关联数组。EMULATE_PREPARES => false启用真正的预处理,提升安全性。
表单处理基础
GET 与 POST
- GET:参数在 URL 中,适用于搜索、分页等无副作用请求,长度受限。
- POST:参数在 HTTP 请求体内,适用于提交敏感或大量数据(如文本内容)。
本教程留言板使用 POST 方法提交留言。
创建 HTML 表单
新建 index.php,包含表单与留言列表(稍后集成动态数据):
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>留言板</title>
<style>
body { font-family: Arial, sans-serif; margin: 2rem; }
form { margin-bottom: 2rem; }
label { display: block; margin: 0.5rem 0 0.2rem; }
input, textarea { width: 100%; max-width: 400px; padding: 0.5rem; margin-bottom: 0.5rem; }
button { padding: 0.5rem 1rem; }
.message { border: 1px solid #ccc; padding: 0.8rem; margin-bottom: 0.8rem; }
</style>
</head>
<body>
<h2>发表留言</h2>
<form action="index.php" method="post">
<label for="username">用户名:</label>
<input type="text" name="username" id="username" required maxlength="50">
<label for="email">邮箱:</label>
<input type="email" name="email" id="email" maxlength="100">
<label for="content">内容:</label>
<textarea name="content" id="content" required maxlength="500"></textarea>
<button type="submit">提交</button>
</form>
<hr>
<h2>留言列表</h2>
<!-- 动态显示留言区域 -->
<?php include 'display_messages.php'; ?>
</body>
</html>
PHP 接收并验证表单数据
在 index.php 的 <!DOCTYPE> 之前插入 PHP 逻辑(或使用统一的 PHP 文件顶部处理):
<?php
require_once 'db.php';
$errors = [];
$success = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 接收并修剪空白
$username = trim($_POST['username'] ?? '');
$email = trim($_POST['email'] ?? '');
$content = trim($_POST['content'] ?? '');
// 基本验证
if ($username === '') {
$errors[] = '用户名不能为空';
} elseif (mb_strlen($username) > 50) {
$errors[] = '用户名不能超过50个字符';
}
if ($email !== '' && !filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = '邮箱格式不正确';
}
if ($content === '') {
$errors[] = '留言内容不能为空';
} elseif (mb_strlen($content) > 500) {
$errors[] = '留言内容不能超过500个字符';
}
// 无错误则插入数据库
if (empty($errors)) {
try {
$stmt = $pdo->prepare("INSERT INTO messages (username, email, content) VALUES (:username, :email, :content)");
$stmt->execute([
':username' => $username,
':email' => $email,
':content' => $content,
]);
$success = '留言成功!';
// 重定向防止重复提交 (PRG模式),但这里为演示保留在同一页
} catch (PDOException $e) {
$errors[] = '数据库写入错误: ' . $e->getMessage();
}
}
}
?>
核心安全措施:
- 使用预处理语句(
prepare+execute)绑定参数,杜绝 SQL 注入。 - 对用户输入进行
trim()去掉多余空格。 - 验证长度、必填项及邮箱格式。
从数据库读取并显示留言
新建 display_messages.php,用于查询并渲染留言列表:
<?php
// 查询最新留言,按时间降序
$stmt = $pdo->query("SELECT id, username, email, content, created_at FROM messages ORDER BY created_at DESC");
$messages = $stmt->fetchAll();
if ($messages) {
foreach ($messages as $msg) {
// 对输出内容进行 HTML 转义,防止 XSS 攻击
$safe_username = htmlspecialchars($msg['username'], ENT_QUOTES, 'UTF-8');
$safe_email = htmlspecialchars($msg['email'], ENT_QUOTES, 'UTF-8');
$safe_content = nl2br(htmlspecialchars($msg['content'], ENT_QUOTES, 'UTF-8'));
$safe_time = htmlspecialchars($msg['created_at'], ENT_QUOTES, 'UTF-8');
echo "<div class='message'>";
echo "<strong>{$safe_username}</strong>";
if (!empty($safe_email)) {
echo " <{$safe_email}>";
}
echo " <small>{$safe_time}</small>";
echo "<p>{$safe_content}</p>";
echo "</div>";
}
} else {
echo "<p>暂无留言,快来写第一条吧!</p>";
}
输出安全:
- 使用
htmlspecialchars()转换特殊字符为 HTML 实体,防止跨站脚本攻击。 nl2br()保留换行展示。
整合完整示例
最终的 index.php 文件结构如下:
<?php
require_once 'db.php';
$errors = [];
$success = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// ... 完整的表单处理代码(如上所示)
}
?>
<!-- HTML 部分 -->
<!DOCTYPE html>
<html lang="zh-CN">
...
<body>
<?php if (!empty($errors)): ?>
<div style="color:red;">
<?php foreach ($errors as $error): ?>
<p><?= htmlspecialchars($error, ENT_QUOTES, 'UTF-8') ?></p>
<?php endforeach; ?>
</div>
<?php elseif ($success): ?>
<p style="color:green;"><?= htmlspecialchars($success, ENT_QUOTES, 'UTF-8') ?></p>
<?php endif; ?>
<form action="index.php" method="post">
...
</form>
<hr>
<h2>留言列表</h2>
<?php include 'display_messages.php'; ?>
</body>
</html>
现在访问 http://localhost/php_form_db/index.php,即可看到留言板。填入信息并提交,留言将存入数据库并实时显示。
更多数据库操作:更新与删除
除了插入(Create)与查询(Read),基础 CRUD 还包括更新(Update)和删除(Delete)。
删除留言示例
在每条留言后添加删除链接(需谨慎,通常使用 POST 或确认)。简单起见,用 GET 携带 id 演示:
在 display_messages.php 的循环中添加:
echo " <a href='delete.php?id={$msg['id']}' onclick=\"return confirm('确定删除?')\">删除</a>";
新建 delete.php:
<?php
require_once 'db.php';
$id = $_GET['id'] ?? 0;
if ($id) {
$stmt = $pdo->prepare("DELETE FROM messages WHERE id = :id");
$stmt->execute([':id' => $id]);
}
header('Location: index.php');
exit;
更新留言示例(扩展思路)
更新通常需要先查询出原数据填入表单,再提交修改。核心代码:
$stmt = $pdo->prepare("UPDATE messages SET username = :uname, email = :email, content = :cnt WHERE id = :id");
$stmt->execute([
':id' => $id,
':uname' => $newUsername,
':email' => $newEmail,
':cnt' => $newContent
]);
安全清单
在 PHP 表单与数据库交互中,务必遵守以下原则:
- 永远不要信任用户输入,所有数据必须在服务器端验证和过滤。
- 使用预处理语句,禁止拼接 SQL 语句。
- 输出转义:所有动态内容输出到 HTML 前必须使用
htmlspecialchars()。 - CSRF 防护:表单中加入隐藏 token 并验证(本教程基础示例未包含,实际项目必须实现)。
- 限制权限:数据库账号只给予必要权限(如只给 INSERT、SELECT 等)。
常见问题与调试
- 数据库连接失败:检查主机、用户名、密码及
db.php路径。 - 表单提交后无反应:查看
$_POST是否正确,action属性是否指向当前文件。 - 中文乱码:确保数据库、表、连接字符集均为
utf8mb4,HTML 头部设置<meta charset="UTF-8">,PHP 文件保存为 UTF-8 无 BOM。 - 空白页面:开启 PHP 错误显示(仅开发环境):
error_reporting(E_ALL); ini_set('display_errors', 1);
总结
通过本教程,你掌握了:
- 使用 PDO 连接 MySQL 并执行预处理语句。
- 处理 HTML 表单数据并在服务器端进行验证。
- 实现留言的插入与查询,并安全地输出到页面。
- 基础的 CRUD 操作模式。
这是 PHP 后端开发的核心技能,在此基础上你可以扩展用户登录、文件上传、分页等功能,构建完整的 Web 应用。继续实践,尝试添加编辑和删除功能,让你的留言板更加完善。