Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 加载时注册表重定向到成功页面_Php_Forms_Validation - Fatal编程技术网

Php 加载时注册表重定向到成功页面

Php 加载时注册表重定向到成功页面,php,forms,validation,Php,Forms,Validation,我将PHP脚本拼凑在一起,学习如何构建注册表单。表单应该获取信息,检查空字段,然后插入数据库,如果成功,则发送电子邮件,然后重定向到成功页面 header('Location: ../thankyou.php?first_name=' . htmlentities($first_name)); 在下面的代码中,它似乎认为页面加载时已经向数据库中输入了一些内容,然后立即重定向到页面加载时的成功页面。我哪里做错了 <?php session_start(); $_SESSION['user'

我将PHP脚本拼凑在一起,学习如何构建注册表单。表单应该获取信息,检查空字段,然后插入数据库,如果成功,则发送电子邮件,然后重定向到成功页面

header('Location: ../thankyou.php?first_name=' . htmlentities($first_name));
在下面的代码中,它似乎认为页面加载时已经向数据库中输入了一些内容,然后立即重定向到页面加载时的成功页面。我哪里做错了

<?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 = 'hello@dontblame.co';//<== 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;
  }
}

?>

整个东西需要在后期检查中包装:

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
您只需要将验证代码包装在其中。在执行此操作之前,它将始终在加载时插入一个空行,因为不存在任何条件

此外,您的验证代码似乎不完整。它创建了一个带有错误消息的变量
$pass\u err
,但您从未对它做过任何操作


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

一旦您到达代码中的
头()
函数,您将自动转到“成功”页面

header('Location: ../thankyou.php?first_name=' . htmlentities($first_name));
该代码告诉php直接进入thankyou.php页面并退出其余代码。 一个简单的解决方案是在重定向之前检查是否已提交表单

祝你好运

编辑:

如果您的问题是电子邮件没有发送出去,您需要将电子邮件发送放在标题之前。Header在到达该行时立即退出代码,前提是Header尚未发送。有关标题函数的更多信息,请参见几个错误:

1)第一个
如果($\u服务器['REQUEST\u METHOD']='POST'){
应该覆盖所有内容,或者更好

if ($_SERVER['REQUEST_METHOD'] != 'POST') { ...redirect somewhere...}
编辑:不同之处在于,您的版本要求您“一路记住”上述条件。如果您遵循“提前退出”的想法,您阅读的代码将在到达后立即执行。这使得阅读和维护更容易。(还有其他因素,如降低成本,但现在请忽略。)

2)sql查询将始终工作并返回结果,因此,如果输入了所有内容,则无法进行控制。原因是,如果没有给出$\u POST['email'],则$email可能为空

$email = mysql_real_escape_string($_POST['email']);
因此,查询只需插入一个空的电子邮件地址,不会出错。(除非您将该字段设置为唯一,但这是另一回事。)

编辑:如果您使用PhpMyAdmin(除非您知道MySQL的输入和输出),请转到表的结构,并添加一个类型为unique的索引(用字母u表示)。或者,您可以向下滚动到“Indes”,然后单击add index(语法基本上是ALTER table,但现在对于graphicalinterface是gor)


3)如果isInjected()函数返回true,脚本将以“don't spam”退出消息。不过,您已经设置了位置标头,这样就永远不会看到“请勿垃圾邮件”。

如果第一个
关闭得太早,它应该覆盖处理db插入的所有代码,这将解决问题。谢谢!这似乎已经修复了它!关于错误,我只是让它们打印在表单字段下如果它们是空的。我应该做些不同的事情吗?@JonTaggart是的,你需要在另一个检查中包装处理代码,如果输入无效,这将阻止向数据库插入空行。你能为我指出第二个检查的正确方向吗?现在如果你单击表单上的提交,它会显示错误t还通过一封空白电子邮件插入一封新的插入。现在发生的是,如果我单击“提交”,我会得到相应的错误,但它仍然会将一封空白电子邮件插入数据库。我一直在搜索,但还没有找到防止这种情况发生的解决方案。1.谢谢Zsolt。这解决了它。你能解释2 if语句之间的区别吗?2.b是什么如何确保它是唯一的并且在数据库中不存在?欢迎使用Stack overflow。我相应地编辑了我的答案。(请记住向上投票并接受有用的答案,以便为具有相同问题的其他开发人员标记它们。)1.当我切换第一个if语句时,它再次破坏了一切。
2.谢谢。我在PHPMyAdmin中更改了它(它不允许我投票),一切似乎都正常,除非我点击submit时没有填写任何内容,否则我会收到错误,但它仍在将一封空白电子邮件插入数据库。。。