2013-03-20 74 views
0

我想包具有相同的頁面驗證,但外部處理此聯繫人/報價表。我已經設置了一個變量來進行表單操作,當表單驗證時,變量/網址從同一頁面更改爲處理頁面。然而,它走的是兩條點擊提交按鈕,以處理後的形式所需的所有領域都被填充:所有必填字段將填寫,我點擊提交,頁面重新加載與保存的數據變量,然後當我點擊提交agin,它終於完成,發送電子郵件並加載謝謝頁面。我在這裏搜索了這些帖子,嘗試了很多東西,但還沒有找到解決方案。我絕對不是一個PHP專家,還是個新手,所以這可能不是實現這一目標的最佳方式,但我會很感激如何完成這件事的任何想法。這裏是我的: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="[email protected]"/> 
<input type="hidden" name="subject" value="Web Site Response"/> 
<input type="hidden" name="redirect" value="thankyou.html"/></p> 

... form fields ... 

</form>  

謝謝你提前!

+1

這是你的全部代碼嗎?看起來您並不像您指定您的$ _POST變量,例如'$名稱= $ _ POST [「名」];' – romo 2013-03-20 22:04:22

+0

你最好檢查這對客戶方在我看來的JavaScript。現在您已經通過驗證重新回到了服務器端。如果驗證失敗,您也可以重新導向到表單頁面。但不是做事的最佳方式。 – Daniel 2013-03-20 22:06:18

+0

你絕對應該做的客戶端驗證像丹尼爾說,但服務器端驗證也是不錯的。看到這裏的問題的詳細信息,建立一個非常簡單的形式與驗證:http://stackoverflow.com/questions/12158229/php-form-submit – jacobangel 2013-03-20 22:21:07

回答

0

遺漏變量首先檢查,然後提取和驗證的變量,那麼會根據他們的內容。

<?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一些字符串常量。

正如你可能想谷歌的一些教程解釋在服務器上做使用PHP形式處理的新人,和JavaScript在客戶端。如果你找到一個教程,它給你的代碼在測試數據的時候會產生回聲錯誤,比如你的代碼,那麼就繼續前進。這不是一個好的教程。如果您發現一個在發現一個錯誤後停止的人,也請繼續前進。如果你找到一個告訴你,以確保值是正確的在JavaScript,然後說:「我們已經在客戶端驗證這個,所以我們使用的值直接在PHP」,待着了。尋找一個教程,說明:

  • 確保有一個在所有表單域,使用JavaScript數據,因此提交按鈕被禁用,直到有一個爲所有字段的數據。
  • 確保數據符合您的標準,在PHP中,這樣的人誰只是張貼到你的服務器而沒有使用你的頁面沒有逃脫注入有趣的東西所有的方式,他們不應該是能夠做到
  • 您生成的頁面中包含解釋的所有錯誤(如果有),並且表單使用錯誤的數據重新填充,但突出顯示爲錯誤
  • 如果沒有錯誤,則處理髮布請求。

(如果該教程解釋POST請求不需要實際上曾經生成頁面內容作爲響應,比報頭指示POST調用是否被接受或拒絕其他。獎勵分)

+0

哇,謝謝你的徹底和周到的迴應! – heather 2013-03-21 16:56:55

+0

如果這是你所希望的答案,請記住點擊「這回答我的問題」複選標記,所以你的問題不會留在「未回答的問題」列表=) – 2013-03-21 22:15:04