PHP успешное выполнение оператора if в новом файле

0

У меня возникают проблемы с моей регистрационной формой, в которой используются PHP и SQL.

Фактический материал базы данных отлично работает. Также сообщается об ошибке. Проблема заключается в успешном завершении формы.

Если вы перейдете сюда и введите плохие данные/нет данных в форму, вы увидите, что сообщение об ошибке возвращается: http://marmiteontoast.co.uk/fyp/login-register/register-form.php

Однако, если вы поместите все поля (длинное имя пользователя, длинный пароль и отметьте галочкой) и нажмите "сделать мою учетную запись", мне нужно, чтобы он перенаправлялся на register-success.php

Независимо от того, что я изменю, утверждение успеха к нему не сработает. Он всегда перенаправляет вас обратно на register-form.php но без сообщений об ошибках.

Это функция регистров со всей проверкой:

    <?php
    session_start();
    require 'functions.php';

    if(isset($_POST['sign-up'])){
    // username
        if (isset($_POST['username'])){
        $username = mysql_real_escape_string(trim($_POST['username']));
        $_SESSION['status']['register']['username'] = $username;

        if(strlen($username) > 3){
            if(strlen($username) < 31){
                if(user_exists($username) === true){
                $_SESSION['status']['register']['error'][] = 'That username is already taken. Sorry, please try again with a different username.';
                } else{
                // passed
                // continue
                }
                } else {
                $_SESSION['status']['register']['error'][] = 'The username is greater than 30 characters.';
                }
                    } else {
                $_SESSION['status']['register']['error'][] = 'The username is less than 3 characters.';
                }
                    } else {
                $_SESSION['status']['register']['error'][] = 'The username is not entered.';}

        if (isset($_POST['password'])){
                $password = mysql_real_escape_string(trim($_POST['password']));
                    if(strlen($password) >= 8){
            $password = hash_function($password);
            } else {
            $_SESSION['status']['register']['error'][] = "Your secret password is too short. You should make a password with at least 8 letters.";
            }} 
else {
            $_SESSION['status']['register']['error'][] = "You haven't put in a password.";}

            // Email address
            if (!empty($_POST['email_address'])){
                $email_address = mysql_real_escape_string(trim($_POST['email_address']));
                $_SESSION['status']['register']['email_address'] = $email_address;
                if(strlen($email_address) > 10){ // email address less than 10
                    if(strlen($email_address) < 161){ // if longer than 160
                                    if(email_valid($email_address) == false){ // email address invalid format
                    $_SESSION['status']['register']['error'][] = "The email address has been put in wrong. Please check and try again.";
                    }
                    else{
                    // passed min length, passed max length, passed validation
                    // Continue
                    }
                    }
                    else 
                    {
                    $_SESSION['status']['register']['error'][] = 'The email address is too long.';}
                    } 
                    else
                    {
                    $_SESSION['status']['register']['error'][] = "The email address is too short. It can't be shorter than 10 letters.";
                    }
            }
            else{// passed (no email input)
            }

            if (isset($_POST['tos'])){
                $_SESSION['status']['register']['tos'] = $_POST['tos'];
                if(empty($_SESSION['status']['register']['error'])){
                    if(register($email_address, $username, $password) === true){

                    // Sends an email
                    send_email($email_address);

                    // Reroutes to success page
                    header('Location: register-success.php');

                    } else {
                    echo mysql_error();
                    die();
                    $_SESSION['status']['register']['error'][] = "Something went wrong. We're sorry. Please try again.";
                    }
                } else 
{
}
            } else {
            $_SESSION['status']['register']['error'][] = "You have to agree to the House Rules to be able to sign up.";
            }

            header('Location: register-form.php');
        } else {
        }

    ?>

Изменение: поскольку правильный ответ не предоставил код, вот он для справок в будущем. Проблема заключалась в конфликтующих перенаправлениях. Итак, теперь есть инструкция wrapper if, чтобы они не конфликтуют.

В раздел "Успех" я добавил проверку для переменной:

if(register($email_address, $username, $password) === true){

                    // Sends an email
                    send_email($email_address);
                    // Reroute to success page
                    $succeeded = true;
                    header('Location: register-success.php');

                }

Затем я только принял окончательное перенаправление, если переменная успеха была ложной.

// If postback needed
        if($succeeded != true){
        header('Location: register-form.php');
        }
  • 0
    Реквизит для обмена сайтом с нами. Я бы пропустил этот вопрос, если бы не смог попробовать сам :)
  • 0
    @DanFarrell не беспокойтесь, я всегда делаю, но я должен сказать, что иногда люди удаляют это, потому что они не думают, что это необходимо. Но я всегда чувствую, что лучше показать это. Вы сами видите, что сообщения об ошибках работают нормально. Вы даже увидите, что если вы введете свою электронную почту и все правильно, вы получите электронное письмо. Но вы никогда не будете перенаправлены на success.php ....
Показать ещё 2 комментария
Теги:
session
error-handling
login

2 ответа

1
Лучший ответ

ОК, поэтому проблема такова:

Блок if(register(...)) срабатывает нормально, но там ничего не прекращается запись header('Location: register-form.php'); на успех. Вы, по сути, переписываете свою первую переадресацию (с успехом) со своей второй (назад к register-form.php)

Возможным решением было бы добавить флаг, который вы бросили на успех, и перенести окончательную переадресацию в if(!$succeeded) или что-то еще. Но все эти блоки, if объединены, подвержены именно этому типу ошибок. Я настоятельно рекомендую вам использовать другую систему. Если бы я писал эту страницу, я бы, вероятно, собирал каждую ошибку в отдельном блоке if, очищая их, если не было ошибки, - и затем на основании того, были ли какие-либо сообщения об ошибках, контролируйте перенаправление в конце. Чем льстнее ваша условная иерархия, тем легче будет ее отлаживать.

  • 0
    Можете ли вы объяснить, как я могу это отладить? Я вижу, что ваша регистрация сработала очень хорошо (marmiteboy), но я не уверен, почему это не проходит тест. Особенно, если вы введете адрес электронной почты тоже ... он передает все данные в БД.
  • 0
    В этом коде также лежит функция отправки по электронной почте. Так что эта функция должна быть запущена, иначе вы не получите электронное письмо.
Показать ещё 4 комментария
0

Хотя я согласен с Дэном в том, что утверждения if должны быть сглажены, что нет причин для его перенаправления. Если функция электронной почты запускается, заголовок должен быть установлен. Проблема не в структуре if. Проблема в том, что он выходит из структуры if и видит header('Location: register-form.php'); Раньше это было:

if(){
   if(){
     // a few more if statements.
     header("Locaiton: register-success.php");
   }else{
     die();
   }
}else{

}
header("Location: register-form.php");

он устанавливал "register-success.php" в качестве местоположения, а затем выполнял остальную часть кода. Затем (когда он вышел из оператора if) увидел Location: register-form.php и перезаписал предыдущее значение, чтобы перейти к успеху. Добавив exit(); вызовите после того, как вы установили местоположение в "register-success", код не перезапишет его. Я также добавил переменную true для вызова заголовка, чтобы установить успех как заголовок и "303". Истина добавлена, поэтому она может фактически перезаписать любое предыдущее значение, которое было установлено для местоположения, и "303" было добавлено из-за того, что было более уместно перенаправить его с кодом HTTP, чтобы see other а не found.

<?php
session_start();
require('functions.php');

if(isset($_POST['sign-up'])){
    /*

        CHECK USERNAME

    */
    if (isset($_POST['username'])){
    $username = mysql_real_escape_string(trim($_POST['username']));
    $_SESSION['status']['register']['username'] = $username;

        if(strlen($username) > 3){
            if(strlen($username) < 31){
                if(user_exists($username) === true){
                $_SESSION['status']['register']['error'][] = 'That username is already taken. Sorry, please try again with a different username.';
                } else{
                    // passed
                    // continue
                }
            } else {
                $_SESSION['status']['register']['error'][] = 'The username is greater than 30 characters.';
            }
        } else {
            $_SESSION['status']['register']['error'][] = 'The username is less than 3 characters.';
        }
    }else{
        $_SESSION['status']['register']['error'][] = 'The username is not entered.';
    }
    /*

        CHECK PASSWORD

    */
    if (isset($_POST['password'])){
        $password = mysql_real_escape_string(trim($_POST['password']));
        if(strlen($password) >= 8){
            $password = hash_function($password);
        }else{
            $_SESSION['status']['register']['error'][] = "Your secret password is too short. You should make a password with at least 8 letters.";
        }
    }else{
        $_SESSION['status']['register']['error'][] = "You haven't put in a password.";
    }
    /*

        CHECK email

    */
    if (!empty($_POST['email_address'])){
        $email_address = mysql_real_escape_string(trim($_POST['email_address']));
        $_SESSION['status']['register']['email_address'] = $email_address;
        if(strlen($email_address) > 10){ // email address less than 10
            if(strlen($email_address) < 161){ // if longer than 160
                if(email_valid($email_address) == false){ // email address invalid format
                    $_SESSION['status']['register']['error'][] = "The email address has been put in wrong. Please check and try again.";
                }else{
                    // passed min length, passed max length, passed validation
                    // Continue
                }
            }else{
                $_SESSION['status']['register']['error'][] = 'The email address is too long.';}
        }else{
            $_SESSION['status']['register']['error'][] = "The email address is too short. It can't be shorter than 10 letters.";
        }
    }else{
        // passed (no email input)
    }
    /*

        CHECK TOS

    */
    if(isset($_POST['tos'])){
        $_SESSION['status']['register']['tos'] = $_POST['tos'];
        if(empty(($_SESSION['status']['register']['error']))){
            if(register($email_address, $username, $password) === true){
                // Sends an email
                send_email($email_address);

                // Reroutes to success page
                header('Location: register-success.php', true, "303");
                exit();
            } else {
                echo mysql_error();
                die();
                $_SESSION['status']['register']['error'][] = "Something went wrong. We're sorry. Please try again.";
            }
        }else{
            // do nothing
        }
    } else {
        $_SESSION['status']['register']['error'][] = "You have to agree to the House Rules to be able to sign up.";
    }
    header('Location: register-form.php');
} else {
    // nothing
}
?>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню