Php 简明教程

PHP - Form Validation

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

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

Client-side Validation

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

在将数据提交至服务器之前验证。对于其他输入类型(如 URL、数字等)也是如此。

Example

下面给出一个包含数字类型、电子邮件类型和 URL 类型的输入元素的 HTML 表单。如果您输入的不是按所需格式,那么在您尝试提交表单时会闪烁一个合适的错误信息。

<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

Validation Functions

带有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>

Form is Empty

如果用户(可能是无意中)单击了提交按钮,你可以要求 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
   }
?>

Example

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

<?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";
      }
   }
?>

Age field is non-numeric

在 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() 也对表单验证有用。

  1. trim() − 从字符串的开头和结尾移除空白

  2. htmlspecialchars() − 将特殊字符转换成 HTML 实体,以防止跨站点脚本(XSS)攻击。