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

如何在PHP中显示更新消息?,php,login,Php,Login,构建一个简单的登录页面。如果用户键入的密码和密码确认不匹配,我想重置注册表并打印一条消息。目前,消息不会打印,而是通过脚本进行。这就是我所尝试的,通过在错误发生时设置会话变量,并在重新加载时显示此变量: registration.php: <?php session_start(); if (isset($_SESSION['errmsg'])) { print($_SESSION['errmsg']); unset($_SESSION['e

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

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');
?>
如果$pass!=$pass_confirm{…当前,如果密码不匹配,则满足此条件,但它将通过脚本进行,而不是通过headerLocation:registration.php重新加载。我知道发送数据后无法调用header,这可能是导致问题的原因

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

如果是这样,有没有更好的方法在PHP中实现这一点,或者我应该考虑其他方法?

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

有关PHP输出缓冲的更多信息,请参见本PHP手册页面:

另外,请注意,如果出现错误,您将调用两次header—第二个“location”类型的header调用将覆盖第一个header调用,并将您发送到index.php


请参阅上面@TalerReader的答案-关键是确定您处于错误状态,并调用您执行的标题,然后立即终止脚本。

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

有关PHP输出缓冲的更多信息,请参见本PHP手册页面:

另外,请注意,如果出现错误,您将调用两次header—第二个“location”类型的header调用将覆盖第一个header调用,并将您发送到index.php


请参阅上面@talereader的答案-关键是确定您处于错误状态,并调用您执行的标题,然后立即终止脚本。

为什么不进行所有检查并设置一个标志(如果某项操作失败)。即$failed=true;然后在执行任何实际处理之前,执行if!$failed{//process}.

为什么不进行所有检查,并在某项操作失败时设置一个标志。例如$failed=true;然后在执行任何实际处理之前,请执行if!$failed{//process}。

一个骰子;或退出;解决问题

header('Location: registration.php');
die();
模具;或出口;解决问题

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

你能进一步解释一下吗?我很困惑,因为如果两个密码不匹配,标题'Location:registration.php';不会被调用,脚本会继续,即使我取出会话变量代码。为什么它不想返回registration.php?@talereader有它-你的脚本设置了标题重定向到registration.php,但是然后脚本也重定向到index.php,这会覆盖第一个重定向。默认情况下,头调用会替换类似的头调用,除非您将第二个参数指定为false。更重要的想法是,如果您希望结束脚本并在另一个地址启动另一个带有头的脚本,则需要在那里结束当前脚本使用类似于die的东西。否则第一个脚本不知道您希望它停止执行。您能进一步解释一下吗?我很困惑,因为如果两个密码不匹配,则不会调用标题“Location:registration.php”;并且脚本会继续,即使我取出会话变量代码。为什么它不想返回registration.php?@talereader有它-您的脚本正在设置头重定向到registration.php,但随后脚本也重定向到index.php,这覆盖了第一个重定向。头调用默认情况下会替换类似的头调用,除非您将第二个参数指定为false。更大的想法是,如果您想结束脚本然后在另一个地址用头启动另一个,你需要在那里用die之类的东西结束当前脚本。否则第一个脚本不知道你想让它停止执行。所以头只能在脚本的结尾被调用?不,头可以在任何地方被调用,但你可以用另一个头覆盖一个头。另外,你也可以使用pr如果页面输出已经开始,则输出标题会出现问题。因此,只能在脚本末尾调用标题?不,可以在任何地方调用标题,但可以用另一个标题覆盖一个标题。此外,如果页面输出已经开始,则输出标题可能会出现问题。如果在脚本中也有标记,则代码应该可以运行主旨
在这些标记之外没有其他数据。您是否在PHP中启用了错误输出?这个脚本会产生任何错误吗?对不起,我在上面列出了这些错误。现在编辑。是的,register.php中有php标记。如果register.php中也有标记,并且这些标记之外没有其他数据,那么代码应该可以工作。您是否在PHP中启用了错误输出?这个脚本会产生任何错误吗?对不起,我在上面列出了这些错误。现在编辑。是的,register.php中有php标记。我想你不知道为什么或者这是否是一个“健康”的解决方案?谢谢是的,这是一个健康的解决方案。而且headerLocation行为预期不会结束脚本-它只是写入头。脚本将继续,直到您告诉它停止。当脚本结束时,标题被发送到浏览器并指示其重定向。我想你不知道为什么或者这是否是一个“健康”的解决方案?谢谢是的,这是一个健康的解决方案。而且headerLocation行为预期不会结束脚本-它只是写入头。脚本将继续,直到您告诉它停止。脚本结束时,标题将发送到浏览器并指示其重定向。