2011-09-30 23 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页面。