1

这有点难以解释。使用图片可能会有所帮助!

1.用户提交表单,简单。


2.正在设置会话,并显示已设置的会话变量。


3.如果用户输入验证码错误或输入正确并继续到下一页,则inp_nameinp_usernameinp_email会话值将消失。inp_password值仍然存在(但在设置会话值时,它正在被加密,md5()。

表格:

<form action="./" method="post" class="form-300">

    <div class="title top">Full Name</div>
    <input type="text" name="name" value="<?=$_POST['name'] ?>" />

    <div class="title top">Username</div>
    <input type="text" name="username" value="<?=$_POST['username'] ?>" />

    <div class="title top">Email</div>
    <input type="text" name="email" value="<?=$_POST['email'] ?>" />

    <div class="title top">Password</div>
    <input type="password" name="password" />

    <input type="submit" name="submit" value="Sign Up" />
    <div class="tc">By clicking Sign Up, you agree to the Terms of Use, Privacy Policy and that you are or over the age of 13.</div>
    <span class="sep-text">or</span>
    <a href="./?action=fb" class="btn-300 btn-fb">Sign Up using Facebook</a>
    <br /><br /><br />
</form>

验证码:

<?php ob_start(); if(session_id() != 'uv241112'){
session_name("uv241112"); session_start();
    $_SESSION['inp_isset'] = "eAK28";
    $_SESSION['inp_name'] = $_POST['name'];
    $_SESSION['inp_username'] = $_POST['username'];
    $_SESSION['inp_email'] = $_POST['email'];
    $_SESSION['inp_password'] = md5($_POST['password']);
}else{ session_name("uv241112"); session_start(); } ?>
        <form action="./" method="post">
        <?php

        require_once('../resources/recaptchalib.php'); $publickey = "xxxxxxxxxx"; $privatekey = "xxxxxxxxxxxxxx";

        # the response from reCAPTCHA
        $resp = null;
        # the error code from reCAPTCHA, if any
        $error = null;

        if ($_POST["submit_recaptcha"]) {
                $resp = recaptcha_check_answer ($privatekey,
                                                $_SERVER["REMOTE_ADDR"],
                                                $_POST["recaptcha_challenge_field"],
                                                $_POST["recaptcha_response_field"]);

                if ($resp->is_valid) {
                        echo "You got it!";
                } else {
                        ?><div class="alert alert-error alert-440">Sorry, the text you entered was incorrect.</div><?php
                        # set the error code so that we can display it
                        $error = $resp->error;
                }
        }
        echo recaptcha_get_html($publickey, $error);
        ?>
            <br/>
            <input type="submit" name="submit_recaptcha" value="Check" class="btn-300 btn-green" />
            </form>

            <?php echo $_SESSION['inp_name']; ?>
            <?php echo $_SESSION['inp_username']; ?>
            <?php echo $_SESSION['inp_email']; ?>
            <?php echo $_SESSION['inp_password']; ?>

<?php ob_flush(); ?>
4

4 回答 4

1

我认为您正在以错误的方式检查表单提交。您不应该看到会话名称是否存在。事实上,在每种情况下,您都应该已经开始了会话。

Session_start() 应该是每个页面上的第一件事。

至于您的帖子值,您应该验证并使用隐藏的表单值来确定他们提交的页面。例如:

<form method="post">
<input type="text" name="email">
<input type="hidden" name="emailpage" value="1">
<input type="submit" name="send" value="send">
</form>

然后检查表格

<?php
    Session_start();
    If (!empty($_POST['emailpage'])) {
        // do variable validation
        $_SESSION['email'] = $validatedemail;
    }

不需要条件语句 session_start。也可能不需要设置会话名称。

发布的代码是从手机发布的示例代码,因此可能存在问题。

于 2013-01-13T07:23:40.510 回答
0

代码的实际问题是您根据 POST 值在页面顶部设置会话变量。第一次提交后,它可以工作,但第二次提交时您不会再次发布这些值,因此将会话变量设置为空。(密码仍然显示,因为它是空行的 MD5。如果您比较 MD5 值,您会看到它们不同以确认)

从评论中引用我自己的话,让那些不想在再次投票之前阅读它们的人

为了更容易看到要更改的内容...

$_SESSION['inp_isset'] = "eAK28";
$_SESSION['inp_name'] = $_POST['name'];
$_SESSION['inp_username'] = $_POST['username'];
$_SESSION['inp_email'] = $_POST['email'];
$_SESSION['inp_password'] = md5($_POST['password']);

至:

if(isset($_POST['username']) {
    $_SESSION['inp_isset'] = "eAK28";
    $_SESSION['inp_name'] = $_POST['name'];
    $_SESSION['inp_username'] = $_POST['username'];
    $_SESSION['inp_email'] = $_POST['email'];
    $_SESSION['inp_password'] = md5($_POST['password']);
}

这将是一个有点粗略的例子,但这只是因为代码确实需要清理一下。^^

于 2013-01-13T06:59:32.243 回答
0

关于 session_id 和 session_name 的问题。我注意到您在会话开始之前设置了 session_name 。我想知道你为什么要测试 session_id 而不是 session_name?

--> ... if(session_id() != 'uv241112'){
                    session_name("uv241112"); ...

也许应该是

--> ... if(session_name() != 'uv241112'){
                    session_name("uv241112"); ...
于 2013-01-13T06:39:44.047 回答
-1

我重新编码了文件,清理了很多,它没有工作。但是我将以下代码放在一个新文件中,并在提交表单后转到它。有效。因此,如果有意义的话,我将处理新文件。感谢大家的帮助,非常感谢。

session_name("uv241112"); session_start();
echo $_SESSION['inp_name'];
echo $_SESSION['inp_username'];
echo $_SESSION['inp_email'];
echo $_SESSION['inp_password'];
于 2013-01-13T07:38:58.860 回答