PHP - 表单验证



术语“表单验证”指的是确定用户在各种表单元素中输入的数据是否可以用于进一步处理的过程。在后续处理之前验证数据可以避免可能的异常和运行时错误。

验证可以在客户端和服务器端进行。当客户端提交表单时,表单数据会被服务器上运行的 PHP 脚本拦截。使用 PHP 中提供的各种函数,可以完成服务器端的表单验证。

客户端验证

根据 HTML5 规范,新的输入控件具有内置验证功能。例如,类型为“email”的输入元素,即使是文本字段,也经过定制以接受符合电子邮件地址协议的字符串。

验证发生在数据提交到服务器之前。对于其他输入类型,如 URL、数字等,也是如此。

示例

下面是一个 HTML 表单,其中包含数字类型、电子邮件类型和 URL 类型的输入元素。如果您输入与所需格式不符的数据,则在尝试提交表单时会显示相应的错误消息。

<h1>Input Validation</h1>
<form>
   <p><Label for "name">Enter your name</label>
   <input type = "text" id="name" name="name"></p>
   <p><label for="age">Enter age</label>
   <input type = "text" id = "age" name="age"></p>
   <p><label for="email">Enter your email:</label>
   <input type="text" id="email" name="email"></p>
   <p><label for="URL">Enter your website<label>
   <input type = "text" id="URL" name="url"></p>
   <input type="submit">
</form>

数字类型的文本字段在右侧显示上下计数箭头。只接受数字,并且可以递增或递减。

PHP Form Validation 1

如果电子邮件字段中的数据无效,您会看到如下所示的错误消息。

PHP Form Validation 2

类似地,URL 的任何不正确格式也会显示如下所示的错误 -

PHP Form Validation 3

验证函数

使用 PHP 进行服务器端验证的情况出现在表单数据通过客户端验证时,或者根本没有客户端验证时。

在上例中使用的 HTML 表单中,让我们删除所有特殊输入类型,并使用所有文本类型的文本字段。表单使用 POST 方法提交到服务器上的 hello.php。

<form action="hello.php" method="POST">
   <p><Label for "name">Enter your name</label>
   <input type = "text" id="name" name="name"></p>
   <p><label for="age">Enter age</label>
   <input type = "text" id = "age" name="age"></p>
   <p><label for="email">Enter your email:</label>
   <input type="text" id="email" name="email"></p>
   <p><label for="URL">Enter your website<label>
   <input type = "text" id="URL" name="url"></p>
   <input type="submit">
</form>

表单为空

如果用户(可能是无意地)点击提交按钮,您可以要求 PHP 再次显示表单。您需要检查 $_POST 数组是否已使用 isset() 函数初始化。如果没有,header() 函数会将控制权重新定向回表单。

<?php 
   if ($_SERVER["REQUEST_METHOD"] == "POST") {
      if (isset($_POST)) {
         header("Location: hello.html", true, 301);  
         exit();  
      }
      // form processing if the form is not empty
   }
?>

示例

您还可以检查在提交表单时是否有任何字段为空。

<?php        
   if ($_SERVER["REQUEST_METHOD"] == "POST") {
      foreach($_POST as $k=>$v) {
         if (empty($v)==true) {
            echo "One or more fields are empty \n";
            echo "<a href = 'hello.html'>Click here to go back </a>";
            exit;
         }
         else
         echo "$k => $v \n";
      }
   }
?>

年龄字段不是数字

在 HTML 表单中,名称的输入字段为文本类型,因此它可以接受任何字符。但是,我们希望它为数字。这可以通过 is_numeric() 函数来确保。

<?php    
   if (is_numeric($_POST["age"])==false) {
      echo "Age cannot be non-numeric \n";
      echo "<a href = 'hello.html'>Click here to go back</a>";
   }
?>

PHP 还有 is_string() 函数来检查字段是否包含字符串。另外两个函数 trim() 和 htmlspecialchars() 也对表单验证很有用。

  • trim() - 从字符串开头和结尾删除空白字符

  • htmlspecialchars() - 将特殊字符转换为 HTML 实体,以防止跨站点脚本 (XSS) 攻击。

广告