Ajax代码将表单数据发送到PHP服务器进行验证

时间:2011-08-18 02:20:45

标签: php ajax jquery validation

我很难将这个AJAX代码实现到我的表单中,这样页面就不需要重新加载,但仍会执行服务器端验证。我是AJAX和PHP的新手,所以我正在处理几个表格模板,但我已经在这个工作了几个小时,我无法弄清楚它为什么不起作用。任何帮助将不胜感激。

以下是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 = "somebody@somewhere.com";
$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_-]+@[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.php放在表单的action=""标签中并禁用代码的AJAX部分,那么验证工作正常,但我转发到一个空白的页面确认码。这是否有助于解决这个问题?真的,任何帮助表示赞赏。我尝试过使用评论中给出的提示,但由于某种原因没有任何反应。它看起来像我的页面刷新,但没有确认消息,或任何东西。我完全失败了。

2 个答案:

答案 0 :(得分:4)

你离我不远,但我认为我会以稍微不那么激进的方式攻击它。

  1. 从表单开始,我只是将其设为带有id的表单,并将提交按钮停放在表单标记之外。为什么?因为表单中的按钮可能会产生一些不良影响(比如提交到一个神奇的黑洞)。代码较少=开发人员很快。
  2. 我会点击按钮并点击处理程序。所以:

    $( '#registerButton')。点击(函数(){     在这做你的ajax });

  3. 我最初会通过前端验证来捕获错误,因为它可以节省服务器命中率,并且从UI的角度来看更令人愉快。它也更快......不,它不能完全依赖,因为任何有能力的人都可以超越它,但这是一个很好的第一步。我个人最喜欢的是here

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

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

    我让脚本返回一个带有结果案例的json字符串 (true / false)和支持该案例的数据(例如id为 成功,以及一系列错误的错误案例)所以,你是 用你上面的ajax调用完全正确,但返回 数据 为我的例子输入json(不是dataString)并添加一个var 该 成功后的parens(让我们以rewndata为例)然后,在你的内心 成功回调,返回的数据将可用 returndata.field(更改字段以等于中的变量名称) json string)如果不起作用,请检查输出 jsonlint.com

  5. 在步骤4的ajax调用成功后,设置两个案例(if / else)。如果您的结果案例为真,请让他们继续并指示您的UI指示成功。如果结果案例为false,则迭代错误案例数组以通知用户每个相应的问题。

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

答案 1 :(得分:1)

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