Как показать сообщения об обновлении в PHP? - PullRequest
1 голос
/ 16 февраля 2012

Создание простой страницы входа. Если пользователь вводит пароль и подтверждение пароля, которые не совпадают, я хочу сбросить регистрационную форму и напечатать сообщение. В настоящее время сообщение не печатается, а продолжается через скрипт. Это то, что я пробовал, путем установки переменной 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 ]

2 голосов
/ 16 февраля 2012

A die(); или exit; решает проблему.

header('Location: registration.php');
die();
2 голосов
/ 16 февраля 2012

Если вам нужно вывести некоторые данные, а затем, возможно, выбрать перенаправление, вы можете использовать буферизацию вывода.Это приводит к тому, что сгенерированный вами вывод помещается в буфер, а не отправляется пользователю.Если вам нужно перенаправить, это работает, потому что данные еще не отправлены.Если вы не перенаправляете, вы используете то, что находится в буфере, и выводите его, как только скрипт будет выполнен.

См. Эту страницу руководства PHP, чтобы узнать много больше о буферизации вывода PHP:1005 *http://www.php.net/manual/en/intro.outcontrol.php

Кроме того, обратите внимание, что вы вызываете header() дважды, если у вас есть ошибка - второй вызов заголовка с типом 'location' перезапишет первый и отправит вас в index.php.

Пожалуйста, смотрите ответ @ talereader выше - ключ должен определить, что вы находитесь в состоянии ошибки и вызвать заголовок (что вы делаете), а затем немедленно завершить сценарий.

1 голос
/ 16 февраля 2012

Почему бы не сделать всю проверку и установить флаг, если что-то не получается. т. е. $failed = true;, а затем, прежде чем выполнять какую-либо фактическую обработку, выполните if (!$failed) { //process }.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...