2013-01-09 142 views
0

我試圖從服務器端表單驗證器中的函數返回一個錯誤消息回到它提交的形式。驗證器正在工作,因爲它可以防止其餘的該代碼按照計劃將其保存到數據庫中。不過,我不能讓它傳回的形式來顯示錯誤通過PHP表單驗證錯誤消息回提交表格

function saveComment(){ 
    $validate = array(); 
    $id = isset($_POST["articleId"]) ? $_POST["articleId"] : ''; 

    if (isset($_POST['saveChanges'])) { 

    if ($_POST['name'] == ""){ 
     $validate['errorMessage'] = "Please fill out your name."; 
     header("Location:".HOME_PATH."/.?action=viewArticle&articleId=".$_POST['articleID'].""); 
    } 

我試圖傳遞迴這個

if (isset($validate['errorMessage'])) { 
    echo $validate['errorMessage']; 
} 

當我在顯示功能我得到的去除if錯誤unidentified index

我需要做什麼才能使窗體顯示錯誤消息。我是否需要將數組傳遞給處理文章顯示的函數?

反饋

對於任何可能發現這很有用我用@OliverBS POST方法幾乎不變。

也謝謝你@致命的吉他,他的解釋使我明白我哪裏錯了,可以用來解決這個問題+1

+4

@BogdanBurim如果你要費心評論使一些有用的東西不是一個毫無意義的聲明 – user1711576

+0

嘿,這是否只是確保你寫你怎樣得到的去工作,這樣別人就可以使用這個問題,你不會忘記將來。 –

回答

1

在快速瀏覽試試這個

會議方式

確保通過在其中saveComment是文件的頂部做session_start();啓動會話和isset檢查。

function saveComment(){ 

    $id = isset($_POST["articleId"]) ? $_POST["articleId"] : ''; 

    if (isset($_POST['saveChanges'])) { 

    if ($_POST['name'] == ""){ 
     $_SESSION['errorMessage'] = "Please fill out your name."; 
     header("Location:".HOME_PATH."/.?action=viewArticle&articleId=".$_POST['articleID'].""); 
    } 

if (isset($_SESSION['errorMessage'])) { 
    echo $_SESSION['errorMessage']; 
} 

,或者你可以嘗試我沒有測試過這

POST方式

function saveComment(){ 

     $id = isset($_POST["articleId"]) ? $_POST["articleId"] : ''; 

     if (isset($_POST['saveChanges'])) { 

     if ($_POST['name'] == ""){ 
      $error = urlencode('Please fill out your name'); 
      header("Location:".HOME_PATH."/.?action=viewArticle&articleId=".$_POST['articleID']. "&error=" . $error); 
     } 

    if (isset($_GET['error'])) { 
     echo urldecode($_GET['error']); 
    } 

,但你應該得到的東西做的基本理念。

1

當你做你的重定向頭位置的各種方法用戶轉到新頁面。您將不得不在查詢字符串中傳遞錯誤,或理想地將其作爲會話中的變量傳遞。

+0

或重構代碼以重定向成功,而不是錯誤。 –

+0

在POST請求上,最好使用303重定向,無論結果如何。這可以防止用戶刷新頁面並意外重新提交表單或使用前進和後退瀏覽器按鈕執行相同操作。 – tavocado

0

您將用戶重定向到「error」頁面,其語句爲header。問題當然是,這是一個全新的頁面,沒有剩下的狀態,所以你的變量都不存在了。

有兩種方法可以將它傳遞給查詢字符串(因此請添加&錯誤= ...)並將其解析到模板中,或將其保存到會話中。

當然,在使用不同的方式呈現模板之前,您應該真的這樣做,但這是對代碼的完整返工。

3

您正在爲當前正在執行的腳本設置變量$validate。之後,您發送重定向標頭。這將導致您的瀏覽器發出新的請求,從而結束當前正在執行的腳本並取消變量。新的請求將觸發另一個腳本調用,其中變量不再是已知的,因爲它只在第一個請求期間存在。

HTTP是無狀態的,因此您在服務器端設置的每個變量都會一直存在,直到您完成當前請求並響應客戶端。您需要的是將此變量傳遞給處理第二個請求的腳本的方法。有幾種方法可以這樣做:

  • 傳遞GET參數。您可以將類似"&validationError=" . $validate['errorMessage']的內容附加到您傳遞到位置標題的網址,然後在顯示頁面上通過$_GET進行訪問。
  • 將驗證狀態保存在$_SESSION中。 PHP手冊包含大量有關會話的信息(可能您已經在使用它們了?)
  • 重構代碼的方式不會在錯誤時重定向,但會成功。

3號提案中的一些詳細信息:你寫一個PHP腳本,顯示形式處理表單POST請求。如果驗證失敗,只需重新顯示,然後插入您已有的語句echo。如果它成功,您將重定向到某個成功頁面。這樣,變量將保持可訪問,因爲它仍然是相同的請求。

+0

傳遞錯誤號的好處是可以縮短查詢參數的長度。 –

+0

謝謝你的幫助。我現在已經明白了這個問題,並且爲了將來的參考而對它進行處理 – user1711576

1

我會建議在一個文件中這樣做,即將表單和驗證作爲一個文件。

然後,你可以這樣做:

<?php 
    //set success to 0 
    $success = 0; 
    $errormsgs = array(); 

    //check for post 
    if(isset($_POST['submit'])){ 

     //get the data from the form post and validate it 
     $valid = validateFuntion($_POST['data']) 
      //the is function will validate the data. If it is not valid, it will add a message to $errormsgs 

     //check for errors 
     if(!$errormsgs){ 
      //data validation was successful, do stuff 

     } 
    }//if validation fails, it will fall out of the this code block and move on 
?> 


<html> 
<body> 
<?php 
//check for errors 
if($errormsgs){ 
    $content .= '<ul class="errors">'; 
        foreach($errormsgs as $error){ 
         $content .= "<li>" . $error . "</li>"; 
        } 
    $content .= "</ul>"; 
    echo $content; 
} 
?> 
<form name="name" action="" method="post"> 
    <input name="name" value="<?= (isset($_POST['data']) ? $_POST['data'] : '') ?>" type="text"> 
</form> 
</body> 
</html>