[PHP]輕鬆製作驗證信
2016-06-22

如何用電郵寄出驗證碼並送出表單→查看範例

製作表單(A)→表單處理程式(B)→寄出驗證碼→回到(A)→輸入→在(B)檢查→TRUE→清空SESSION(C)→執行
以下(A)檔名為index.php;(B)檔名為send.php;(C)檔名為re.php

STEP1:製作表單 (A)

    <form action="send.php" method="post">
  • <input placeholder="輸入您的E-mail" type="text" name="email"/>
  • <input type="submit" value="送出"/>
    </form>

STEP2:寄出驗證碼 (B)

為了確定目前是在此階段,我們先設一個可以偵測此階段的session

    <?php
    session_start(); //啟動session
      $email
      =$_POST['email']; //取得傳入值
      $randid=$_POST['randid']; //取得待會驗證碼傳入值
        //設「偵測階段的session」為 $_SESSION['step']
        if(empty($_SESSION['step'])){
      • $rand=rand(10000,99999); //設定五位數亂數值
      • $_SESSION['rand']=$rand; //儲存五位數亂數值
        • //以下為傳送郵件方法
        • $to ="
          $email
          ";
        • $subject ="驗證信";
        • $msg ="驗證碼為:".$rand;
        • if(mail("$to", "$subject", "$msg")){
        • $_SESSION['step']=2; //送出成功則設定為階段 2
        • }else{
        • $_SESSION['step']=4; //送出失敗則設定為階段 4
        • }
          }
            header("Location: index.php"); //執行完後跳回(A)
            exit;
            ?>

          STEP3:輸入驗證碼 (A)

          寄出驗證碼後,回到(A)頁面輸入,這時必需隱藏當時的東東,白色字體為重複出現的程式碼

            <?php
            session_start(); //啟動session
            if(empty($_SESSION['step'])){
          • echo'
            <form action="send.php" method="post">
            ';
          • echo'
            <input placeholder="輸入您的E-mail" type="text" name="email"/>
            ';
          • echo'
            <input type="submit" value="送出"/>
            ';
          • echo'
            </form>
            ';
            }
            elseif($_SESSION['step']==2){ //此階段偵測為已寄出驗證信
          • echo'<form action="send.php" method="post">';
          • echo'<input placeholder="輸入5位數驗證碼" type="text" name="randid"/>';
          • echo'<input type="submit" value="送出"/>';
          • echo'</form>';
          • echo'<a href="re.php">點此重新輸入Email</a>'; //避免輸錯E-mail而無法恢復原來的頁面 (C)
            }
            ?>

          STEP4:驗證輸入的驗證碼 (B)

          白色字體為重複出現的程式碼

            <?php
            session_start(); //啟動session
              $email
              =$_POST['email']; //取得傳入值
              $randid=$_POST['randid']; //取得待會驗證碼傳入值
                //設「偵測階段的session」為 $_SESSION['step']
                if(empty($_SESSION['step'])){
              • $rand=rand(10000,99999); //設定五位數亂數值
              • $_SESSION['rand']=$rand; //儲存五位數亂數值
                • //以下為傳送郵件方法
                • $to ="
                  $email
                  ";
                • $subject ="驗證信";
                • $msg ="驗證碼為:".$rand;
                • if(mail("$to", "$subject", "$msg")){
                • $_SESSION['step']=2; //送出成功則設定為階段 2
                • }else{
                • $_SESSION['step']=4; //送出失敗則設定為階段 4
                • }
                  }
                  elseif($_SESSION['step']==2 || $_SESSION['step']==4){ //階段 4 可重新驗證
                • if($randid==$_SESSION['rand']){
                • $_SESSION['step']=3; //如果正確則設定為階段 3
                • //此塊自由發揮
                • }else{
                • $_SESSION['step']=4; //如果錯誤則設定為階段 4;
                • }
                • }
                  header("Location: index.php"); //執行完後跳回(A)
                  exit;
                  ?>

                在(B)中如果得到的Session['step']:
                為空→寄驗證信並調成 2
                2或4→則進行驗證

                STEP5:告知使用者成功與否 (A)

                驗證碼驗正後有對或者錯,回到(A)頁面顯示,$_SESSION['step']=3代表成功,$_SESSION['step']=4代表失敗

                  <?php
                  session_start(); //啟動session
                  if(empty($_SESSION['step'])){
                • echo'
                  <form action="send.php" method="post">
                  ';
                • echo'
                  <input placeholder="輸入您的E-mail" type="text" name="email"/>
                  ';
                • echo'
                  <input type="submit" value="送出"/>
                  ';
                • echo'
                  </form>
                  ';
                  }
                  elseif($_SESSION['step']==2){
                • echo'<form action="send.php" method="post">';
                • echo'<input placeholder="輸入5位數驗證碼" type="text" name="randid"/>';
                • echo'<input type="submit" value="送出"/>';
                • echo'</form>';
                • echo'<a href="re.php">點此重新輸入Email</a>'; //避免輸錯E-mail而無法恢復原來的頁面 (C)
                  }
                  elseif($_SESSION['step']==3){
                • echo'<span>成功</span>';
                • unset($_SESSION['step']); //清空SESSION,下次使用才會變回原來的樣子
                  }
                  elseif($_SESSION['step']==4){
                • echo'<span>失敗</span>';
                • echo'<form action="send.php" method="post">';
                • echo'<input placeholder="輸入5位數驗證碼" type="text" name="randid"/>';
                • echo'<input type="submit" value="送出"/>';
                • echo'</form>';
                • echo'<a href="re.php">點此重新輸入Email</a>';
                  }
                  ?>

                在(A)中如果得到的Session['step']:
                為空→讓使用者輸入E-mail等相關表單
                2→讓使用者輸驗證碼
                3→成功
                4→失敗

                STEP6:清空session (C)

                  <?php
                • session_start();
                • unset($_SESSION['step']);
                  header("Location: index.php"); //執行完後跳回(A)
                  exit;
                  ?>

                (C)存在的目的在於清空Session


                真正需要複製的內容:STEP4 存成send.php ;STEP5 存成index.php ;STEP6 存成re.php
                檔案下載:點此下載檔案