У меня возникают проблемы с моей регистрационной формой, в которой используются 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');
}
ОК, поэтому проблема такова:
Блок if(register(...))
срабатывает нормально, но там ничего не прекращается запись header('Location: register-form.php');
на успех. Вы, по сути, переписываете свою первую переадресацию (с успехом) со своей второй (назад к register-form.php
)
Возможным решением было бы добавить флаг, который вы бросили на успех, и перенести окончательную переадресацию в if(!$succeeded)
или что-то еще. Но все эти блоки, if
объединены, подвержены именно этому типу ошибок. Я настоятельно рекомендую вам использовать другую систему. Если бы я писал эту страницу, я бы, вероятно, собирал каждую ошибку в отдельном блоке if, очищая их, если не было ошибки, - и затем на основании того, были ли какие-либо сообщения об ошибках, контролируйте перенаправление в конце. Чем льстнее ваша условная иерархия, тем легче будет ее отлаживать.
Хотя я согласен с Дэном в том, что утверждения 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
}
?>