2013-06-04 49 views
0

我将PHP脚本拼凑在一起以了解如何构建注册表单。该表格应该接受信息,检查空字段,然后插入数据库,如果成功地发出电子邮件,然后重定向到成功页面。注册表单重定向到加载成功页面

下面的代码似乎认为在页面加载时,某些内容已经输入到数据库中,然后在页面加载时立即重定向到成功页面。我哪里错了?

<?php 
session_start(); 
$_SESSION['user'] = $user; 

if ($_SERVER['REQUEST_METHOD'] == 'POST') { 

if(empty($_POST["first_name"])) 
{ 
    $first_name_err = "<p>What is your first name?</p>"; 
} 
if(empty($_POST["last_name"])) 
{ 
    $last_name_err = "<p>What is your last name?</p>"; 
} 
//checks email 
if(empty($_POST["email"])) 
{ 
    $email_err = "<p>What is your email address?</p>"; 
} 
if(empty($_POST["phone"])) 
{ 
    $phone_err = "<p>What is your phone number?</p>"; 
} 
    if(empty($_POST["password"])) 
{ 
    $pass_err = "<p>Please enter your password</p>"; 
} 

} 

require_once('includes/db_connect.php'); 

// Get values from form 
$first_name = mysql_real_escape_string($_POST['first_name']); 
$last_name = mysql_real_escape_string($_POST['last_name']);  
$email = mysql_real_escape_string($_POST['email']); 
$phone = mysql_real_escape_string($_POST['phone']); 
$password = mysql_real_escape_string($_POST['password']); 


// Insert data into mysql 
$sql="INSERT INTO dontblame (first_name, last_name, email, phone, password, reg_date) 
VALUES ('$first_name', '$last_name', '$email', '$phone', SHA1('$password'), NOW())"; 
$result = mysql_query($sql); 

// if successfully insert data into database, displays message "Successful". 
if($result){ 
//Send to Success Page 
header('Location: ../thankyou.php?first_name=' . htmlentities($first_name)); 
    } 
else { 
    echo "ERROR there was a problem with the registration form. Please try again."; 
    } 
    // close mysql 
    mysql_close(); 

if(IsInjected($email)) 
{ 
    echo "Please don't SPAM."; 
    exit; 
} 

$email_from = '[email protected]';//<== update the email address 
$email_subject = "Welcome to Jon's First Registration Form"; 
$email_body = "Hi, $first_name,\n". 
    "\n Welcome to Jon's First Registration Form! Below is your login information: \n\n Username: $email \n Password: $password \r\n". 

$to = "$email";//<== update the email address 
$headers = "From: $email_from \r\n"; 
$headers .= "Reply-To: $email_from \r\n"; 
//Send the email! 
mail($to,$email_subject,$email_body,$headers); 
//done. redirect to thank-you page. 

// Function to validate against any email injection attempts 
function IsInjected($str){ 
    $injections = array('(\n+)', 
       '(\r+)', 
       '(\t+)', 
       '(%0A+)', 
       '(%0D+)', 
       '(%08+)', 
       '(%09+)' 
      ); 
    $inject = join('|', $injections); 
    $inject = "/$inject/i"; 
    if(preg_match($inject,$str)) 
    { 
    return true; 
    } 
    else 
    { 
    return false; 
    } 
} 

?> 
+1

你的第一个'if'关闭得太快了,它应该跨越所有处理db插入的代码,这将在那里解决它 –

回答

1

几个错误:

1)第一if ($_SERVER['REQUEST_METHOD'] == 'POST') {应涵盖一切,或者更好,

if ($_SERVER['REQUEST_METHOD'] != 'POST') { ...redirect somewhere...} 

编辑:不同的是,你的版本要求你记住上面的条件“一路下来”。如果你按照“退出早期”的想法,你读到的代码将在你到达那里后执行。这使得它更易于阅读和维护。 (还有其他一些因素,如降低cyclomatic complexity,但忽略了现在。)

2) SQL查询将总是工作并返回结果,因此不存在控制研究如果输入的一切。其原因是,如果没有$ _ POST [“电子邮件”]给出

$email = mysql_real_escape_string($_POST['email']); 

所以查询将简单地插入一个空的电子邮件地址没有错误$电子邮件可以是空的。(除非你设置这个字段是唯一的,但这是另一回事。)

编辑:如果你使用PhpMyAdmin(你应该除非你知道MySQL进出),转到表的结构,并添加一个索引独特类型(由字母u表示)。或者,您可以向下滚动到“indeces”,然后单击添加索引。 (语法基本上是一个ALTER TABLE,但现在是图形界面的gor)。

3)如果isInjected()函数返回true,脚本将以“不发送垃圾邮件”消息退出。如何,你已经设置了位置标题,这样就不会看到垃圾邮件。

+0

1.谢谢Zsolt。这固定了它。你能解释2 if语句之间的区别吗? 2.确保它是唯一的并且不存在于db中的最佳方法是什么? – tonjaggart

+0

欢迎使用堆栈溢出。 **我相应地编辑了我的答案。**(请记住要加注并接受有帮助的答案,以便为具有相同问题的开发人员标记它们。) –

+0

1.当我切换第一个if语句时,它再次破坏了所有内容。
2.谢谢。我改变了PHPMyAdmin(它不会让我upvote) – tonjaggart

0

整个事情需要包装在后检查:

if ($_SERVER['REQUEST_METHOD'] == 'POST') { 

你只需要包裹在验证代码。在你这样做之前,它总会在负载中插入一个空行,因为没有条件。

此外,您的验证码看起来不完整。它会创建一个带有错误消息的变量$pass_err,但是您从不会对其执行任何操作。

您需要移动您的电子邮件发送代码,以便它在重定向之前执行。目前它在重定向之后执行,这是一个问题,因为执行可能并不总是到达那一点(只要浏览器接收到重定向头,它将与服务器断开连接,并且这将继而停止PHP执行)。

+0

谢谢!这似乎修复了它!关于错误,我只是让他们打印在表单域下,如果他们是空白的。我应该做一些不同的事情吗? – tonjaggart

+0

@JonTaggart是的,你需要将处理代码封装在另一个检查中,这将防止在数据库中插入空行,如果输入无效。 – MrCode

+0

你能否指出我在正确的方向进行二次检查?现在,如果您单击表单上的“提交”,它将显示错误,但也会带有空白电子邮件的新插入。 – tonjaggart

0

只要在代码中获得header()函数,就会自动进入成功页面。

header('Location: ../thankyou.php?first_name=' . htmlentities($first_name)); 

该代码告诉php直接转到您的thankyou.php页面并退出其余代码。 一个简单的解决方案是检查您是否在重定向之前提交了表单。

好运

编辑:

如果你的问题是与电子邮件没有被发送出去,你需要把你的邮件头之前发送。如果头部尚未发送,头部会尽快退出代码。关于这里更多信息标题功能看phps header()

相关问题