2012-01-23 78 views
1

我是一個PHP黑客。洞察力非常感謝,因爲它會幫助我找出我出錯的地方。Ajax聯繫表格上的PHP驗證失敗

基本上我改編了this contact form爲我自己的目的。 Javascript驗證效果很好!這似乎像PHP驗證也正常工作。直到我開始從我自己的表格獲得空白提交。我正在嘗試避免在此表單中添加驗證碼。空白提交很煩人,如果有人能指出我是否在我的改編中犯了錯誤,我會很喜歡它。感謝您的時間。

HTML表單

<?php include('/ajax/verify.php');?> 
      <form action="/ajax/" method="post" id="sendEmail"> 

       <h4>Contact Us</h4> 
       <p class="alert">* All fields are required</p> 
       <ol class="forms"> 
        <li><label for="username">Your Name</label><input type="text" name="username" id="username" value="" /></li> 
        <li><label for="emailFrom">Your Email</label><input type="text" name="emailFrom" id="emailFrom" value="" /></li> 
        <li><label for="phonenumber">Phone Number</label><input type="text" name="phonenumber" id="phonenumber" value="" /></li> 
        <li><label for="message">Message</label><textarea name="message" id="message"></textarea></li> 
        <li class="buttons"><button type="submit" id="submit">Send Email &raquo;</button><input type="hidden" name="submitted" id="submitted" value="true" /></li> 
       </ol> 
      </form> 

JavaScript驗證

//Ajax Form 
$(document).ready(function(){ 
    $("#submit").click(function(){          
     $(".error").hide(); 
     var hasError = false; 
     var emailReg = /^([\w-\.][email protected]([\w-]+\.)+[\w-]{2,4})?$/; 
     var phoneReg = /^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/; 

     //from email 
     var emailFromVal = $("#emailFrom").val(); 
     if(emailFromVal == '') { 
      $("#emailFrom").after('<span class="error">You forgot to enter the email address to send from.</span>'); 
      hasError = true; 
     } else if(!emailReg.test(emailFromVal)) { 
      $("#emailFrom").after('<span class="error">Enter a valid email address to send from.</span>'); 
      hasError = true; 
     } 
     //name 
     var usernameVal = $("#username").val(); 
     if(usernameVal == '') { 
      $("#username").after('<span class="error">You forgot to enter your name.</span>'); 
      hasError = true; 
     } 
     //phone 
     var phonenumberVal = $("#phonenumber").val(); 
     if(phonenumberVal == '') { 
      $("#phonenumber").after('<span class="error">You forgot to enter your phone number.</span>'); 
      hasError = true; 
     } else if(!phoneReg.test(phonenumberVal)) { 
      $("#phonenumber").after('<span class="error">Enter a valid phone number.</span>'); 
      hasError = true; 
     } 

     //message 
     var messageVal = $("#message").val(); 
     if(messageVal == '') { 
      $("#message").after('<span class="error">You forgot to enter the message.</span>'); 
      hasError = true; 
     } 


     if(hasError == false) { 
      $(this).hide(); 
      $("#sendEmail li.buttons").append('<img src="/ajax/img/ajax-loader.gif" alt="Loading" id="loading" />'); 

      $.post("/ajax/sendEmail.php", 
       { emailFrom: emailFromVal, username: usernameVal, phonenumber: phonenumberVal, message: messageVal }, 
        function(data){ 
         $("#sendEmail").slideUp("normal", function() {     

          $("#sendEmail").before('<h4 class="success">Thank You</h4><p class="success">One of our highly trained staff will contact with you shortly.</p>');           
         }); 
        } 
       ); 
     } 

     return false; 
    });       
}); 

驗證腳本(PHP)

if(isset($_POST['submitted'])) {  
if($_POST['emailFrom'] == '') { 
    $emailFromError = 'You forgot to enter the email address to send from.'; 
} else if (!eregi("^[A-Z0-9._%-][email protected][A-Z0-9._%-]+\.[A-Z]{2,4}$", $_POST['emailFrom'])) { 
    $emailFromError = 'Enter a valid email address to send from.'; 
} 
if($_POST['phonenumber'] == '') { 
    $emailFromError = 'You forgot to enter the email address to send from.'; 
} else if (!eregi("/^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/$", $_POST['phonenumber'])) { 
    $emailFromError = 'Enter a valid email address to send from.'; 
} 
if($_POST['message'] == '') { 
    $messageError = 'You forgot to enter the message.'; 
} 
if($_POST['username'] == '') { 
    $messageError = 'You forgot your name.'; 
} 

if(!isset($emailFromError) && !isset($messageError)) { 
    include('sendEmail.php'); 
    include('thanks.php'); 
} 

}

Mailscript

$mailTo = '[email protected]'; 
$mailFrom = $_POST['emailFrom']; 
$username = $_POST['username']; 
$phonenumber = $_POST['phonenumber']; 
$subject = "New website inquiry from $username"; 
$message = $_POST['message']; 
$message = wordwrap($message, 70); 
$messagebody = "From: $username Phone Number: $phonenumber $message"; 

mail($mailTo, $subject, $messagebody, "From: ".$mailFrom); 
+0

何時/你在哪裏調用你的php驗證腳本? – jeroen

+0

你的Apache日誌說什麼? (除了建議不要使用'eregi'。 – cwallenpoole

+0

@ jeroen嗯......那肯定會解釋問題的一部分。現在更新。 –

回答

1

它似乎是(根據文件名判斷),如果有人禁用JavaScript,他或她直接發送到郵件腳本並且沒有服務器端驗證完成。

您需要更改此:

<form action="/ajax/sendEmail.php" method="post" id="sendEmail"> 

到:

<form action="/ajax/validation.php" method="post" id="sendEmail"> 

或任何你的驗證腳本被調用。

+0

這肯定會解釋爲什麼php驗證不起作用。謝謝你指出這個錯誤。 –

+0

@Justin Lascelle不客氣。 – jeroen

1

不是只是尋找在郵件正文爲空字符串,則需要去掉所有的空白字符(使用類似trim()然後尋找在那裏的內容。

就像現在這樣,有人可以簡單地輸入一些空格字符,它會通過PHP驗證。

最後,請記住,JavaScript驗證只爲用戶廣告有用的速度提升是驗證不可信,因爲我可以只使用你的網站關閉JavaScript。

+0

是的,這就是我大部分答案所指的。如果症狀是空白提交正在通過,客戶端驗證所做的並不重要,因此我忽略了它。客戶端和服務器端驗證之間的區別很重要,因此我添加了關於差異的最後一點。 – cdeszaq

+0

謝謝你讓我知道這個功能。這似乎會幫助解決這個問題。 –

1

在驗證,您可能需要做這樣的事情:

foreach($_POST as $name => $value) { 
    $_POST[$name] = trim($value); 
} 

驗證看起來聲音,但它似乎是一個空白的提交可以打通,如果他們把一個空間,爲您的所有必需的字段。我不確定這是怎麼回事,但從我看到的情況來看,它看起來好像空值不應該通過服務器端驗證。

任何可能填寫表單的機器人都會忽略javascript,因此請確保服務器驗證是嚴密的。

+0

這是非常有用的信息。非常感謝你告訴我關於trim()的問題,因爲它似乎與我的問題的第二部分作鬥爭。 –