Ajax-код отправляет данные формы на PHP-сервер для проверки - PullRequest
1 голос
/ 18 августа 2011

Мне трудно внедрить этот код 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, что-то не соединяется. Заранее спасибо за помощь.

EDIT У кого-нибудь есть предложения относительно того, где мой код работает неправильно?

EDIT Итак, если я добавлю js/validation.php в тег action="" для формы и отключу часть кода AJAX, проверка будет работать нормально, но я перенаправлюсь на страницу, которая пуста с кодом подтверждения. Это проливает свет на проблему? Действительно, любая помощь приветствуется. Я пытался использовать советы, приведенные в комментариях, но по какой-то причине ничего не происходит. Похоже, что моя страница обновлена, но нет подтверждающего сообщения или чего-то еще. Я полностью и полностью потерян.

Ответы [ 2 ]

4 голосов
/ 18 августа 2011

Вы не за горами, но я думаю, что я буду атаковать это немного менее агрессивно.

  1. Начиная с формы, я просто сделаю ее формой с идентификатором.и припарковать кнопку отправки вне тегов формы.Зачем?Потому что кнопка внутри формы может иметь некоторые нежелательные эффекты (например, отправка в волшебную черную дыру). Меньше кода = счастливый разработчик.
  2. Я бы поймал нажатие на кнопку с помощью обработчика щелчка.Итак:

    $ ('# registerButton'). Click (function () {Сделайте свой ajax здесь});

  3. Я бы сначала ловил ошибки с front-конец проверки, потому что он сохраняет попадания на сервер и является более приятным с точки зрения пользовательского интерфейса.Это также быстрее .... и нет, на него нельзя полностью положиться, потому что любой компетентный человек может переопределить его, но это хороший первый шаг.Мой личный фаворит - здесь

  4. В действии щелчка я использовал бы ajax (как у вас в вашем примере), чтобы отправить форму в ваш скрипт дляПроверка.Сериализуйте вашу форму для отправки:

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

    Я бы попросил скрипт вернуть строку json с регистром результата (true / false) и данными для поддержки этого случая (например, id для успеха,и массив случаев ошибок для false) Итак, вы делаете все правильно с вашим вызовом ajax выше, но возвращаете тип данных для моего примера как json (не dataString) и добавляете переменную в скобках после успеха (давайте использоватьreturndata в качестве примера) Затем, в вашем обратном вызове успеха, возвращенные данные будут доступны как returndata.field (измените поле на равное имя переменной в строке json). Если это не сработает, проверьте вывод в jsonlint.com

  5. В случае успешного вызова ajax из шага 4 настройте два случая (если / еще).Если ваш результирующий случай верен, позвольте им продолжить и указать успех в соответствии с вашим пользовательским интерфейсом.Если результирующий случай ложный, то итерируйте массив ошибок, чтобы уведомить пользователя о каждом соответствующем вопросе.

Вы почти у цели.Если это ваш первый опыт работы с jQuery AJAX, я действительно впечатлен!

1 голос
/ 19 августа 2011

Я знаю, что вы уже приняли ответ, но я также хотел предложить проверить плагин jQuery Validate - http://bassistance.de/jquery-plugins/jquery-plugin-validation/ - нет необходимости переписывать колесо на самом деле.Я лично использую этот плагин каждый раз, когда выполняю любой тип проверки на стороне клиента с помощью jQuery.Я упоминаю об этом тоже, потому что плагин поставляется с собственным «удаленным» типом проверки, который вы можете использовать для любого типа удаленной проверки с помощью нескольких простых строк кода.Я также читал в некоторых местах, что jQuery может начать «официально» поддерживать плагин проверки в некоторый момент, поэтому никогда не помешает начать использовать его раньше, чем позже.Просто пища для размышлений!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...