2011-09-30 47 views
0

我創建了一個使用IF .. ELSE以簡單形式驗證數據的測試表單。這工作正常,任何驗證消息或錯誤都發布到同一頁面(userform.php),以通知用戶成功或其他。使用'IF .. ELSE'來更改變量並在'表單動作...'中使用它''

我想現在要做的是把用戶帶到不同的頁面上,成功完成表單。這是我的代碼到目前爲止:

<?php 
if (isset($_POST['email'], $_POST['password'])) { 
$errors = array(); 

$firstname = $_POST['firstname']; 
$lastname = $_POST['lastname']; 
$email = $_POST ['email']; 
$password = $_POST ['password']; 


if (empty ($firstname) || empty ($lastname) || empty ($email) || empty ($password)) { 
$errors [] = "Please complete the form"; 
} 
if (empty($email)) { 
$errors [] = "You must enter an email address"; 
} 
if (empty($password)) { 
$errors [] = "You must enter a password"; 
} 
if (filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE){ 
$errors[] = "Please enter a valid email address"; 
} 
} 
if (!empty ($errors)) { 
foreach ($errors as $error) { 
echo '<strong>', $error ,'</strong><br />'; 
$result = "userform.php"; 
} 
} else { 
$result = "confirm.php"; 
} 
?> 
<form action="<?php echo $result ?>" method="post"> 

這個想法是,用戶成功或否則在完成窗體更改$結果變量在表單操作中使用。上面的代碼不起作用,那我該怎麼做呢? 它甚至有可能嗎?

+0

它是如何工作的?它被重定向,但沒有傳遞值?根本不會被重定向? – Mido

+0

您意識到由於PHP是預處理器,因此需要提交一次表單以驗證所有內容並設置正確動作,然後再次發佈到上述動作? –

+0

對不起!在上面的位置添加$ result變量只是看到用戶重定向到confirm.php,他們是否在表單中輸入了正確的詳細信息 –

回答

1

,而不是「形式的行動=」在底部:

<?php 
include($result); 
?> 
+0

是的,我認爲這是最好的解決方案,你可以繼續使用這個解決方案$ _POST變量,而不是重定向通過http –

+0

@Jorge Pinho - 感謝您的提示,但我恐怕它不工作 - 關於提交I得到'禁止'的錯誤! :( –

+0

@MikaA。你不能使用相同的頁面,使用頁面作爲容器,然後你有「成功」和「形式」作爲單獨的.php –

0

你現在正在做的方式,將用戶重定向到confirm.php如果他們提交表格第二次。您可以將您的代碼更改爲:

} else { 
    // $result = "confirm.php"; 
    header("Location: confirm.php"); 
    exit(); 
} 

這樣,如果輸入了所有內容,用戶將被重定向到confirm.php。但如果一切都很好,你如何處理這些變量?他們不會被帶到新的頁面。

+0

+1 - 通過他們對我的回答的評論來判斷,這確實是什麼@Sam Campsall尋找 –

1

據我所知,你希望它像這樣工作:

  1. 用戶填寫表單
  2. 用戶提交表單
  3. 表單提交去userform.php
    1. 如果所有值驗證,繼續confirm.php
    2. 如果不是,則返回userform.php

如果是這樣的話,我不認爲你想改變表單動作:這將要求用戶重新提交表單。相反,使用HTTP重定向將它們發送到confirm.php

header("Location: confirm.php"); 

...或者如果你想成爲真正由這本書是:

header("Status: 303 See Other"); 
header("Location: http://exampel.com/confirm.php"); // according to the protocol, 
                // `Location` headers should be full URLs 

<?php 
/* ... */ 
if (!empty ($errors)) { 
    foreach ($errors as $error) { 
     echo '<strong>', $error ,'</strong><br />'; 
    } 
    ?> 
     <form action="userform.php" method="post"> 
    <?php 
} else { 
    header("Location: confirm.php"); 
    // if you need to pass additional information to confirm.php, use a query string: 
    // header("Location: confirm.php?var1=".$var1); 
} 
?> 
+0

是的,這正是我想要做的。在我的代碼中,我應該怎樣使用'header'代碼? –

+0

增加了一個例子;它不是最漂亮的代碼,但它得到 –

+0

Upvoted,因爲這正是山姆正在尋找的 – ChrisH

0
} else { 
    $result = confirm.php; 

    foreach($_POST as $key => $val){ 
    $input.="<input type='hidden' name='$key' value='$val' />"; 
    } 

    $form = "<form method='post' name='confirm' action='confirm.php'>".$input."</form>"; 
    $script = "<script type='text/javascript'>document.confirm.submit();</script>"; 

    echo $form.$script; 
} 
-2

整個想法是錯誤的。您必須在代碼中修復2個問題。

1.主要的一個。學習正確縮進嵌套代碼塊!

這是不可能讀出這樣一個沒有縮進的醜陋的質量。

2.小一個。

我在這裏看不到確認頁面。你會在那個頁面上做什麼?從哪裏獲取表單值?

看來你必須要麼只使用簡單的Javascript代碼顯示一個確認或存儲輸入的數據爲會話

而且,我不得不說,這顯示一個確認頁面,一個簡單的反饋形式是非常罕見的做法。

所以,我覺得你真的只需要一個表單的動作和唯一能做的ccare正確填寫的表格

<? 
if ($_SERVER['REQUEST_METHOD']=='POST') { 
    $firstname = $_POST['firstname']; 
    $lastname = $_POST['lastname']; 
    $email = $_POST ['email']; 
    $password = $_POST ['password']; 

    $errors = array(); 
    if (empty ($firstname) || empty ($lastname) || empty ($email) || empty ($password)) { 
    $errors [] = "Please complete the form. All fields required."; 
    } 
    if (filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE){ 
    $errors[] = "Please enter a valid email address"; 
    }  
    if (!$errors) { 
    // do whatever you wish to this data 
    // and then redirect to whatever address again 
    // the current one is a default 
    header("Location: ".$_SERVER['PHP_SELF']); 
    exit; 
    } else { 
    // all field values should be escaped according to HTML standard 
    foreach ($_POST as $key => $val) { 
     $form[$key] = htmlspecialchars($val); 
    } 
} else { 
    $form['fiestname'] = $form['lasttname'] = $form['email'] = $form['password'] = ''; 
} 
include 'form.tpl.php'; 
?> 

,而在你有你的表單字段form.tpl.php文件,輸入的數值和條件錯誤信息

<? if ($errors): ?> 
    <? foreach($errors as $e): ?> 
<div class="err"><?=$e?></div> 
    <? endforeach ?> 
<? endif ?> 
<form method="POST"> 
    <input type="text" name="firstname" value=<?=$form['firstname']> 

... and so on 
+0

1)對於醜陋的代碼抱歉 - 這是關於不被用於stackoverflow更多。 2)這是我第一次使用php,所以你的第二點並沒有什麼幫助。 –

+0

大聲笑,當然,這是我的答案,讓你麻煩:) –

+1

當然,以及你最初的答案看起來更有幫助,現在你至少編輯它! 我沒有問題,你發現我的努力可笑 - 我很期待 - 但一個指向正確的方向將是偉大的。 我想使用PHP而不是Javascript,因爲這整個練習是關於我學習一些PHP的 - 如果你有一個關於會話的tut的鏈接,那麼我都是耳朵/眼睛/任何! –

0
empty ($errors) 

的輸出將始終返回空。這就是爲什麼你總是得到: $result = 'confirm.php';

檢查return values here

另外,我不認爲你可以很容易地做到這一點。相反,你爲什麼不創建一個check.php或任何檢查變量/檢查錯誤等,然後做你想做的任何事情(重定向到表單填寫頁面或繼續confirm.php頁面。