PHP做Web开发,表单是连接用户和服务端的桥梁。纯HTML页面是静态的,一旦加上表单控件,用户就能输入数据、做选择,页面就有了交互性。PHP在服务端接手这些数据,进行验证、处理,再把结果返回给用户,这套流程几乎是每个动态网站的基础。
认识 HTML 表单的结构
HTML 表单由 <form> 标签包裹,里面放置各类控件。<form> 标签本身有几个核心属性,决定了数据怎么发、发到哪里去。
先看一个基本的表单骨架:
<form name="loginForm" action="process.php" method="POST">
<!-- 表单控件写在这里 -->
</form>
action 属性指定处理数据的 URL。项目开发里经常让它指向当前页面自身,做法是嵌入 $_SERVER['PHP_SELF'],并且用 htmlspecialchars() 做一层安全转义,防止注入攻击。
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="POST">
method 属性决定 HTTP 请求方式,GET 和 POST 是主流选择。GET 把数据拼在 URL 后面,肉眼可见,数据量上限低,适合搜索关键词、筛选条件这类无副作用操作。POST 把数据放在请求体里,URL 上看不到,能承载较大数据量,登录密码、文件上传、注册信息这些场景必须用 POST。
enctype 属性管编码方式。普通表单默认 application/x-www-form-urlencoded 就够了,一旦表单里有文件上传控件 <input type="file">,必须改成 multipart/form-data,否则文件数据传不上去。text/plain 基本只在调试时用用,生产环境用不上。
name 属性给表单起个名字,单页面多个表单时用来区分。target 控制提交后响应页面的打开位置,_blank 新窗口打开,_self 当前窗口,一般不用刻意设置。
常用表单控件拆解
文本输入与密码
<input type="text"> 单行文本输入,用户名、邮箱、搜索框都靠它。<input type="password"> 和文本框一样,但输入时字符被掩码显示,专门处理密码。
<input type="text" name="username" placeholder="请输入用户名">
<input type="password" name="userPwd" placeholder="请输入密码">
单选与多选
<input type="radio"> 是一组互斥的圆形按钮,name 相同才能互斥。<input type="checkbox"> 是方形多选框,多个选项可以同时勾选。复选框的 name 值写数组形式 name="hobby[]" 这样PHP端能一次接收到多个选中值。
<input type="radio" id="genderMale" name="gender" value="male">
<label for="genderMale">男</label>
<input type="radio" id="genderFemale" name="gender" value="female">
<label for="genderFemale">女</label>
<input type="checkbox" name="course[]" value="php"> PHP
<input type="checkbox" name="course[]" value="mysql"> MySQL
<input type="checkbox" name="course[]" value="javascript"> JavaScript
文件上传
<input type="file"> 弹出文件选择框。使用它时表单的 enctype 必须设成 multipart/form-data,method 用 POST,缺一不可。
<input type="file" name="uploadFile">
下拉选择框
<select> 搭配 <option> 做出下拉菜单,适合选项较多的场景。
<select name="city">
<option value="beijing">北京</option>
<option value="shanghai">上海</option>
<option value="guangzhou">广州</option>
</select>
PHP如何接收表单数据
表单数据送到服务端后,PHP通过超全局数组 $_GET 和 $_POST 接收,对应表单 method 属性的两种方式。
GET 方式接收数据
GET 请求的数据跟在 URL 问号后面,各参数用 & 连接。直接可见意味着不安全,而且 URL 长度有限制,大概 2KB 左右,传不了大段内容。
HTML 文件 get_form.html:
<form action="get_receive.php" method="GET">
姓名:<input type="text" name="studentName">
<input type="submit" value="提交">
</form>
PHP接收文件 get_receive.php:
<?php
$studentName = $_GET['studentName'];
echo '你好,' . htmlspecialchars($studentName);
?>
用户输入“小明”,页面输出“你好,小明”,同时浏览器地址栏会变成类似 get_receive.php?studentName=小明。这种可见性让 GET 适合搜索引擎查询、分页参数、筛选条件传递,不适合密码或敏感数据。
POST 方式接收数据
POST 数据在请求体内,URL 不留痕迹,没有长度限制,是表单提交的主流选择。
一个简单的登录表单 login.html:
<form action="login_check.php" method="POST">
<table>
<tr><td>用户名:</td><td><input type="text" name="loginUser"></td></tr>
<tr><td>密 码:</td><td><input type="password" name="loginPass"></td></tr>
<tr><td colspan="2"><input type="submit" value="登录"></td></tr>
</table>
</form>
login_check.PHP接收处理:
<?php
$loginUser = $_POST['loginUser'];
$loginPass = $_POST['loginPass'];
echo '欢迎,' . htmlspecialchars($loginUser) . ',您的密码已提交。';
?>
真实项目里密码绝对不能明文输出,这里只是演示数据接收。$_POST 取到的值要做过滤和验证,htmlspecialchars() 是输出前的必要步骤,防止跨站脚本攻击。
完整示例:个人信息收集表单
下面把几种常用控件整合进一个完整表单,提交到自身页面处理,把填写的资料回显出来。
<!DOCTYPE html>
<html>
<body>
<h2>学员信息登记</h2>
<form method="POST" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>">
<table>
<tr>
<td>姓名:</td>
<td><input type="text" name="fullName"></td>
</tr>
<tr>
<td>邮箱:</td>
<td><input type="email" name="emailAddr"></td>
</tr>
<tr>
<td>个人主页:</td>
<td><input type="url" name="homePage"></td>
</tr>
<tr>
<td>学习反馈:</td>
<td><textarea name="feedback" rows="4" cols="40"></textarea></td>
</tr>
<tr>
<td>性别:</td>
<td>
<input type="radio" name="gender" value="female">女
<input type="radio" name="gender" value="male">男
</td>
</tr>
<tr>
<td>学习方向:</td>
<td>
<input type="checkbox" name="course[]" value="php"> PHP
<input type="checkbox" name="course[]" value="python"> Python
<input type="checkbox" name="course[]" value="java"> Java
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="submitBtn" value="提交信息"></td>
</tr>
</table>
</form>
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$fullName = $_POST['fullName'] ?? '';
$emailAddr = $_POST['emailAddr'] ?? '';
$homePage = $_POST['homePage'] ?? '';
$feedback = $_POST['feedback'] ?? '';
$gender = $_POST['gender'] ?? '';
$course = $_POST['course'] ?? [];
echo '<h2>你提交的信息:</h2>';
echo '姓名:' . htmlspecialchars($fullName) . '<br>';
echo '邮箱:' . htmlspecialchars($emailAddr) . '<br>';
echo '个人主页:' . htmlspecialchars($homePage) . '<br>';
echo '反馈:' . htmlspecialchars($feedback) . '<br>';
echo '性别:' . htmlspecialchars($gender) . '<br>';
echo '学习方向:' . htmlspecialchars(implode(', ', $course));
}
?>
</body>
</html>
个人习惯上,接收 $_POST 数据时先用 ?? '' 给个默认值,未选中的 radio 或未勾选的 checkbox 根本不会出现在 $_POST 里,不加判断直接取会抛未定义索引的警告。checkbox 传数组的处理方式,PHP端用 implode() 把数组拼成字符串展示,实际入库时则拆开来存关联表。
本节课程知识要点
PHP表单处理围绕几个核心点:method 属性区分 GET 和 POST,前者数据可见、有限制、适合查询,后者安全、容量大、适合提交;enctype 在文件上传时必须切为 multipart/form-data;action 指向处理脚本,指向自身时用 $_SERVER['PHP_SELF'] 并套上 htmlspecialchars() 防注入;$_GET 和 $_POST 是PHP接收数据的入口,取到数据后先校验再使用,输出时务必转义。文件上传需要额外配置PHP.ini 的上传大小和临时目录,HTML5 的表单验证属性(如 required、pattern)能分担前端校验工作,但服务端验证始终是底线。表单看似简单,细节出问题往往排查半天,熟练这些基础对排查 bug 很有帮助。