2013-11-02 34 views
0

我面臨一個問題,我已經成功地驗證了我的表單中的輸入和必填字段。但是如果用戶提交表單,不管這些字段是否爲空;它顯示帶有字段的錯誤消息,但也發送空電子郵件。驗證字段的PHP電子郵件發送問題

我相信只是需要做一個簡單的調整。但我迷路了。請看下面的代碼,我有:

<?php 
$nameErr = $snameErr = $emailErr = $ownerNameErr = $ownerNatErr = $genderErr = $websiteErr = ""; 
$name = $sname = $regAddress = $email = $gender = $comment = $ownerName = $ownerNat = $website = ""; 

if ($_SERVER["REQUEST_METHOD"] == "POST") 
{ 
    if (empty($_POST["name"])) 
    {$nameErr = "Name is required";} 
    else 
    { 
    $name = test_input($_POST["name"]); 
    // check if name only contains letters and whitespace 
    if (!preg_match("/^[a-zA-Z ]*$/",$name)) 
     { 
     $nameErr = "Only letters and white space allowed"; 
     } 
    } 

if (empty($_POST["sname"])) 
    {$snameErr = "Company Second Name is required";} 
    else 
    { 
    $sname = test_input($_POST["sname"]); 
    // check if name only contains letters and whitespace 
    if (!preg_match("/^[a-zA-Z ]*$/",$sname)) 
     { 
     $snameErr = "Only letters and white space allowed"; 
     } 
    } 

      extract($_POST); 

    $to="[email protected]"; 
    $subject="Subject"; 
$body="<table width='100%' cellspacing='10' cellpadding='0'> 
    <tr> 
      <td style='color:blue;font-weight:bold;margin-left:500px;font-size:20px;' colspan='3'>My Form</td> 
    </tr> 

    <tr> 
    <td>Name</td> 
    <td>:</td> 
    <td>$name</td> 
    </tr> 

<tr> 
    <td>Second Choice</td> 
    <td>:</td> 
    <td>$sname</td> 
    </tr> 

</table>"; 
$headers = 'MIME-Version: 1.0' . "\r\n"; 
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; 
$headers .= 'From: MySite '."\r\n"; 
/*$headers .= 'Reply-To:'."$textfield5"."\r\n";*/ 



if(mail($to,$subject,$body,$headers)) 
{ 


     $msg = "Thank you for contacting us. We will get back to you soon."; 
    /*$msg= "Successfully Sent";*/ 
} 
else 
{ 
    $msg= "msg not sent"; 
} 

} 

function test_input($data) 
{ 
    $data = trim($data); 
    $data = stripslashes($data); 
    $data = htmlspecialchars($data); 
    return $data; 
} 
?> 

HTML部分

<span class="error">* <?php echo $ownerNatErr;?></span> 
    <br><br> 

    E-mail: <input type="text" name="email" value="<?php echo $email;?>"> 
    <span class="error">* <?php echo $emailErr;?></span> 

    input type="submit" name="submit" value="Submit Information"> 

任何幫助/建議高度讚賞。

問候。

+0

你正在試圖在localhost或在線服務器上? –

+0

請不要使用'extract($ _ POST)'。 http://stackoverflow.com/a/19740597/1561072 –

回答

0

您檢查錯誤參數並設置一些錯誤消息,但無論如何,即使您發現錯誤,您的代碼仍會調用mail

你可能想添加一些條件:

if($snameErr === '' && $nameErr === '' ...) { 
    // call mail here, check whether it was successful and 
    // tell the user about it 
} else { 
    // show error message or something else 
} 

順便說一句,我想你的代碼是脆弱的,因爲你用extract($_POST)。攻擊者可能會注入任意變量,因此可能繞過您的檢查。

+0

不應該代碼片段的第一行包含'!=='而不是'==' – DaGardner

+0

@ChristianGärtner否,因爲非空消息指示錯誤。所以這個例子會在沒有檢測到錯誤的情況下調用'mail'。但是你是正確的,我的意思是'==='。 –

+0

啊,快點。我沒有仔細閱讀。我以爲你正在檢查$ sName等變量。 – DaGardner

2

您的驗證是正確的,但我認爲它是做你想做的,但是:如果驗證失敗,則不會阻止mail()函數運行。

你可以這樣做:

if ($valid) { 
    if (mail(...) { 
     ... 
    } else { 
     ... 
    } 
} 

$valid變量SOU應該是默認和if語句,在其中設置了錯誤信息,你應該將變量false設置爲true

這樣,如果輸入僅有效,郵件函數將被調用。

乾杯。