为什么这个PHP代码不起作用?如何编写两个电子邮件相同的确认?

时间:2013-11-19 02:33:03

标签: php html forms email

我正在尝试为我正在构建的网站制作表单。我对编码很新,但我之前已经完成了一些简单的网站,并且对网络编码有非常基本的了解。我有两个问题。 1)我正在尝试对此表单进行编码,以便如果两个电子邮件字段不匹配,则会以某种方式显示一条消息,通知查看者。 2)发送按钮将在电子邮件中发送信息但两个部分不起作用:复选框数组不起作用(它只说“数组”,我希望它用逗号分隔的值),我不知道如何将其重定向到单独的成功页面(即contact_success.html)。单独给我答案很好,但是如果你能告诉我为什么你使用特定代码那就太棒了。

以下是整个表单的HTML代码:

<form name="contact" action="contactProcess.php" method="post" onSubmit="return validateForm()">
<table  width="100%" cellspacing="6">
    <tr>
        <th width="30%" class="th_contact">*Name:</th>
        <td width="70%"><input type="text" size="50" name="name"></td>
    </tr>
    <tr>
       <th class="th_contact">*Your email  address:</th>
       <td><input type="text" size="50" name="email"></td>
   </tr>
   <tr>
       <th class="th_contact">*Confirm email  address:</th>
       <td><input type="text" size="50" name="email2"></td>
   </tr>
   <tr>
       <th class="th_contact">How did you hear about us?</th>
       <td><input type="radio" name="referral" value="friend or family">Friend or Family<br />
       <input type="radio" name="referral" value="veterinarian">Veterinarian<br />
       <input type="radio" name="referral" value="flyer or mailer">Flyer or Mailer<br />
       <input type="radio" name="referral" value="humane society or similar facility">Humane     Society or Similar Facility<br />
       <input type="radio" name="referral" value="walked or drove by">Walked or Drove By<br />
       <input type="radio" name="referral" value="other">Other<br />
       </td>
   </tr>
   <tr>
       <th valign="top"><h5>What type of pet do you have?</h5></th>
       <td><input type="checkbox" name="pet[]" value="dog">Dog<br />
       <input type="checkbox" name="pet[]" value="cat">Cat<br />
       <input type="checkbox" name="pet[]" value="bird">Bird<br />
       <input type="checkbox" name="pet[]" value="fish">Fish<br />
       <input type="checkbox" name="pet[]" value="reptile">Reptile<br />
       <input type="checkbox" name="pet[]" value="small animal">Small Animal<br />
       </td>
   </tr>
       <td  align="left"><input type="submit"  class="button" value="submit">
       *Required  Fields</td>
   </tr>
</table>
</form>

这是PHP:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     <title>Contact PHP</title>
     <link href="A4P.css" rel="stylesheet" type="text/css" />
</head>

<body>
<?php {
//Set up message body
$message = "Form Submitted on: " . date("m/d/y") . "\n";
$message .= "\n";
$message .= "Name: " . $_POST['name'] . "\n";
$message .= "Email Address: " . $_POST['email'] . "\n\n";
$message .= "Referred by: " . stripslashes($_POST['referral']) . "\n";
$message .= "Pets: " . $_POST['pet'];


//Set up email
$to = "example@example.com, <" . $_POST['email'] . ">";
$subject = "New Email Club Entry";
$headers = "From: " . "All 4 Pets Website";

//Send email
mail($to,$subject,$message,$headers);

}
?>

</body>
</html>

以下是电子邮件的重要性:

表格提交日期:11/18/13

姓名:布拉德摩尔 电子邮件地址:123@yahoo.com

提及者:走路或开车 宠物:数组

4 个答案:

答案 0 :(得分:1)

  1. if ($_POST['email'] != $_POST['email2'])
    {
        //alert user
    }
    
  2. 不能像字符串一样转出数组。复选框的HTML应该是name =“pets”而不是“pets []”我相信。

    $str = implode(" , " , $_POST['pets']);
    
        //now it's a string
    

答案 1 :(得分:0)

您正在寻找的是验证您的代码。此链接将提供验证代码所需的详细信息,无论您选择在同一页面上验证还是在不同页面上验证都取决于您。如果您对此有更多疑问,请评论此答案。

http://www.w3schools.com/php/php_form_validation.asp

在同一页面上进行验证意味着您需要检查是否首次按下提交按钮,即

if(isset($_POST['button'])) {
    //your code here
}

然后你想检查帖子中的电子邮件是否相同:

if(isset($_POST['button'])) {
    if($_POST['email1'] != $_POST['email2']{
        //do yourself a favor and use an array to store the errors in
    }
    else{
        //you can choose to let the user know that it was a success or nothing at all.
    }
}

验证您的PHP代码可以让您检查以确保用户正在执行您最终希望他们执行的操作。如果你没有验证,从技术上讲,提交按钮是“发布”但实际上没有做任何事情,而不是事后要求的功能。将验证代码放在标签上方的新标签集中,或者简单地放在您已编写的所有代码之下。除此之外,如果您在同一页面上进行验证,则需要将标记更改为:

<form action="" method="post">

通过这种方式,它知道在同一页面上进行验证,而您不会选择在另一个页面上进行验证。

答案 2 :(得分:0)

要检查两个变量是否匹配,只需使用if语句:

if($_POST['email1']==$_POST['email2']) {
    //emails match, continue with form submission
} else {
    //emails do not match, show error
}

要显示选中的复选框,请使用此代码将值放入单个字符串中。

$checked = implode(" , ", $_POST['pets']);
//$checked would be values of selected checkboxes, each separated by a comma

要在成功提交后重定向到页面,请使用以下代码:

header("Location: success.html");

您应该进行验证并清理您的输入,但这是您要求的。 :)

答案 3 :(得分:0)

<强> 1) 由于您已在表单中进行validateForm()调用,因此我假设您要使用JavaScript检查邮件地址。

首先你应该改变你的形式:

onsubmit="return validateForm(email.value, email2.value);"

在JavaScript代码中,您可以简单地创建一个这样的函数:

function validateForm(email1, email2) {
    return 0 == email1.localeCompare(email2);
}

也许您还想检查电子邮件字段是否为空或者您的宠物是否正确选择 - 所有这些检查也可以在该功能中实施。

(另见Optimum way to compare strings in Javascript?

<强> 2)

A)

要有逗号分隔的宠物列表,请尝试PHP内爆方法:

$message .= "Pets: " . implode(", ", $_POST['pet']);

这里的问题是你直接打印数组,而不是它的值。使用implode,您可以获取所有值,在它们之间添加,并从中形成一个字符串。

如何打印所有值并不是那么重要,但是数组之间的概念和它的值之间的概念很重要。也许你应该尝试print($_POST['pet']);print_r($_POST['pet'])来看看差异。并阅读有关这些功能的PHP文档。

b)中

重定向有点棘手。您可以使用这样的html-redirect:

<meta http-equiv="refresh" content="0; url=http://example.com/" />

0是重新连接http://example.com/之前的时间(以秒为单位)。

(另见Redirect from an HTML page

但是您可能要先检查表单并确保在重定向之前发送电子邮件。这应该通过发送新标题来完成。

header("Location: http://example.com/");

这里的问题是必须在发生任何输出之前发送标题信息。

(另见How to fix "Headers already sent" error in PHP

要在您的示例中实现此目的,您只需删除邮件创建周围的HTML部分即可。然后,您只需将表单提交至contactProcess.php,然后从该页面提交至contact_success.html。

<?php
    //Set up message body
    $message = "Form Submitted on: " . date("m/d/y") . "\n";
    $message .= "\n";
    $message .= "Name: " . $_POST['name'] . "\n";
    $message .= "Email Address: " . $_POST['email'] . "\n\n";
    $message .= "Referred by: " . stripslashes($_POST['referral']) . "\n";
    $message .= "Pets: " . implode(", ", $_POST['pet']);


    //Set up email
    $to = "\"Some person\" <example@example.com>, \"" . $_POST['name'] . "\" <" . $_POST['email'] . ">";
    $subject = "New Email Club Entry";
    $headers = "From: " . "\"All 4 Pets Website\" <all4pets@example.com>";

    //Send email
    mail($to, $subject, $message, $headers);

    // Redirect to contact_success.html
    header("Location: contact_success.html"); 
        // maybe you have to adjust the path
?>

此时还有两个提示:

1:你应该决定你的文件名的设计模式,并使用单词之间的下划线或用camel case区分它们(在你的情况下你使用带有下划线的contact_success.html和camel case中的contactProcess.php) 。你决定哪个并不重要,但你应该努力保持一致。这使您和其他人更容易阅读代码,组织文件等。

2:电子邮件中的“发件人:”信息应格式为"All 4 Pets Website" <noreply@example.com>或类似内容。如果您保留All 4 Pets Website All@host.com, 4@host.com, Pets@host.com, Website@host.com,您(以及您的客户)可能会收到“来自”"Name" <mail@example.com>的电子邮件。因此,请尝试使用格式header("Location: http://example.com/");。我在上面的代码中包含了你,你也可以看到如何逃避那里的引号。只需根据您的需要更新地址和名称。

第3) 为什么这些代码?

JavaScript,因为您已经为它提供了模板。我当然会添加更多检查,但我更喜欢在PHP脚本中进行评估 - 因为在互联网上存在没有JavaScript的用户。

内爆?因为在我写这篇文章时xd6_已经提供了答案,所以我只是坚持这一点。我可能会想出一些像for-loop这样复杂的东西。

<?php if(isset($_POST['submit'])) echo "<p>Form submitted!</p>"; if(isset($_POST['arr'])) { echo "<p>Received an array: <br /><br />"; echo implode(", ", $_POST['arr']); echo "<br /><br />"; print_r($_POST['arr']); echo "</p>"; } ?> <form method="post" action=""> <input type="checkbox" value="checkbox1" name="arr[]" /> <input type="checkbox" value="checkbox2" name="arr[]" /> <input type="checkbox" value="checkbox3" name="arr[]" /> <input type="checkbox" value="checkbox4" name="arr[]" /> <input type="submit" value="submit" name="submit" /> </form> 只是因为我总是将其用于重定向。

<强> 4)

email.value

这个简单的示例显示了一个带有几个复选框的表单。只需将代码复制到PHP文件中即可试用。

<强> 5)

如评论中所述,我在JS中犯了一个错误:当然你必须使用<script type="text/javascript"> function validateForm(str1, str2) { /* this if statement is just for demonstration purposes */ if(0 != str1.localeCompare(str2)) document.getElementById('error').innerHTML = "Text fields are not the same!"; return 0 == str1.localeCompare(str2); } </script> <?php if(isset($_POST['submit'])) echo "<p>Form submitted!</p>"; if(isset($_POST['arr'])) { echo "<p>Received an array: <br /><br />"; echo implode(", ", $_POST['arr']); echo "<br /><br />"; print_r($_POST['arr']); echo "</p>"; } ?> <div id="error"></div> <form method="post" action="" onsubmit="return validateForm(str1.value, str2.value);"> <input type="checkbox" value="checkbox1" name="arr[]" /> <input type="checkbox" value="checkbox2" name="arr[]" /> <input type="checkbox" value="checkbox3" name="arr[]" /> <input type="checkbox" value="checkbox4" name="arr[]" /> <input type="text" name="str1" /> <input type="text" name="str2" /> <input type="submit" value="submit" name="submit" /> </form> ,而不是字段本身进行简单的比较。我改变了上面的代码。下面我将示例从4)扩展到也提供了一些表单检查。再一次,只需将其复制到PHP文件即可。

"Name" <mail@example.com>

<强> 6)

更新了我的2)b)2。声明。 {{1}}是要走的路。