如何在PHP中显示更新消息?

时间:2012-02-16 15:51:17

标签: php login

构建简单的登录页面。如果用户输入的密码和密码确认不匹配,我想重置注册表并打印一条消息。目前,消息不打印,而是通过脚本进行。这是我尝试过的,通过在发生错误时设置SESSION变量,并在重新加载时显示此变量:

和registration.php:

<?php
    session_start();
    if (isset($_SESSION['errmsg'])) {
        print($_SESSION['errmsg']);
        unset($_SESSION['errmsg']);
    }
?>

<form name="register" action="register.php" method="post">
    <label>Username</label><input type="text" name="username" maxlength="20" />
    <label>Password</label><input type="password" name="pass" />
    <label>Password Again</label><input type="password" name="pass_confirm" />
    <input type="submit" value="Register" />
</form>

register.php:

<?php
function create_salt() {
    $string = md5(uniqid(rand(), true));
    return substr($string, 0, 3);
}

session_start();
$username = $_POST['username'];
$pass = $_POST['pass'];
$pass_confirm = $_POST['pass_confirm'];

if ($pass != $pass_confirm) {
    $_SESSION['errmsg'] = "Passwords do not match.";
    header('Location: registration.php');
}

if (strlen($username) > 20) {
    header('Location: registration.php');
}

$hash = hash('sha256', $pass);
$salt = create_salt();
$hash = hash('sha256', $salt . $hash);

$conn = mysql_connect('localhost', 'test4', 'test4');
mysql_select_db('test4', $conn);

$username = mysql_real_escape_string($username);

$query = "INSERT INTO users (username, password, salt) VALUES ('$username', '$hash', '$salt');";

mysql_query($query);
mysql_close();
header('Location: index.php');
?>

重要的部分是行if ($pass != $pass_confirm) { ...。目前,如果密码不匹配,则满足此条件,但它将继续通过脚本而不是通过header(Location: registration.php)重新加载。我知道在发送数据后无法调用header(),这可能会导致问题。

如果是这样,有没有更好的方法在PHP中执行此操作,还是应该查看其他选项?

3 个答案:

答案 0 :(得分:2)

如果您需要输出一些数据然后可能选择重定向,则可以使用输出缓冲。这会导致您生成的输出放在缓冲区中而不是发送给用户。如果您需要重定向,它可以工作,因为还没有发送数据。如果不重定向,则在脚本完成后使用缓冲区中的内容并输出。

请参阅此PHP手册页以了解更多关于PHP输出缓冲的 http://www.php.net/manual/en/intro.outcontrol.php

另外,请注意,如果您有错误,则要拨打header()两次 - 第二次使用'location'类型的标头调用将覆盖第一个并发送给index.php。

请参阅@talereader上面的答案 - 关键是要确定你处于错误状态并调用标题(你这样做),然后立即终止脚本。

答案 1 :(得分:2)

die();exit;解决了这个问题。

header('Location: registration.php');
die();

答案 2 :(得分:1)

如果出现问题,为什么不进行所有检查并设置标记。即$failed = true;然后在进行任何实际处理之前if (!$failed) { //process }