IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Récupération d'un tableau de données jQuery ajax pour insertion dans une base MySQL


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2018
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : octobre 2018
    Messages : 85
    Points : 31
    Points
    31
    Par défaut Récupération d'un tableau de données jQuery ajax pour insertion dans une base MySQL
    Bonjour les amis, j'ai besoin de votre aide pour insérer les données mon tableau dans ma base de données .
    je remplis un tableau html avec jQuery puis je récupère ses valeurs que j'insère ensuite dans ma base de données MySQL.
    le tableau est bien remplis
    Nom : data_table.JPG
Affichages : 86
Taille : 29,7 Ko

    Mon soucis se situe au niveau de l'insertion des données.
    Lorsque je soumets le formulaire, il n'y a pas d'erreur. Dans le sous-onglet payload de Network, il affiche : [object Object]. les données ne s'enregistrent pas


    script ajax
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    var table_data = [];
    $("table#table tr").each(function(){
    	hidden_fonction = parseInt($(this).find('.hidden_fonction').text());
    	hidden_membre = parseInt($(this).find('.hidden_membre').text());
    	hidden_dateentree = $(this).find('.hidden_dateentree').text();
     
    	if($(this).find('td:eq(0)').text()==""){
     
    	}else{
    		table_data.push({
    			'hidden_fonction' : $(this).find('td:eq(1)').text(),
    			'hidden_membre' : $(this).find('td:eq(3)').text(),
    			'hidden_dateentree' : $(this).find('td:eq(5)').text(),
    		}
    		);
    	}
     
    	//
    });
     
     
    $.ajax({  
    	url:"ligne_add.php",  
    	method:"POST",  
    	data: {table_data : table_data},
    	dataType: "json",
    	contentType: "application/json; charset=utf-8",
    	processData: false,
    	contentType: false,
    	success :function(data){
    	// debut
    		$("#message-bd.alert-success").remove();
    		$("#message-bd").addClass("alert-success");
    		$("#message-bd.alert-success").html(data.message);
    		$("#message_field_add").children().remove();
    		$('#bureau_form')[0].reset();
    		$("#message_field_add").empty();
    		$('#bureau #myModalAdd').css('transform', 'scale(0)');
    		load_data_bureau();
    		$('#message-bd.alert-success').fadeIn(250).delay(3000).fadeOut(250);
    		window.setTimeout(function(){
    			window.location.reload();     
    		}, 3000);
    	}	
    });
    php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    if(!empty($_POST)){ 
           $tabDonnees=$_POST['table_data'];
            //var_dump($tabDonnees);
            foreach($tabDonnees as $table)
            {
                $membre_id = $table['hidden_membre'];
                $fonction_id = $table['hidden_fonction'];
                $dateentre = $table['hidden_dateentree'];
                echo $membre_id;
                $req=$bd->prepare("INSERT INTO  `composer_bureau`(`BureauId`,`MembreId`, `PosteId`, `BureauDateentree`, `BureauDatesortie`)  
                                                    VALUES (:MembreId, :BureauId, :PosteId, :BureauDateentree, '9999-12-31')");
                $rep=$req->execute(array(
                    ':BureauId' => $last_id,
                    ':MembreId' => $membre_id,
                    ':PosteId' => $fonction_id,
                    ':BureauDateentree' => $dateentre
                ));
            }
            if($rep){
                $data['success_bd'] = true;
                $data['message'] = 'Enregistrement effectué avec succès';
            }else{
                $data['success_bd'] = false;
                $data['message'] = "impossible d'enregistrer";
            }
    }

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    8 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 8 392
    Points : 30 232
    Points
    30 232
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Attention : l'ordre des colonnes n'est pas le même dans la liste des colonnes et dans la liste des host variables, l'identifiant du bureau et du membre sont inversés :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO  `composer_bureau`
                (`BureauId`,`MembreId`, `PosteId`, `BureauDateentree`, `BureauDatesortie`)  
    VALUES (:MembreId, :BureauId, :PosteId, :BureauDateentree, '9999-12-31')");

    Ce faisant, soit la requête va planter pour valeur de clef étrangère inconnue dans la table où cette colonne est clef primaire, soit, pire encore, la requête va passer, mais les valeurs insérées seront incohérentes !

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2018
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : octobre 2018
    Messages : 85
    Points : 31
    Points
    31
    Par défaut
    Merci escartefigue pour votre prompt réponse

    Attention : l'ordre des colonnes n'est pas le même dans la liste des colonnes et dans la liste des host variables, l'identifiant du bureau et du membre sont inversés :
    c'est une erreur d'inattention. je l'ai corrigé mais ça ne passe toujours pas.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2018
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : octobre 2018
    Messages : 85
    Points : 31
    Points
    31
    Par défaut
    Merci escartefigue,
    Je veux savoir si ma méthode pour récupérer les données du tableau n'est la bonne côté jQuery comme côté PHP.
    Portant lorsque je fais un console.log() de ma variable table_data, ça m'affiche bien les données dans la console.
    Nom : table_data.JPG
Affichages : 33
Taille : 23,2 Ko
    Nom : console_log_data.JPG
Affichages : 31
Taille : 29,7 Ko

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    novembre 2012
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : novembre 2012
    Messages : 75
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Ce faisant, soit la requête va planter pour valeur de clef étrangère inconnue dans la table où cette colonne est clef primaire, soit, pire encore, la requête va passer, mais les valeurs insérées seront incohérentes !
    Je penses pas qu'il y ai une incidence si on utilise des valeurs nommées dans le mauvais ordre, en revanche avec les valeurs positionnels ":?", oui. A confirmer, la doc ne le dit pas.

    https://www.php.net/manual/fr/pdostatement.execute.php

    C'est un tableau modifiable à la volée ?

  6. #6
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    mars 2008
    Messages
    1 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : mars 2008
    Messages : 1 815
    Points : 2 655
    Points
    2 655
    Par défaut
    Bonjour,

    Il y a de grandes chances que ça ne soit pas normal de voir [object Object] dans le Payload
    Normalement vous devriez voir tout ce qui a été envoyé par la requête POST
    D'ailleurs, dans votre PHP, avez-vous vérifiez que vous receviez quoi que ce soit ? J'imagine que vous n'avez rien du tout et donc la première condition (if(!empty($_POST)){) n'est jamais vraie et donc le code jamais exécuté.

    Dans votre appel AJAX vous définissez plein d'attributs : je le déconseille fortement
    Je trouve que de bien écrire sa réponse (avec un header JSON pour une réponse JSON par exemple) est plus propre que de forcer la requête AJAX

    Si vous supprimez les propriétés contentType, processData et contentType de votre appel AJAX, il devrait s'exécuter normalement (et votre onglet "Payload" devrait afficher votre formulaire sous forme de tableau)
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $.ajax({  
    	url:"ligne_add.php",  
    	method:"POST",  
    	data: {table_data : table_data},
    	dataType: "json", // tant qu'à faire, faudrait supprimer dataType aussi :) c'est mieux d'envoyer le bon header avec la réponse voir plus bas
    //	contentType: "application/json; charset=utf-8",
    //	processData: false,
    //	contentType: false,
    	success :function(data){

    Pour ce qui est de la réponse, vu que ça semble être une réponse JSON, voici une petite fonction PHP qui fait en sorte de l'afficher correctement et de retourner le header correct :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?php
    /**
     * Output JSON response encoded with headers
     * 
     * @param array $response
     */
    function json_response($response = null)
    {
        // End AJAX return if no data.
        if ($response == null)
            exit;
        // Proper headers for json output.
        header('Content-Type: application/json');
        // Output our response.
        echo json_encode($response);
        exit;
    }
    Faut juste lui donner un array en PHP et il va le convertir et renvoyer le bon header
    Exemple vu que vous utilisez $data dans votre code :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            if($rep){
                $data['success_bd'] = true;
                $data['message'] = 'Enregistrement effectué avec succès';
            }else{
                $data['success_bd'] = false;
                $data['message'] = "impossible d'enregistrer";
            }
            json_response($data);

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    novembre 2012
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : novembre 2012
    Messages : 75
    Points : 71
    Points
    71
    Par défaut
    C'est ce que j'appelle ce compliquer la vie. Ta réponse est bonne Darkstar mais c'est ce compliquer pour rien.

    Je résume :

    $.ajax peut être directement utilisé en $.post :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $.post("ligne_add.php", {table_data : table_data},function(data){
     
      if(data.success_bd) // perso j'enverrais "true" (en string), pas true (booléen), puis je ferais "if(data.success_bd == "true")"
       alert("ok !");
     
    }, "json");
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(!empty($_POST)){ // bof bof, rien ne vérifie si table_data existe
    if(!empty($_POST['table_data']) && is_array($_POST['table_data'])){ //correct



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Content-Type: application/json');
    Pas besoin de se compliquer avec un header pour la réponse, sinon merci de confirmer pourquoi il est utile de l'utiliser

    Je confirme que c'est inutile car une chaine JSON est décodée via l'appel JS $.post, donc inutile (je l'utilise tous les jours ainsi depuis longtemps..., jamais eu de souci)

  8. #8
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    mars 2008
    Messages
    1 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : mars 2008
    Messages : 1 815
    Points : 2 655
    Points
    2 655
    Par défaut
    Hello @two3d,

    Personnellement, je n'aime pas du tout l'écriture de $.post() car je trouve qu'on perd énormément en lisibilité
    D'ailleurs, si tu trouves qu'il est inutile d'utiliser un header en PHP pour la réponse JSON, c'est pcq justement tu le forces dans ta requête AJAX avec le json en 4e argument.
    Du coup, si tu omet ce 4e argument, la réponse sera interprétée comme étant un string...
    Voici un test que je viens de mettre en place : https://tests.pierre-roels.com/ajax-headers.php

    Suffit de changer la valeur du premier champ pour retourner ou non les headers dans la réponse
    Les réponse sont visibles dans console et on voit bien qu'elles ne sont pas les mêmes :
    Nom : Capture d’écran 2022-05-18 101901.jpg
Affichages : 13
Taille : 100,6 Ko

    Sinon, je rejoins l'avis de tester if(empty($_POST)) qui est pas terrible
    Cependant, il est tout a fait possible d'utiliser des booléens dans la réponse JSON, sans aucun problème

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    novembre 2012
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : novembre 2012
    Messages : 75
    Points : 71
    Points
    71
    Par défaut
    C'est finalement une question de goût $.post me parait moins long à écrire et pas si flou en terme de lecture (url, data, function, type de réponse).

    OK pour les booléen

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2018
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : octobre 2018
    Messages : 85
    Points : 31
    Points
    31
    Par défaut
    Merci tout le mon monde,
    avec Darkstar,
    Si vous supprimez les propriétés contentType, processData et contentType de votre appel AJAX, il devrait s'exécuter normalement (et votre onglet "Payload" devrait afficher votre formulaire sous forme de tableau)
    Si je supprime
    //contentType: false,
    il ne reconnait plus les champs (input)

    ///processData: false,
    erreur voir image
    Nom : illegal_invocation.JPG
Affichages : 14
Taille : 27,8 Ko

    Avec ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $.ajax({  
    url:"bureau_traitement_add.php",  
    method:"POST",  
    data: formData_add,
    dataType: "json",
    processData: false,
    contentType: false,
    success :function(data){
     
    }
    les champs apparaissent dans le payload avec un warning coté php

    BRAVO !

    Donc j'ai converti le tableau en json avant de l'envoyer (JSON.stringify(table_data)) et ça marche très bien


    Après plusieurs nuits de galère …
    Avec ce forum on a toujours la solution, Dieu vous bénisse.
    TRES TRES TRES grand merci à vous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PDO] répéter ligne de array chiffre aléatoire pour insertion dans une base de donnée
    Par XAVIERV dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 18/11/2021, 13h26
  2. Réponses: 8
    Dernier message: 02/11/2019, 16h40
  3. Réponses: 2
    Dernier message: 05/05/2010, 17h01
  4. Recuperation de la donnée de TextField pour inserer dans ma base mysql
    Par shallum dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 26/12/2009, 03h04
  5. [ODBC] Récupération d'une donnée pour insertion dans une autre table
    Par rom950 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/03/2006, 17h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo