用PHP进行表单验证的详细指南

226 阅读4分钟

在这篇文章中,我们将使用HTML和PHP建立并验证一个小型的Web表单。表单是用HTML创建的,而表单内容的验证和处理是用PHP完成的。本文的目的是教你一些基本的HTML表单元素,以及它们的数据如何在你的PHP脚本中被访问。

我们将创建的表单包含一些输入:文本字段、一个单选按钮、一个多选项选择列表、一个复选框和一个提交按钮。这些输入将被验证,以确保用户为每个输入提供了一个值。

如果一个或多个字段是空的,表单将被再次显示。然而,这一次,空字段旁边将出现错误字符串 "缺失"。如果没有一个字段是空的,将以一种简单的方式显示提供的值。

你可以在GitHub上找到这篇文章的代码。

HTML表单

The initially loaded form

让我们来创建HTML表单。这个表单的目的是让虚构的 "水果世界"公司对他们的客户进行一次水果调查。这个表单可以捕获三样东西。

  • 用户的详细资料(姓名、地址和电子邮件地址)
  • 用户的水果消费偏好(他们每天吃多少水果,以及他们最喜欢的水果)。
  • 用户是否想要一本免费的小册子

文本字段

姓名、地址和电子邮件字段是文本input 元素,可以这样编码。

Name <input type="text" name="name" value="">
Address <input type="text" name="address" value="">
Email <input type="text" name="email" value="">

HTML输入元素可以有几个属性,其中最重要的是typename
设置typetext ,将它们定义为接受文本的单行输入字段。name 属性用于指定字段的名称,并用于在PHP代码的处理过程中访问该元素。

单选按钮

单选按钮存储用户每天吃多少水果。

<input type="radio" name="howMany" value="zero"> 0
<input type="radio" name="howMany" value="one"> 1
<input type="radio" name="howMany" value="two"> 2
<input type="radio" name="howMany" value="twoplus"> More than 2

type 设置为radio ,将输入内容显示为一个单选按钮。注意每个按钮是如何被赋予相同的名字的。这将单选按钮视为一个组,允许用户选择0、1或2。每个按钮的value 属性不同,以提供用户可以选择的不同值。

选择列表

选择元素存储了用户对最喜欢的水果的选择。

<select name="favoriteFruit[]" size="4" multiple>
 <option value="apple">Apple</option>
 <option value="banana">Banana</option>
 <option value="plum">Plum</option>
 <option value="pomegranate">Pomegranate</option>
 <option value="strawberry">Strawberry</option>
 <option value="watermelon">Watermelon</option>
</select>

name 属性是一个数组(由名称后面的方括号定义),因为允许有多个选择(因为有multiple 属性的存在)。如果没有multiple 属性,就只有一个选项可以选择。

每个选项元素的value 属性是将提交给服务器的值,而开头和结尾option 标签之间的文本是用户在选择菜单中看到的值。每个option 元素必须有一个独特的值。

复选框

<input type="checkbox" name="brochure" value="Yes">

一个复选框元素用来让用户选择他们是否想要一个小册子。如果复选框被选中,其值将被设置为 "是"。否则,它将有效地被设置为 "否"。

提交按钮

<input type="submit" name="submit" value="Submit">

最后但并非最不重要的是提交按钮。其value 元素的值被显示为按钮的文本。点击它就可以提交表单。

表格元素

<form method="POST"
 action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

接下来是form 元素。虽然HTML表单支持许多属性,但只有两个属性需要设置:actionmethodmethod 决定了表单内容的提交方式。action 定义了表单提交后表单内容的发送位置。

action 设置为POST 意味着表单的内容将作为 HTTP 请求正文的一部分发送。这些值可以在PHP中通过$_POST 这个超全局进行检索。POST 的替代方法是GET ,它将表单的值作为 URL 的一部分传递。使用 GET 发送的值可在 PHP 中通过$_GET 超全局检索。

POSTGET 两种方法的主要区别在于可见性。网上有很多关于如何选择它们的文章,但我的建议是在使用表单时坚持使用POST,除非你有很好的理由在可查看的URL中传递用户数据。

在上面的例子中,action 被设置为向 PHP 的htmlspecialchars() 方法传递$_SERVER["PHP_SELF"] 的值的结果,该值是正在执行的当前脚本的名称。该方法用于将特定的HTML字符转换为其HTML实体名称。例如,> 将被转换为&gt;

这有两方面的作用。

  1. 如果用户提交了HTML标记,它可以防止表单被破坏
  2. 它是防止XSS(跨站脚本)攻击的一种手段,攻击者会用它来尝试利用网络应用中的漏洞。要了解其他常见的漏洞,请查看OWASP的十大漏洞。

**注意:**在真正的应用中,你可能会使用比htmlspecialchars 更多的东西来处理表单输入,例如像laminas-filter这样的第三方库。

如果你想让你的表单返回到生成它的同一个脚本,使用$_SERVER["PHP_SELF"] 比简单地硬编码一个位置要好,因为如果你改变了脚本的名称,你就不必更新代码。

在我们结束对表单的讨论之前,有三件事在使用HTML表单时需要记住。

  • 所有的表单控件都必须包含在form 标签中。
  • 文本和表单控件的对齐可以通过很多方式实现。CSS是许多人的首选。然而,要准备好在旧的HTML中看到用于对齐的表格。
  • 这里没有讨论--但对可访问性很重要--是label 元素

表单处理

现在你已经用HTML定义了表单,让我们来看看处理表单的代码。在这之前,请注意,表单可以处于两种状态之一。

  1. 当页面第一次加载时,会加载一个空白表单。
  2. 如果表单验证失败,则加载该表单。在这种状态下,用户填写的字段将包含提供的值。其他字段将是空的,旁边有一条错误信息。

继续阅读SitePoint上的用PHP进行表单验证