簡體   English   中英

通過外部處理在同一頁面上進行PHP表單驗證

[英]PHP form validation on same page with external processing

我試圖包裝這種具有相同頁面驗證但外部處理的聯系方式/報價單形式。 我設置了一個變量以執行表單操作,並且當表單驗證時,變量/ URL從同一頁面更改為處理頁面。 但是,填寫完所有必填字段后,需要兩次單擊“提交”按鈕來處理表單:將填寫所有必填字段,單擊“提交”,頁面重新加載已保存的數據變量,然后在點擊Submit agin,它終於完成了,發送了電子郵件並加載了Thankyou頁面。 我在這里搜索了帖子,並嘗試了多種方法,但沒有找到解決方案。 我絕對不是PHP專家,還是新手,因此這可能不是實現此目標的最佳方法,但我希望對完成此工作提出任何想法。 這是我所擁有的:

<?php

....

if (empty($Name) && empty($Company) && empty($Address1) && empty($City) && empty($State) && empty($Phone))
{
    echo '<p class="tan">The fields marked with an * are required.</p>';
$Process = 'samepageurl'; 

}

/*else if (empty($Name) || is_numeric($Name))
{
echo '<p class="tan"><b>Please enter your name.</b></p>';
}*/

else if (empty($Company) || is_numeric($Company))
{
echo '<p class="tan"><b>Please enter your company name.</b></p>';
$Process = 'samepageurl'; 

}

else if (empty($Address1) || is_numeric($Address1))
{
echo '<p class="tan"><b>Please enter your address.</b></p>';
$Process = 'samepageurl'; 

}

else if (empty($City) || is_numeric($City))
{
echo '<p class="tan"><b>Please enter your city.</b></p>';
$Process = 'samepageurl'; 

}

else if (empty($State) || is_numeric($State))
{
echo '<p class="tan"><b>Please enter your state.</b></p>';
$Process = 'samepageurl'; 

}

else if (empty($Phone) || ctype_alpha($Phone))
{
echo '<p class="tan"><b>Please enter your phone number.</b></p>';
$Process = 'samepageurl'; 

}

else if (strlen($Phone) < 10 || strlen($Phone) > 12 || ctype_alpha($Phone) || ctype_space($Phone))
{
echo '<p class="tan"><b>Please enter a phone number with an area code.</b></p>';
$Process = 'samepageurl'; 

}

else if (isset($Name) && isset($Company) && isset($Address1) && isset($City) && isset($State) && isset($Phone))
{
$Process = 'processingurl';
}
?> 

<form action="<?php echo $Process; ?>" method="post" class="print"  >
<p><input type="hidden" name="recipient" value="responses@url.com"/> 
<input type="hidden" name="subject" value="Web Site Response"/>
<input type="hidden" name="redirect" value="thankyou.html"/></p>

... form fields ...

</form>    

先感謝您!

首先檢查缺少的變量,然后提取並驗證變量,然后根據它們提供內容。

<?php
  function verifyPostContains(&$req) {
    global $_POST;
    $missing = array();
    foreach($req as $var => $_) {
      if(!isset($_POST[$var])) {
        $missing[] = $var;
      }
    }
    return $missing;
  }

  $requirements = array('name'=>'','city'=>'','state'=>'',...);
  $missing = verifyPostContains($requirements);

  if(count($missing)>0) {
    $content = formErrorReport($missing);
    sendHeaders();
    echo $content;
    exit();
  }

  // extract, making sure to sanitize
  $name = sanitize($_POST["name"]);
  ...

  $errorHtml = array();
  // validate by reference. Effectively call testName($name).
  if(failsValidation($name, "testName")) {
    $errorHtml [] = generateError(NAME_ERROR, $name);
  } else { $requirements["name"] = $name; }
  if(failsValidation($city, "testCity")) {
    $errorHtml [] = generateError(CITY_ERROR, $city);
  } else { $requirements["city"] = $name; }
  ...

  if(count($errorHTML)>0) {
    generateErrorPage($requirements, $missing, $errorHTML);
  } else { processForm($requirements); }
?>

此代碼假定您具有執行所需的各種操作的功能,並且具有一些用於生成錯誤HTML的字符串常量。

作為新手,您可能想在Google上搜索一些教程,這些教程說明在服務器上使用PHP在客戶端上使用JavaScript進行表單處理。 如果您找到了一個教程,該教程為您提供了在測試數據時回顯錯誤的代碼(例如您的代碼),那么請繼續學習。 這不是一個很好的教程。 如果您發現一個在發現錯誤后停止的故障,也請繼續進行。 如果找到一個告訴您確保JavaScript值正確的消息,然后說“我們已經在客戶端驗證了這一點,那么我們可以直接在PHP中使用這些值”,也請繼續。 查找說明以下內容的教程:

  • 確保使用JavaScript在所有表單字段中都有數據,因此禁用提交按鈕,直到所有字段都有數據為止。
  • 確保數據符合您的條件(使用PHP),這樣就可以使那些不使用您的頁面就發布到您的服務器的人無法擺脫注入他們本不應該做的各種有趣的事情
  • 您會生成一個頁面,其中包含所有已解釋的錯誤(如果存在),並且用錯誤的數據重新填充了表單,但突出顯示為錯誤
  • 如果沒有錯誤,您將處理郵寄請求。

(如果本教程解釋為實際上不需要生成POST內容就不需要POST請求,而是指出指示是否接受或拒絕POST調用的標頭,則可以得到獎勵)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM