0

我一直在尝试在不使用 url 的情况下进行表单验证。所以我想我会在我的表单中创建一个隐藏字段并将其发送到我的验证 php 脚本。我希望我能够做的是将表单中的任何错误设置到这个隐藏字段并将其返回。但是,一旦我离开范围,它就会破坏我设置的任何内容。我认为 $_POST 具有全球范围?也许我声明我将隐藏字段设置错了?我把代码放在下面。

<?php
    include_once $_SERVER['DOCUMENT_ROOT'].'/poles/config/databaseConnect.php';
    include_once $_SERVER['DOCUMENT_ROOT'].'/poles/config/functions.php';
    include_once $_SERVER['DOCUMENT_ROOT'].'/poles/models/users.php';
    include_once $_SERVER['DOCUMENT_ROOT'].'/poles/models/userDetails.php';

    //get the refering url to be used to redirect
    $refUrl = $_SERVER['HTTP_REFERER'];

    if(isset($_POST['register'])){
        //declare a temp error array
        $tempError;

        //check if the form is empty
        if(empty($_POST['Email'])&&empty($_POST['Email Confirmation'])&&empty($_POST['Password'])&&empty($_POST['Password Confirmation'])
        &&empty($_POST['Stage Name'])&&empty($_POST['Main Club'])){
            $tempError = 'Please fill in the form.';
        }else{
            //set variables
        }

        if(!empty($tempError)){
            //start a session to declare session errors
            $_POST['errors'] = $tempError;
            //redirect back to referring url
            header('Location:'.$refUrl);
            exit();
        }else{
            //log user in and redirect to member home page
        }

    }

基本表单(我排除了输入字段,因为它真的很长)

 <div class="col-md-6 well">
          <span class="jsError"></span><?php if(isset($_POST['errors'])){ $errors = $_POST['errors']; } if(!empty($errors)){ echo '<p class="alert alert-danger text-center">'.$errors.'</p>'; } ?>
          <form class="form-horizontal" role="form" method="post" action="controllers/registrationController.php" id="registration">
            <input type="hidden" name="errors" value="<?php if(isset($_POST['errors'])){echo $_POST['errors']; } ?>">
            </form>

我也研究过使用 $_SESSION 变量方法,但我发现的东西要么有点复杂,要么让我在任何地方开始一大堆会话(在我看来会让我的代码变得混乱)。

4

2 回答 2

1

$_POST 由浏览器传递给服务器的数据内容填充。当您发送Location标头时,它会导致浏览器加载新页面,但由于它没有表单数据,因此不会传递任何内容。

如果您需要在页面之间传递数据,那么 $_SESSION 是要走的路。所需要的只是session_start()在需要访问的页面顶部,您可以$_POST像这样存储数据:

$_SESSION['postdata'] = $_POST;

检索它变成

$email = $_SESSION['post']['Email'];

另一种方法是将数据回显为隐藏<input>在新表单中,但这需要提交新表单,我觉得您想要无缝的东西。

另请注意,不保证 $_SERVER['HTTP_REFERER'] 准确,甚至不存在。你不应该依赖它来生产代码。在您的测试设置中,它可能适用于您的浏览器,但这并不能保证它适用于其他浏览器。寻找另一种方式。

于 2013-11-05T00:36:07.300 回答
1

您可以通过使用 javascript 而不是重定向来实现此目的,但通过重定向传递数据的唯一方法是通过 URL、会话或 cookie。

$_POST['errors'] = $tempError;
//redirect back to referring url

?>
<html><head><title></title></head><body>
<form id="temp_form">
<?php
foreach($_POST as $k=>$v) {
?><input type="hidden" name="<?php echo htmlentities($k); ?>" value="<?php echo htmlentities($v); ?>" /><?php 
}
?>
</form>
<script type="text/javascript">
    setTimeout(function() { document.getElementById('temp_form').submit(); },100);
</script>
</body>
</html>
<?php
    die();
于 2013-11-05T00:41:27.737 回答