0

我正在尝试创建一个报价表,其中包含基本联系信息、复选框选项和上传图片的选项,然后将完整的表单通过电子邮件发送到我的电子邮件地址。我有 html 部分,但 php 部分有问题。当给我的表单电子邮件仅发送联系信息并且无法发送哪个选项是选中复选框和已上传的图像时。这是表单 html 部分的代码:

<form action="quote_form.php" method="post" enctype="multipart/form-data" name="QuoteForm" id="QuoteForm" onsubmit="MM_validateForm('Name','','R','LastName','','R','email','','RisEmail','Phone','','RisNum','textfield','','RisNum');MM_validateForm('Name','','R','LastName','','R','Phone','','RisNum','email','','RisEmail','info-about-item','','R');return document.MM_returnValue">
    <p>
        <label for="name">Name*</label>
        <input name="name" type="text" id="name" size="60" maxlength="60" />
    </p>
    <p>
        <label for="phone">Phone #*</label>
        <input name="phone" type="text" id="phone" size="30" maxlength="30" />
    </p>
    <p>
        <label for="email">Email* </label>
        <input name="email" type="text" id="email" size="30" maxlength="30" />
    </p>
    <p>
        <label>
            <input type="checkbox" name="ServiceType[]" value="pawn"  />
        Pawn</label>
      <br />
      <label>
        <input type="checkbox" name="ServiceType[]" value="buy"  />
        Buy</label>
        <br />
    </p>
    <p><br /><br />
        <span style="font-style: italic">(the more information the better --- description     i.e. brand, model and condition of item.)</span></p>
    <p>
        <textarea name="comments" id="comments" cols="50" rows="10"></textarea>
    </p>
    <p>
        <label for="file">Select File To Upload*</label>
        <input type="file" name="file" id="file" size="30" maxlength="30" />
    </p>
    <p>
        <input type="submit" name="submit" id="sumbit" value="Submit" />
        <input name="reset" type="reset" id="reset" value="Reset Form" />
    </p>
    <p>
        <input name="recipient" type="hidden" id="recipient" value="isabelpolanco23@gmail.com" />
        <input name="redirect" type="hidden" id="redirect" value="thankyou-pg.html" />
        <br />
    </p>
</form>

这是php部分:

<?php
if (isset($_POST['email'])) {
    $email_to = "isabelpolanco23@gmail.com";
    $email_subject = "Quote Form";

    function died($error) {
        echo "We are very sorry, but there were error(s) found with the form you submitted. ";
        echo "These errors appear below.<br /><br />";
        echo $error . "<br /><br />";
        echo "Please go back and fix these errors.<br /><br />";
        die();
    }

    if ($_FILES["file"]["error"] > 0) {
        echo "Error: " . $_FILES["file"]["error"] . "<br>";
    } else {
        echo "Upload: " . $_FILES["file"]["name"] . "<br>";
        echo "Type: " . $_FILES["file"]["type"] . "<br>";
        echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
        echo "Stored in: " . $_FILES["file"]["tmp_name"];
    }

    if (!isset($_POST['name']) ||
        !isset($_POST['email']) ||
        !isset($_POST['phone']) ||
        !isset($_POST['comments'])
    ) {
        died('We are sorry, but there appears to be a problem with the form you submitted.');
    }

    $name = $_POST['name']; // required
    $email_from = $_POST['email']; // required
    $phone = $_POST['phone']; // not required
    $comments = $_POST['comments']; // required


    foreach ($_POST["servicetype"] as $value) {
if ($value=="pawn")
  $servicetype["pawn"] = true;
elseif ($value=="buy")
  $servicetype["buy"] = true;

} }

    $error_message = "";
    $email_exp = '/^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/';
    if (!preg_match($email_exp, $email_from)) {
        $error_message .= 'The Email Address you entered does not appear to be valid.<br />';
    }
    $string_exp = "/^[A-Za-z .'-]+$/";
    if (!preg_match($string_exp, $name)) {
        $error_message .= 'The Name you entered does not appear to be valid.<br />';
    }
    if (strlen($comments) < 2) {
        $error_message .= 'The Comments you entered do not appear to be valid.<br />';
    }
    if (strlen($error_message) > 0) {
        died($error_message);
    }
    $email_message = "Form details below.\n\n";

    function clean_string($string)
    {
        $bad = array("content-type", "bcc:", "to:", "cc:", "href");
        return str_replace($bad, "", $string);
    }

    $email_message .= "Name: " . clean_string($name) . "\n";
    $email_message .= "Email: " . clean_string($email_from) . "\n";
    $email_message .= "Comments: " . clean_string($comments) . "\n";
    $email_message .= "Pawn: " . clean_string(($checkboxgroup1["pawn"]) ? "Yes" : "No") . "\n";
$email_message .= "Buy: " . clean_string(($checkboxgroup2["buy"]) ? "Yes" : "No") . "\n";

    $headers = 'From: ' . $email_from . "\r\n" .
        'Reply-To: ' . $email_from . "\r\n" .
        'X-Mailer: PHP/' . phpversion();
    @mail($email_to, $email_subject, $email_message, $headers);

    $allowedExts = array("gif", "jpeg", "jpg", "png");
    $temp = explode(".", $_FILES["file"]["name"]);
    $extension = end($temp);
    if ((($_FILES["file"]["type"] == "image/gif")
            || ($_FILES["file"]["type"] == "image/jpeg")
            || ($_FILES["file"]["type"] == "image/jpg")
            || ($_FILES["file"]["type"] == "image/pjpeg")
            || ($_FILES["file"]["type"] == "image/x-png")
            || ($_FILES["file"]["type"] == "image/png"))
        && ($_FILES["file"]["size"] < 20000)
        && in_array($extension, $allowedExts)
    ) {
        if ($_FILES["file"]["error"] > 0) {
            echo "Error: " . $_FILES["file"]["error"] . "<br>";
        } else {
            echo "Upload: " . $_FILES["file"]["name"] . "<br>";
            echo "Type: " . $_FILES["file"]["type"] . "<br>";
            echo "Size: " . ($_FILES["file"]["size"] / 3024) . " kB<br>";
            echo "Stored in: " . $_FILES["file"]["tmp_upload"];
        }
    } else {
        echo "Invalid file";
    }
?> 
<?php
header("Location:thankyou-pg.html");
exit;
?>

<?php } ?>
4

1 回答 1

0

您的 HTML 表单具有名称为“CheckboxGroup1”的复选框,但在您的 PHP 脚本中根本没有引用它。此外,您的 PHP 脚本正在寻找名称为“servicetype”的表单元素,该元素不存在于您的 HTML 表单中。你的名字可能不匹配。

至于您的文件,您应该通过查看它进入“if”语句的程度来检查验证的哪一部分失败。

编辑

再看看你的代码,你会遇到几个不同的问题。

  1. 您的复选框的“名称”与您的 PHP 脚本不匹配。在 HTML 中将复选框的名称更改为“servicetype”。

  2. 如果您真的打算使用复选框而不是单选按钮,则需要为每个复选框分配不同的名称,或者需要将它们作为数组传递给脚本。要作为数组传递,您必须将每个复选框的名称改为“servicetype[]”。在这种情况下,将“[]”放在末尾表示每个被检查的元素都将其值添加为名为“servicetype”的数组的元素。否则,一个的值可能会覆盖另一个。

    此外,您的 PHP 脚本中的逻辑在处理服务类型方面似乎存在缺陷。也许更好的解决方案是:

    $servicetype = array("pawn" => false, "buy" => false);
    
      foreach ($_POST["servicetype"] as $value) {
        if ($value=="pawn")
          $servicetype["pawn"] = true;
        elseif ($value=="buy")
          $servicetype["buy"] = true;
      }
    
    ...
    
    $email_message .= "Pawn: " . clean_string(($servicetype["pawn"]) ? "Yes" : "No") . "\n";
    $email_message .= "Buy: " . clean_string(($servicetype["buy"]) ? "Yes" : "No") . "\n";
    

    补充说明:

    1. 在多个元素上使用相同的 ID 是非常糟糕的做法。我建议将两个复选框的 ID 更改为不同的值。

    2. 此行不是必需的(至少根据您提供的代码不是):

      $mail->body .= "servicetype: \r\n";
      
  3. 至于文件上传,您不会将文件移动到永久位置。上传文件时,它会临时存储在文件路径$_FILES["file"]["tmp_name"]中。当您的脚本完成时,该文件会立即被删除。因此,您必须在脚本完成使用move_uploaded_file()之前移动文件,如下所示:

    move_uploaded_file($_FILES["file"]["tmp_name"], "/home/user/pic");
    

    关于此的一些注意事项:您的目标目录必须具有适当的写入权限,以便 PHP 在其中创建文件。其次,强烈建议您将文件移到文档根目录之外,这样它就不能在网络上公开访问。如果您确实计划通过网络访问该图像,我强烈建议您采取一些预防措施,以免成为恶意攻击的受害者。

    我不知道你想如何在你的电子邮件中包含这个图像(无论你是真的想显示它还是只显示它的路径),但我会把它留给你。我希望这能为您指明正确的方向。

于 2013-08-24T01:09:41.030 回答