构建简单的登录页面。如果用户输入的密码和密码确认不匹配,我想重置注册表并打印一条消息。目前,消息不打印,而是通过脚本进行。这是我尝试过的,通过在发生错误时设置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中执行此操作,还是应该查看其他选项?
答案 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 }
。