2011-08-18 60 views
1

我很难将这个AJAX代码实现到我的表单中,以便页面不需要重新加载,但仍然会执行服务器端验证。我是AJAX和PHP的新手,所以我正在处理一些表单模板,但是我一直在研究这个问题好几个小时,但我无法弄清楚它为什么不起作用。任何帮助,将不胜感激。将表单数据发送到PHP服务器进行验证的Ajax代码

这里是HTML代码的一部分:

<div id="popupContact"> 
<form id="formElem" name="formElem" action="" method="post"> 
    <fieldset class="step"> 
      <legend>Personal Details</legend> 
      <p> 
       <label for="firstname">First Name</label><em>*</em> 
       <input id="firstname" name="firstname" /> 
      </p> 
      <p> 
       <label for="lastname">Last Name</label><em>*</em> 
       <input id="lastname" name="lastname" /> 
      </p> 
      <p>* fields are required</p> 
     </fieldset> 
     <fieldset class="step"> 
      <legend>Confirm</legend> 
     <p>Before you submit your information, please ensure that each step 
    below has this <img src="../img/global/checked.png" alt="Complete" > 
    above them. If there is a step that has this 
    <img src="../img/global/error.png" alt="Error" >, please click on that tab 
    and review the information to ensure it is correct and complete. Thank you.</p> 
    <p> 
       <label for="human">Please Type: "Something"</label><em>*</em> 
       <input id="human" name="human" /> 
      </p> 
      <p class="submit"> 
       <button id="registerButton" type="submit">Submit</button> 
      </p> 
     </fieldset> 
    </form> 
</div> 

这里的JavaScript代码:

$(function() { 
var form = $("#formElem"); 
var fname = $("#firstname"); 
var lname = $("#lastname"); 
var address = $("#streetaddress"); 
var city = $("#city"); 
var state = $("#state"); 
var phone = $('#phone'); 
var email = $('#email'); 
var insurance = $('#insurance'); 
var license = $('#license'); 
var human = $('#human'); 
$('#registerButton').bind('click',function(){ 
    if($('#formElem').data('errors')){ 
     alert('Please correct the errors in the Form'); 
     return false; 
    } 
    else { 
     var dataString = 'fname='+$('#firstname').val()+'&lname='+$('#lastname').val()+'&address='+$('#streetaddress'.val())+'&city='+$('#city')+'&state='+$('#state').val()+'&phone='+$('#phone').val()+'&email='+$('#email').val()+'&insurance='+$('#insurance').val()+'&license='+$('#license').val()+'&human='+$('#human').val(); 
     $.ajax({ 
     type: "POST", 
     url: "js/validation.php", 
     data: dataString, 
     async: false, 
     success: function() { 
       $('#popupContact').html("<div id='message'></div>"); 
       $('#message').html("<h2>Inquiry Submitted!</h2>") 
       .append("<p>We will be in touch soon.</p>") 
       .hide() 
       .fadeIn(1500, function() { 
       $('#message').append("<img id='checkmark' src='..img/global/check.png' />"); 
       }); 
     } 
    }); 
    return false; 
    } 
}); 

而这里的PHP代码:

<?php 
if(isset($_POST['email'])) { 
$email_to = "[email protected]"; 
$email_subject = "Inquiry"; 
function died($error) { 
    // your error code can go here 
    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(); 
} 

// validation expected data exists 
if(!isset($_POST['firstname']) || 
    !isset($_POST['lastname']) || 
    !isset($_POST['email']) || 
    !isset($_POST['phone']) || 
    !isset($_POST['streetaddress']) || 
    !isset($_POST['city']) || 
    !isset($_POST['state']) || 
    !isset($_POST['insurance']) || 
    !isset($_POST['license']) || 
    !isset($_POST['human'])){ 
    died('We are sorry, but there appears to be a problem with the form you submitted.');  
} 

$firstname = $_POST['firstname']; // required 
$lastname = $_POST['lastname']; // required 
$emailfrom = $_POST['email']; // required 
$phone = $_POST['phone']; // required 
$address = $_POST['streetaddress']; //required 
$city = $_POST['city']; //required 
$state = $_POST['state']; //required 
$insurance = $_POST['insurance']; //required 
$license = $_POST['license']; //required 
$human = $_POST['human']; //required 

$error_message = ""; 
$email_exp = '/^[a-zA-Z0-9]+[a-zA-Z0-9_.-]+[a-zA-Z0-9_-][email protected][a-zA-Z0-9]+[a-zA-Z0-9.-]+[a-zA-Z0-9]+.[a-z]{2,4}$/'; 
if(!preg_match($email_exp,$emailfrom)) { 
$error_message .= 'The Email Address you entered does not appear to be valid.<br />'; 
} 

$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 .= "First Name: ".clean_string($firstname)."\n"; 
$email_message .= "Last Name: ".clean_string($lastname)."\n"; 
$email_message .= "Email: ".clean_string($emailfrom)."\n"; 
$email_message .= "Telephone: ".clean_string($phone)."\n"; 
$email_message .= "Address: \n".clean_string($address)."\n"; 
$email_message .= "".clean_string($city).", "; 
$email_message .= "".clean_string($state)."\n"; 
$email_message .= "Have Insurance: ".clean_string($insurance)."\n"; 
$email_message .= "Have License: ".clean_string($license)."\n"; 


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

<!-- include your own success html here --> 

Thank you for contacting us. We will be in touch with you very soon. 

<?php 
}  
?> 

我省略了大部分的它的实际验证代码部分,所以我知道你看到的不完整。我不明白的是,如果没有这个AJAX部分,表单验证的工作方式就很好 - 客户端和服务器端,但是当我添加AJAX时,某些东西没有连接。感谢您的帮助提前。

编辑 有没有人有我的代码出错的建议?

编辑 好了,所以如果我把js/validation.phpaction=""标签的形式和禁用码的AJAX部分,然后验证工作得很好,但我转发到一个网页,只是空白确认码。这在这个问题上有什么亮点吗?真的,任何帮助表示赞赏。我尝试过使用评论中给出的提示,但由于某种原因没有任何反应。它看起来像我的网页刷新,但没有确认信息,或任何东西。我完全失去了。

+0

这并不回答你的验证问题,但我想指出,你可以使用$ .post(“test.php”,$(“#testform”)序列化整个表单。 ()); ..不需要获取每个值并将它们作为一个字符串粘在一起。您使用的是Apache错误日志和Firefox错误控制台,您是否使用 – Stephen

+0

?找出ajax错误是非常宝贵的。 –

+0

@Stephen - 所以在这种情况下,我可以将其重写为:'$ .post(“validation.php”,$('#contact_form')。serialize());'摆脱'var dataString = blahblahblah; '部分? – Michael

回答

4

你并不遥远,但我认为我会以稍微不积极的态度攻击它。

  1. 从表单开始,我只是把它做成一个带有ID的表单,然后将提交按钮停放在表单标签之外。为什么?因为表单中的按钮可能会产生一些不良效果(如提交给魔法黑洞)代码少=开发人员开心。
  2. 我会点击按钮点击处理程序。所以:

    $('#registerButton')。click(function(){ 在这里做你的ajax });

  3. 我会在最初使用前端验证时发现错误,因为它可以节省服务器命中,从UI角度来看更令人愉快。它也更快......但不是,它不能完全依赖,因为任何有能力的人都可以推翻它,但这是一个好的第一步。我个人最喜欢的是here

  4. 在点击操作中,我会使用ajax(就像您在 示例中那样)将表单提交到您的脚本进行验证。 序列化的形式发送过来:

    $.ajax({ 
          type: "POST", 
          url: "js/validation.php", 
          data: $('#formElem').serialize(), 
          ... 
    

    我有脚本返回一个JSON字符串与结果的情况下 (真/假)和数据来支持这种情况下(如 成功的ID ,以及错误数组为false)所以,你是 做与上面的ajax呼叫完全正确,但返回 数据 类型为我的例子作为json(而不是dataString),并添加一个var 成功后的parens(让我们以returndata为例)然后,在您的 成功回调中,返回的数据将作为 returndata.field(变更字段等于在 JSON字符串变量名),如果它不工作,检查输出上 jsonlint.com

  5. 在Ajax调用的成功步骤4,设置2案件(如果别的)。如果你的结果案例是真实的,让他们继续,并表明你的用户界面指示成功。如果结果案例为false,则遍历错误案例数组以通知用户每个问题。

你快到了。如果这是您第一次使用jQuery AJAX,我真的很感动!

+0

这正是我需要的指导。感谢您花时间浏览我的代码并写下它。对此,我真的非常感激! – Michael

1

我知道你已经接受了一个答案,但我也想建议查看jQuery Validate插件 - http://bassistance.de/jquery-plugins/jquery-plugin-validation/ - 不需要真的重写轮子。我个人使用这个插件,我使用jQuery进行任何类型的客户端验证。我也提到了这一点,因为插件带有一个本地的“远程”验证类型,您可以使用几行简单的代码行进行任何类型的远程验证。我也在一些地方看过jQuery可能会在某个时候“正式”支持验证插件,所以它不会早于以后开始使用它。只是一些思考的食物!

相关问题