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