PHP - 完整表单


本章将表单验证和 HTML 表单数据提取的所有概念放入 PHP 代码中。

下面给出的完整表单处理代码包含三个部分:开头 PHP 代码部分,用于在提交表单时查找任何验证错误,带有各种元素(如文本字段、单选按钮、选择控件、复选框等)的 HTML 表单。第三部分又是一个 PHP 代码,它呈现用户输入的数据。

PHP 错误跟踪

捕获错误的代码位于整个脚本的开头。显然,每次加载页面时都会执行此任务。如果在提交表单后加载,则以下段将检查每个元素是否为空,电子邮件字段是否格式正确,并单击复选框(指示用户同意条款)。


<?php

   // 定义变量并设置为空值
   $nameErr = $emailErr = $genderErr = $websiteErr = "";
   $name = $email = $gender = $class = $course = $subject = "";

   if ($_SERVER["REQUEST_METHOD"] == "POST") {
      if (empty($_POST["name"])) {
         $nameErr = "姓名为必填项";
      } else {
         $name = test_input($_POST["name"]);
      }

      if (empty($_POST["email"])) {
         $emailErr = "电子邮件是必填项";
      } else {
         $email = test_input($_POST["email"]);
         
         // 检查电子邮件地址的格式是否正确
         if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $emailErr = "电子邮件格式无效"; 
         }
      }

      if (empty($_POST["course"])) {
         $course = "";
      } else {
         $course = test_input($_POST["course"]);
      }

      if (empty($_POST["class"])) {
         $class = "";
      } else {
         $class = test_input($_POST["class"]);
      }

      if (empty($_POST["gender"])) {
         $genderErr = "性别是必填项";
      } else {
         $gender = test_input($_POST["gender"]);
      }

      if (empty($_POST["subject"])) {
         $subjectErr = "您必须选择一个或多个选项";
      } else {
         $subject = $_POST["subject"];    
      }
   }

   function test_input($data) {
      $data = trim($data);
      $data = stripslashes($data);
      $data = htmlspecialchars($data);
      return $data;
   }
?>

HTML 表单

呈现入口表单的 HTML 脚本遵循错误捕获代码。在表单设计中采用了各种元素。


<h2>启科普注册表</h2>
<p><span class = "error">* 必填字段.</span></p>
<form method = "POST" action = "<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
   <table>
      <tr>
         <td>性名:</td>
         <td>
            <input type = "text" name = "name">
            <span class = "error">* <?php echo $nameErr;?></span>
         </td>
      </tr>
      <tr>
         <td>E-mail: </td>
         <td>
            <input type = "text" name = "email">
            <span class = "error">* <?php echo $emailErr;?></span>
         </td>
      </tr>
      <tr>
         <td>时间:</td>
         <td>
            <input type = "text" name = "course">
            <span class = "error"><?php echo $websiteErr;?></span>
         </td>
      </tr>
      <tr>
         <td>班级:</td>
         <td><textarea name = "class" rows = "5" cols = "40"></textarea></td>
      </tr>
      <tr>
         <td>性别:</td>
         <td>
            <input type = "radio" name = "gender" value = "女性">女性
            <input type = "radio" name = "gender" value = "男性">男性
            <span class = "error">* <?php echo $genderErr;?></span>
         </td>
      </tr>
      <tr>
         <td>选择:</td>
         <td>
            <select name = "subject[]" size = "4" multiple>
               <option value = "Android">C</option>
               <option value = "Java">Java</option>
               <option value = "C#">C#</option>
               <option value = "Data Base">C++</option>
               <option value = "Hadoop">PHP</option>
               <option value = "VB script">Python</option>
            </select>
         </td>
      </tr>
      <tr>
         <td>同意</td>
         <td><input type = "checkbox" name = "checked" value = "1"></td>
         <?php if(!isset($_POST['checked'])){ ?>
            <span class = "error">* <?php echo "你必须同意条款";?></span>
         <?php } ?> 
      </tr>
      <tr>
         <td>
            <input type = "submit" name = "submit" value = "Submit"> 
         </td>
      </tr>
   </table>
</form>

请注意,表单数据被提交回同一个脚本,因此表单的 action 属性设置为 $_SERVER[“PHP_SELF”] 超全局变量。这部分还包含某些内联 PHP 代码,这些代码会在相应的表单控件之外闪烁错误消息 - 例如,如果在提交表单时 name 字段为空,则 Name 提示消息就在 Name 文本框旁边。

显示表单数据

脚本的第三部分再次是一个 PHP 代码,它回显用户提交的每个表单字段的值。


<?php
   if ($_SERVER["REQUEST_METHOD"] == "POST") {
      echo "<h2>您的给定值如下:</h2>";
      echo ("<p><b>姓名</b> : $name</p>");
      echo ("<p><b>Email 地址</b> : $email</p>");
      echo ("<p><b>优先上课时间</b> : $course</p>");
      echo ("<p><b>班级信息</b> : $class </p>");
      echo ("<p><b>性别</b> : $gender</p>");
      echo "<p><b>已选择子主题:</b><p>";
      if (!empty($subject)) { 
         echo "<ul>";
         for($i = 0; $i < count($subject); $i++) {
            echo "<li>$subject[$i]</u/li>";
         }
         echo "</ul>";
      }
   }
?>

例子

PHP 处理 HTML 表单的完整代码如下 -


<html>
<head>
   <style>
      .error {color: #FF0000;}
   </style>
</head>
<body>
   <?php
   
      // 定义变量并设置为空值
      $nameErr = $emailErr = $genderErr = $websiteErr = "";
      $name = $email = $gender = $class = $course = $subject = "";

      if ($_SERVER["REQUEST_METHOD"] == "POST") {
         if (empty($_POST["name"])) {
            $nameErr = "姓名为必填项";
         }else {
            $name = test_input($_POST["name"]);
         }

         if (empty($_POST["email"])) {
            $emailErr = "Email为必填项";
         } else {
            $email = test_input($_POST["email"]);

            // 检查电子邮件地址的格式是否正确
            if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
               $emailErr = "无效的 email 地址"; 
            }
         }

         if (empty($_POST["course"])) {
            $course = "";
         } else {
            $course = test_input($_POST["course"]);
         }

         if (empty($_POST["class"])) {
            $class = "";
         } else {
            $class = test_input($_POST["class"]);
         }

         if (empty($_POST["gender"])) {
            $genderErr = "性别为必填项";
         } else {
            $gender = test_input($_POST["gender"]);
         }

         if (empty($_POST["subject"])) {
            $subjectErr = "您必须选择一个或多个科目";
         } else {
            $subject = $_POST["subject"];    
         }
      }

      function test_input($data) {
         $data = trim($data);
         $data = stripslashes($data);
         $data = htmlspecialchars($data);
         return $data;
      }
   ?>
   <h2>启科普班级注册表</h2>
   <p><span class = "error">* 必填字段.</span></p>
   <form method = "POST" action = "<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
      <table>
         <tr>
            <td>姓别:</td>
            <td>
               <input type = "text" name = "name">
               <span class = "error">* <?php echo $nameErr;?></span>
            </td>
         </tr>
         <tr>
            <td>E-mail: </td>
            <td>
               <input type = "text" name = "email">
               <span class = "error">* <?php echo $emailErr;?></span>
            </td>
         </tr>
         <tr>
            <td>上课时间:</td>
            <td> 
               <input type = "text" name = "course">
               <span class = "error"><?php echo $websiteErr;?></span>
            </td>
         </tr>
         <tr>
            <td>班别:</td>
            <td><textarea name = "class" rows = "5" cols = "40"></textarea></td>
         </tr>
         <tr>
            <td>性别:</td>
            <td>
               <input type = "radio" name = "gender" value = "女性">女性
               <input type = "radio" name = "gender" value = "男性">男性
               <span class = "error">* <?php echo $genderErr;?></span>
            </td>
         </tr>
         <tr>
            <td>选择科目:</td>
            <td>
               <select name = "subject[]" size = "4" multiple>
                  <option value = "C">C</option>
                  <option value = "Java">Java</option>
                  <option value = "C#">C#</option>
                  <option value = "c++">C++</option>
                  <option value = "PHP">PHP</option>
                  <option value = "Python">Python</option>
               </select>
            </td>
         </tr>
         <tr>
            <td>同意</td>
            <td><input type = "checkbox" name = "checked" value = "1"></td>
            <?php if(!isset($_POST['checked'])){ ?>
               <span class = "error">* <?php echo "你必须同意条款";?></span>
            <?php } ?> 
         </tr>
         <tr>
            <td>
               <input type = "submit" name = "submit" value = "Submit"> 
            </td>
         </tr>
      </table>
   </form>
   <?php
      if ($_SERVER["REQUEST_METHOD"] == "POST") {
         echo "<h2>您的给定值如下 :</h2>";
         echo ("<p><b>姓名</b> : $name</p>");
         echo ("<p><b>Email 地址</b> : $email</p>");
         echo ("<p><b>优先上课时间</b> : $course</p>");
         echo ("<p><b>班级信息</b> : $class </p>");
         echo ("<p><b>性别</b> : $gender</p>");
         echo "<p><b>已选择科目:</b><p>";
         if (!empty($subject)) { 
            echo "<ul>";
            for($i = 0; $i < count($subject); $i++) {
               echo "<li>$subject[$i]</u/li>";
            }
            echo "</ul>";
         }
      }
   ?>
</body>
</html>

它将产生以下输出 -

PHP完整表单1