我在使用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 {
}
?>
编辑:由于正确答案没有提供代码,因此这里供以后引用。问题是重定向冲突。因此,现在有一个包装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');
}
然后,只有成功变量为false时,我才执行最终重定向。
// 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块中,如果没有错误,则将它们清除-然后根据是否有任何错误消息,在最后控制重定向。条件层次结构越扁平,调试起来就越容易。
关于php - PHP成功将if语句传递到新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22585551/