我正在拼凑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 = '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;
}
}
?>
答案 0 :(得分:1)
几个错误:
1)第一个if ($_SERVER['REQUEST_METHOD'] == 'POST') {
应涵盖所有内容,或更好,
if ($_SERVER['REQUEST_METHOD'] != 'POST') { ...redirect somewhere...}
编辑:区别在于您的版本要求您记住上述条件的“一直向下”。如果您遵循“早退”的想法,您阅读的代码将在您到达后执行。这使得阅读和维护更容易。 (还有其他因素,如减少cyclomatic complexity,但暂时忽略它。)
2) sql查询将始终有效并返回结果,因此如果输入了所有内容,则无法控制。原因是如果没有给出$ _POST ['email'],$ email可以为空
$email = mysql_real_escape_string($_POST['email']);
所以查询只会插入一个空的电子邮件地址而不会出错。 (除非你将该字段设置为唯一,但这是另一个故事。)
编辑:如果你使用PhpMyAdmin(除非你知道MySQL进出,否则你应该这样做),转到表的结构,并添加一个唯一类型的索引(用字母u表示)。或者,您可以向下滚动到“indeces”,然后单击“添加索引”。 (语法基本上是ALTER TABLE,但现在是图形界面的gor。)。
3)如果isInjected()函数返回true,则脚本将以“不垃圾邮件”消息退出。但是,您已经设置了一个Location-header,以便永远不会看到垃圾邮件。
答案 1 :(得分:0)
整件事需要在邮政检查中包装:
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
您只有包含验证码。在你这样做之前,它总是在加载时插入一个空行,因为没有条件。
此外,您的验证码似乎不完整。它会创建一个带有错误消息的变量$pass_err
但是你永远不会对它做任何事情。
您需要移动电子邮件发送代码,以便在重定向之前执行。目前它在重定向之后执行,这是一个问题,因为执行可能并不总是到达那一点(一旦浏览器收到重定向头,它将与服务器断开连接,这将反过来停止PHP执行。)
答案 2 :(得分:0)
只要您在代码中找到header()
功能,就会自动转到您的成功页面。
header('Location: ../thankyou.php?first_name=' . htmlentities($first_name));
该代码告诉php直接进入你的thankyou.php页面并退出其余的代码。 一个简单的解决方案是在重定向之前检查您是否已提交表单。
祝你好运
编辑:
如果问题在于电子邮件没有发送出去,您需要将电子邮件发送到标题之前。假设标题尚未发送,标题会在到达该行时立即退出代码。有关标题函数的更多信息,请参阅phps header()