758 votes

Exemple de jQuery Ajax POST avec PHP

J'essaie d'envoyer des données d'un formulaire vers une base de données. Voici le formulaire que j'utilise :

<form name="foo" action="form.php" method="POST" id="foo">
    <label for="bar">A bar</label>
    <input id="bar" name="bar" type="text" value="" />
    <input type="submit" value="Send" />
</form>

L'approche typique serait de soumettre le formulaire, mais cela entraîne une redirection du navigateur. En utilisant jQuery et Ajax est-il possible de capturer toutes les données du formulaire et de les soumettre à un script PHP (un exemple, formulaire.php ) ?

4 votes

Ver méta-discussion connexe pour le raisonnement derrière la non-délétion.

1 votes

Une solution simple de vanilla js : stackoverflow.com/a/57285063/7910454

1021voto

Marcus Ekwall Points 14489

Utilisation de base de .ajax ressemblerait à quelque chose comme ça :

HTML :

<form id="foo">
    <label for="bar">A bar</label>
    <input id="bar" name="bar" type="text" value="" />

    <input type="submit" value="Send" />
</form>

jQuery :

// Variable to hold request
var request;

// Bind to the submit event of our form
$("#foo").submit(function(event){

    // Prevent default posting of form - put here to work in case of errors
    event.preventDefault();

    // Abort any pending request
    if (request) {
        request.abort();
    }
    // setup some local variables
    var $form = $(this);

    // Let's select and cache all the fields
    var $inputs = $form.find("input, select, button, textarea");

    // Serialize the data in the form
    var serializedData = $form.serialize();

    // Let's disable the inputs for the duration of the Ajax request.
    // Note: we disable elements AFTER the form data has been serialized.
    // Disabled form elements will not be serialized.
    $inputs.prop("disabled", true);

    // Fire off the request to /form.php
    request = $.ajax({
        url: "/form.php",
        type: "post",
        data: serializedData
    });

    // Callback handler that will be called on success
    request.done(function (response, textStatus, jqXHR){
        // Log a message to the console
        console.log("Hooray, it worked!");
    });

    // Callback handler that will be called on failure
    request.fail(function (jqXHR, textStatus, errorThrown){
        // Log the error to the console
        console.error(
            "The following error occurred: "+
            textStatus, errorThrown
        );
    });

    // Callback handler that will be called regardless
    // if the request failed or succeeded
    request.always(function () {
        // Reenable the inputs
        $inputs.prop("disabled", false);
    });

});

Note : Depuis jQuery 1.8, .success() , .error() y .complete() sont dépréciés au profit de .done() , .fail() y .always() .

Note : Rappelez-vous que le code ci-dessus doit être fait après que le DOM soit prêt, donc vous devez le mettre à l'intérieur d'une balise $(document).ready() (ou utilisez la fonction $() raccourci).

Conseil : Vous pouvez chaîne les gestionnaires de rappel comme ceci : $.ajax().done().fail().always();

PHP (c'est-à-dire form.php) :

// You can access the values posted by jQuery.ajax
// through the global variable $_POST, like this:
$bar = isset($_POST['bar']) ? $_POST['bar'] : null;

Note : Toujours assainir les données affichées pour éviter les injections et autres codes malveillants.

Vous pouvez également utiliser l'abréviation .post à la place de .ajax dans le code JavaScript ci-dessus :

$.post('/form.php', serializedData, function(response) {
    // Log the response to the console
    console.log("Response: "+response);
});

Remarque : le code JavaScript ci-dessus est conçu pour fonctionner avec jQuery 1.8 et les versions ultérieures, mais il devrait fonctionner avec les versions antérieures jusqu'à jQuery 1.5.

0 votes

Je peux faire quelque chose avec ça ;) Mais à quoi devrait ressembler le formulaire / code php ?

7 votes

J'ai modifié votre réponse pour corriger un bug : request a été déclaré comme une variable locale, ce qui rend if (request) request.abort(); ne fonctionnent jamais.

0 votes

Il ne faut pas serializedData être $inputs.serialize() ou y a-t-il une raison pour laquelle vous sérialisez et soumettez le formulaire entier ?

246voto

NullPoiиteя Points 23754

Pour effectuer une requête Ajax en utilisant jQuery vous pouvez le faire avec le code suivant.

HTML :

<form id="foo">
    <label for="bar">A bar</label>
    <input id="bar" name="bar" type="text" value="" />
    <input type="submit" value="Send" />
</form>

<!-- The result of the search will be rendered inside this div -->
<div id="result"></div>

JavaScript :

Méthode 1

 /* Get from elements values */
 var values = $(this).serialize();

 $.ajax({
        url: "test.php",
        type: "post",
        data: values ,
        success: function (response) {

           // You will get response from your PHP page (what you echo or print)
        },
        error: function(jqXHR, textStatus, errorThrown) {
           console.log(textStatus, errorThrown);
        }
    });

Méthode 2

/* Attach a submit handler to the form */
$("#foo").submit(function(event) {
    var ajaxRequest;

    /* Stop form from submitting normally */
    event.preventDefault();

    /* Clear result div*/
    $("#result").html('');

    /* Get from elements values */
    var values = $(this).serialize();

    /* Send the data using post and put the results in a div. */
    /* I am not aborting the previous request, because it's an
       asynchronous request, meaning once it's sent it's out
       there. But in case you want to abort it you can do it
       by abort(). jQuery Ajax methods return an XMLHttpRequest
       object, so you can just use abort(). */
       ajaxRequest= $.ajax({
            url: "test.php",
            type: "post",
            data: values
        });

    /*  Request can be aborted by ajaxRequest.abort() */

    ajaxRequest.done(function (response, textStatus, jqXHR){

         // Show successfully for submit message
         $("#result").html('Submitted successfully');
    });

    /* On failure of request this function will be called  */
    ajaxRequest.fail(function (){

        // Show error
        $("#result").html('There is error while submit');
    });

El .success() , .error() y .complete() sont dépréciés à partir de jQuery 1.8 . Pour préparer votre code à leur suppression éventuelle, utilisez la fonction .done() , .fail() y .always() à la place.

MDN: abort() . Si la demande a déjà été envoyée, cette méthode interrompt la demande.

Nous avons donc réussi à envoyer une requête Ajax, et il est maintenant temps de récupérer les données sur le serveur.

PHP

Comme nous faisons une requête POST dans un appel Ajax ( type: "post" ), nous pouvons maintenant saisir les données en utilisant soit $_REQUEST ou $_POST :

  $bar = $_POST['bar']

Vous pouvez également voir ce que vous obtenez dans la requête POST en faisant simplement l'un ou l'autre. BTW, assurez-vous que $_POST est réglé. Sinon, vous obtiendrez une erreur.

var_dump($_POST);
// Or
print_r($_POST);

Et vous insérez une valeur dans la base de données. Assurez-vous que vous êtes sensibilisation ou échapper à Toutes les requêtes (que vous ayez fait un GET ou un POST) correctement avant de faire la requête. Le mieux serait d'utiliser déclarations préparées .

Et si vous voulez renvoyer des données à la page, vous pouvez le faire en faisant simplement écho à ces données comme ci-dessous.

// 1. Without JSON
   echo "Hello, this is one"

// 2. By JSON. Then here is where I want to send a value back to the success of the Ajax below
echo json_encode(array('returned_val' => 'yoho'));

Et puis tu peux l'obtenir comme :

 ajaxRequest.done(function (response){
    alert(response);
 });

Il y a un couple de méthodes abrégées . Vous pouvez utiliser le code ci-dessous. Il fait le même travail.

var ajaxRequest= $.post("test.php", values, function(data) {
  alert(data);
})
  .fail(function() {
    alert("error");
  })
  .always(function() {
    alert("finished");
});

0 votes

@Clarence bar est un nom de texte de type entrée et comme j'utilise la méthode post, $_POST['bar'] est utilisé pour obtenir sa valeur.

4 votes

Pour tous ceux qui souhaitent utiliser JSON, l'appel doit contenir le paramètre dataType : 'json'.

4 votes

@CarlLindberg - Que se passe-t-il si vous voulez que jQuery devine le type MIME de la réponse (ce qu'il devrait faire si vous ne définissez pas l'attribut dataType ), de sorte que vous pouvez potentiellement accepter JSON o un autre format ?

69voto

Mr. Alien Points 60232

Je voudrais partager avec vous une méthode détaillée pour afficher avec PHP + Ajax, ainsi que les erreurs renvoyées en cas d'échec.

Tout d'abord, créez deux fichiers, par exemple form.php y process.php .

Nous allons d'abord créer un form qui sera ensuite soumis en utilisant le jQuery .ajax() méthode. Le reste sera expliqué dans les commentaires.


form.php

<form method="post" name="postForm">
    <ul>
        <li>
            <label>Name</label>
            <input type="text" name="name" id="name" placeholder="Bruce Wayne">
            <span class="throw_error"></span>
            <span id="success"></span>
       </li>
   </ul>
   <input type="submit" value="Send" />
</form>

Valider le formulaire en utilisant la validation côté client de jQuery et passer les données à process.php .

$(document).ready(function() {
    $('form').submit(function(event) { //Trigger on form submit
        $('#name + .throw_error').empty(); //Clear the messages first
        $('#success').empty();

        //Validate fields if required using jQuery

        var postForm = { //Fetch form data
            'name'     : $('input[name=name]').val() //Store name fields value
        };

        $.ajax({ //Process the form using $.ajax()
            type      : 'POST', //Method type
            url       : 'process.php', //Your form processing file URL
            data      : postForm, //Forms name
            dataType  : 'json',
            success   : function(data) {
                            if (!data.success) { //If fails
                                if (data.errors.name) { //Returned if any error from process.php
                                    $('.throw_error').fadeIn(1000).html(data.errors.name); //Throw relevant error
                                }
                            }
                            else {
                                    $('#success').fadeIn(1000).append('<p>' + data.posted + '</p>'); //If successful, than throw a success message
                                }
                            }
        });
        event.preventDefault(); //Prevent the default submit
    });
});

Nous allons maintenant jeter un coup d'œil à process.php

$errors = array(); //To store errors
$form_data = array(); //Pass back the data to `form.php`

/* Validate the form on the server side */
if (empty($_POST['name'])) { //Name cannot be empty
    $errors['name'] = 'Name cannot be blank';
}

if (!empty($errors)) { //If errors in validation
    $form_data['success'] = false;
    $form_data['errors']  = $errors;
}
else { //If not, process the form, and return true on success
    $form_data['success'] = true;
    $form_data['posted'] = 'Data Was Posted Successfully';
}

//Return the data back to form.php
echo json_encode($form_data);

Les fichiers du projet peuvent être téléchargés à partir de http://projects.decodingweb.com/simple_ajax_form.zip .

29voto

Vous pouvez utiliser serialize. Voici un exemple.

$("#submit_btn").click(function(){
    $('.error_status').html();
        if($("form#frm_message_board").valid())
        {
            $.ajax({
                type: "POST",
                url: "<?php echo site_url('message_board/add');?>",
                data: $('#frm_message_board').serialize(),
                success: function(msg) {
                    var msg = $.parseJSON(msg);
                    if(msg.success=='yes')
                    {
                        return true;
                    }
                    else
                    {
                        alert('Server error');
                        return false;
                    }
                }
            });
        }
        return false;
    });

23voto

DDeme Points 1241

HTML :

    <form name="foo" action="form.php" method="POST" id="foo">
        <label for="bar">A bar</label>
        <input id="bar" class="inputs" name="bar" type="text" value="" />
        <input type="submit" value="Send" onclick="submitform(); return false;" />
    </form>

JavaScript :

   function submitform()
   {
       var inputs = document.getElementsByClassName("inputs");
       var formdata = new FormData();
       for(var i=0; i<inputs.length; i++)
       {
           formdata.append(inputs[i].name, inputs[i].value);
       }
       var xmlhttp;
       if(window.XMLHttpRequest)
       {
           xmlhttp = new XMLHttpRequest;
       }
       else
       {
           xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
       }
       xmlhttp.onreadystatechange = function()
       {
          if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
          {

          }
       }
       xmlhttp.open("POST", "insert.php");
       xmlhttp.send(formdata);
   }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X