2010-02-08 101 views
2

我在確定失敗時如何保留用戶數據時遇到問題。我對PHP有些新鮮,所以我可能會在邏輯上犯一些大錯。在驗證數據失敗時保留表單字段中的值

當前如果驗證失敗,所有的字段都被擦乾淨並且$ _Post數據也不見了。

這裏是一些代碼,假設用戶輸入一個無效的電子郵件我想要名稱字段被保留。此代碼不起作用。

<?php 
if($_POST['doSubmit'] == 'Submit') { 

    $usr_name = $data['Name']; 
    $usr_email = $data['Email']; 

    if (isEmail($usr_email)==FALSE){ 
     $err = "Email is invalid."); 
     header("Location: index.php?msg=$err"); 
     exit(); 
    } 

    //do whatever with data 

} 

if (isset($_GET['msg'])) { 
    $msg = mysql_real_escape_string($_GET['msg']); 
    echo "<div class=\"msg\">$msg</div><hr />"; 
} 
if (isset ($_POST['Name'])){ 
    $reusername = $_POST['Name'];} 
else{$reusername = "NOTHING";}//to test 

?> 
<form action="index.php" method="post" > 
<input name="UserName" type="text" size="30" value="<?echo $reusername;?>"> 
<input name="Email" type="text" size="30"> 
<input name="doSubmit" type="submit" value="submit"> 
</form> 




} 
+0

你能提供一些關於它不工作的細節嗎? – 2010-02-08 19:12:24

回答

2

您可以使用AJAX將您的表單數據提交給您的PHP腳本,並讓它返回指定驗證是否成功的JSON數據。這樣,你的領域將不會被擦乾淨。

另一種方法是將記錄的參數發送回發佈頁面,並在發佈頁面中使用PHP填充字段。

但是,我認爲第一種解決方案更好。

UPDATE

編輯使你的代碼更清晰,讓我發現了一些。您的輸入字段在HTML中被稱爲UserName,但您指的是PHP中的Name。這可能是因爲它不工作。您的領域是否始終填充價值NOTHING?確保輸入字段的名稱和您在$_POST中使用的下標相同。

此外,如果您有錯誤,則無需重定向到另一個頁面(使用標題)。維護一個$errors數組或變量以在同一頁面中打印錯誤消息。但就像我之前提到的那樣,使用JSON方法可能會更好,因爲您可以將視圖圖層(html)與PHP(控制器圖層)分開。所以你會把你的HTML放在一個文件中,而你的PHP放在另一個文件中。

+0

+1 - 很好的抓住了字段名稱中的html - > php的差異。 – prodigitalson 2010-02-08 19:35:01

+0

用戶名混淆只是我扔東西在一起。但是你和其中大部分評論都回答了我的問題。 – brad 2010-02-08 20:04:55

1

編輯

Vivin評論說我的關於header假設是不正確的,他是正確的在這。更進一步的看起來,OP所做的事情本質上是我在下面展示的,儘管結構不那麼完整。進一步的Vivin - 發現了這裏可能存在的實際問題 - html名稱和數組鍵$ _POST不匹配。


因爲您正在使用header重定向到另一個頁面,所以它已擦乾淨。通常你會有一個單獨的頁面來驗證數據,如果ok對它做些什麼並返回某種類型的成功視圖,或者返回一個直接顯示錶單的錯誤視圖。通過使用header你實際上將瀏覽器重定向到另一頁面(即啓動一個全新的請求)。

例如:

// myform.php

if(strtolower($_SERVER['REQUEST_METHOD']) == 'get') 
    { 
     ob_start(); 
     include('form.inc.php'); // we load the actual view - the html/php file 
     $content = ob_get_clean(); 
     print $content; // we print the contents of the view to the browser 
     exit; 
    } 
    elseif(strtolower($_SERVER['REQUEST_METHOD']) == 'post') 
    { 
    $form = santize($_POST); // clean up the input... htmlentities, date format filters, etc.. 
    if($data = is_valid($form)) 
    { 
     process_data($data); // this would insert it in the db, or email it, etc.. 
    } 
    else 
    { 
     $errors = get_errors(); // this would get our error messages associated with each form field indexed by the same key as $form 
     ob_start(); 
     include('form.inc.php'); // we load the actual view - the html/php file 
     $content = ob_get_clean(); 
     print $content; // we print the contents of the view to the browser 
     exit; 

    } 
    } 

所以這個假定您form.inc.php總是有編碼到它的錯誤消息的輸出 - 它只是不顯示出來。因此,在這個文件中,你可能會看到這樣的:

<fieldset> 
    <label for="item_1"> 
    <?php echo isset($error['item_1']) ? $error['item_1'] : null; ?> 
    Item 1: <input id="item_1" value="<?php echo $form['item_1'] ?>" /> 
    </label> 
</fieldset> 
0

可以做類似的,如果失敗,那麼就有價值= $ _ POST [「值」]

但vivin的回答是最好的。我對AJAX瞭解不多,因此無法進行管理。

0

好的,首先header("Location: index.php?msg=$err");是不是真的需要。最好不要在錯誤時重定向,但在同一頁面上顯示錯誤。而且,像這樣重定向意味着您將丟失表單中的所有發佈數據,因此您無法將其重新輸入到輸入中。

你需要做的是這樣的:

<input name="Email" type="text" size="30" value="<?php print (!$err && $usr_email ? htmlentities($usr_email, ENT_QUOTES) : '') ?>"> 

在這裏,我檢查是否存在任何錯誤,那麼$usr_email變量是否設置。如果這兩個條件都匹配,則發佈數據將打印在該字段的值屬性中。

我使用函數htmlentities()的原因是否則用戶可以向頁面中注入惡意代碼。

0

您似乎是在與您的表單相同的頁面上處理該帖子。這是一種可以做事的好方法,這意味着你已經快到了。如果您的驗證成功,您所要做的只是重定向,但如果失敗則不會。像這樣

<?php 
if(isset($_POST['number'])) { 
    $number = $_POST['number']; 
    // validate 
    if($number < 10) { 
     // process it and then; 
     header('Location: success_page.php'); 
    } else { 
     $err = 'Your number is too big'; 
    } 
} else { 
    $number = ''; 
    $err = ''; 
} 

?> 


<form method="POST"> 
    Enter a number less than 10<br/> 
    <?php echo $err ?><br/> 
    <input name="number" value="<?php echo $number ?>"><br/> 
    <input type="submit"> 
</form> 
相關問題