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

JavaScript Discussion :

formData n'envoie pas la valeur d'un select + fetch sur POST ne renvoie rien


Sujet :

JavaScript

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut formData n'envoie pas la valeur d'un select + fetch sur POST ne renvoie rien
    Bonjour à tous

    Comme dit dans le titre :

    1/ mon formData ne renvoie pas la valeur sélectionnée dans le select_type_tiers[] pourtant considéré comme tableau (la boucle de test renvoie bien les deux champs : le premier est correct mais le select affiche empty string)...,

    2/ mon fetch sur la page PHP "ajoutTiers.php" renvoie le formulaire lui-même donc aucune donnée n'est insérée dans la base, pourtant le code php de ladite page marche parfaitement lui.


    Merci d'avance pour votre expertise

    ajoutTiers.js :

    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
    const formTiers = document.querySelector('#formTiers')
    const formData = new FormData(formTiers)
     
    formTiers.addEventListener('submit', async (e) => {
        e.preventDefault()
     
        for (let key of formData.keys()) {
            console.log(key, formData.get(key))
        }
     
        await fetch('/php/functions/ajoutTiers.php', {
                method: "POST",
                mode: 'no-cors',
                headers: {
                    "Content-Type": "application/json"
                },
                body: formData
            })
            .then(response => response.ok ? response.json():"Erreur")
            .then(data=>console.log(data))
            .catch((error => {
                console.error(error)
            }))
    })
    // formTiers.reset()
    ajoutTiers.php :

    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
    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
    47
    48
    49
    50
    <?php
    require_once('./../formTiers.php');
    require_once('./../classes/Db.php');
     
    if (isset($_POST['btnAjoutTiers'])) {
     
        $nom_tiers = $_POST['nom_tiers'];
        $type_tiers = $_POST['select_type_tiers'];
     
        if (isset($nom_tiers) && !empty($nom_tiers)) {
            if (strlen($nom_tiers) < 3) {
                echo JSON_encode("Le nom d'un tiers ne peut être inférieur à 3 caractères");
                return false;
            }
            if (isset($type_tiers) && $type_tiers == "") {
                echo JSON_encode("Le type de tiers est obligatoire, veuillez en choisir un dans la liste déroulante.");
                return false;
            }
            //Eviter failles xss et Mise en majuscules
            $nom_tiers = ucfirst(strip_tags($nom_tiers));
            $type_tiers = ucfirst(strip_tags($type_tiers));
            //Ajout en bdd
            ajoutTiers($nom_tiers, $type_tiers);
        }
    }
     
    function ajoutTiers(string $nom_tiers, String $type_tiers)
    {
        try {
     
            DB::connexion();
            $qry = ("INSERT INTO `tiers` (`nom_tiers`,`type_tiers`) VALUES (:nom_tiers,:type_tiers)");
            $stmt = DB::$bdd->prepare($qry);
            $stmt->bindValue(':nom_tiers', $nom_tiers, PDO::PARAM_STR);
            $stmt->bindValue(':type_tiers', $type_tiers, PDO::PARAM_STR);
            $stmt->execute();
            $stmt->closeCursor();
            //Message Ok utilisateur
            echo JSON_encode("Le tiers [" . $nom_tiers . "] a été ajouté avec succès.");
     
        } catch (PDOException $e) {
     
            if ($e->getCode() == 23000) {
                echo JSON_encode("Impossible d'effectuer l'opération : Ce nom et type de tiers existent déjà dans la base.");
            } else {
     
                echo JSON_encode("Une erreur est survenue " . PHP_EOL . $e->getMessage());
            }
        }
    }

    formTiers.php

    Code html : 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
    47
    48
    49
    50
    51
    52
    <!DOCTYPE html>
    <html lang="fr">
     
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="/css/styles.css">
        <title>Gestion des tiers</title>
    </head>
     
    <body>
        <?php
        require_once('functions/ajoutTiers.php');
        ?>
        <form action="" method="post" id="formTiers">
            <div class="entete">
                <h4>Créer un tiers / type de tiers</h4>
                <div>
                    <label for="nom_tiers">Nom du tiers</label>
                    <input type="text" id="nom_tiers" name="nom_tiers" />
                </div>
                <div>
                    <label for="select_type_tiers">Type du tiers</label>
                    <select name="select_type_tiers[]" id="select_type_tiers">
                        <option value=""> --Sélectionner un type-- </option>
                    </select>
                </div>
                <div>
                    <button class="button ajouter" type="submit" id="btnAjoutTiers" name="btnAjoutTiers">Créer tiers</button>
                </div>
            </div>
     
            <table id="table_tiers">
                <thead>
                    <td colspan="3">Tiers enregistrés :</td>
                    <tr>
                        <th>Nom</th>
                        <th>Type</th>
                        <th>Actions</th>
                    </tr>
                </thead>
                <tbody></tbody>
            </table>
        </form>
        <script src="/js/listeTypesTiers.js" type="text/javascript"></script>
        <script src="/js/listeTiers.js" type="text/javascript"></script>
        <script src="/js/ajoutTiers.js" type="text/javascript"></script>
     
    </body>
     
    </html>

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 876
    Points
    1 876
    Par défaut
    Bonjour,

    Si je regarde le code PHP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (isset($_POST['btnAjoutTiers'])) {
    Le reste du code sera exécuté pour autant qu'un bouton "btnAjoutTiers" soit inclus dans la requête POST.
    Je ne crois pas que votre code JS inclut ce bouton dans la requête émise.
    Ce n'est probablement pas utile, vous pouvez simplement vérifier qu'une requête POST est reçue, sans forcément chercher la présence d'un champ particulier.

    Vous pouvez analyser le contenu des requêtes envoyées et les réponses avec les outils de votre browser...

  3. #3
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 957
    Points : 44 121
    Points
    44 121
    Par défaut
    Bonjour,
    ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const formData = new FormData(formTiers)
    la où il est placé, il te permets de récupérer les données de ton formulaire mais avant que celui-ci ne soit rempli, l'envoi est donc « vide ».

    Il te faut placer cette récupération dans la fonction de soumission :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    formTiers.addEventListener('submit', async (e) => {
        e.preventDefault()
        // on récupère ici
        const formData = new FormData(formTiers);
        // on affiche si besoin
        for (let key of formData.keys()) {
            console.log(key, formData.get(key))
        }
    Nota : le header connu pour les FormData est Content-Type: multipart/form-data, tu n'es pas obligé de le mettre, donc tu peux faire un simple, sans await que tu n'utilise pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fetch('/php/functions/ajoutTiers.php', {
        method: 'POST',
        body: FormData(formTiers)
      })
      .then(response => response.ok ? response.json() : "Erreur")
      .then(data=>console.log(data))

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    Citation Envoyé par binarygirl
    Le reste du code sera exécuté pour autant qu'un bouton "btnAjoutTiers" soit inclus dans la requête POST.
    Je ne crois pas que votre code JS inclut ce bouton dans la requête émise.
    Ce n'est probablement pas utile, vous pouvez simplement vérifier qu'une requête POST est reçue, sans forcément chercher la présence d'un champ particulier.
    Bonjour et merci beaucoup pour votre oeil de Lynx ! , j'ai donc retiré la ligne en question qui n'avait effectivement plus lieu d'être...

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    Merci pour ta réponse bien complète NoSmoking

    Créer le formData dans la fonction : Je savais pas ! (je suppose que c'est pour çà que l'on a pas besoin de faire une méthode "send" comme dans d'autres circonstances...)

    Génial ! plus ça va plus je me dis que tout çà c'est comme de l'horlogerie Suisse...

    Citation Envoyé par NoSmoking
    donc tu peux faire un simple, sans await que tu n'utilise pas :
    D'accord mais alors dans quel cas utilise t'on await et async ?

  6. #6
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 957
    Points : 44 121
    Points
    44 121
    Par défaut
    D'accord mais alors dans quel cas utilise t'on await et async ?
    c'est souvent une affaire de goût et d'habitude de lecture/écriture que certains disent plus claire !!!

    Soit avec la syntaxe des promesses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function submit() {
      fetch('/php/functions/ajoutTiers.php', {
          method: 'POST',
          body: FormData(formTiers)
        })
        .then((response) => response.json())
        .then((result) => {
          console.log(JSON.stringify(result, null, 2));
        })
    }
    soit deux « appels » await :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    async function submit() {
      const response = await fetch('/php/functions/ajoutTiers.php', {
        method: 'POST',
        body: FormData(formTiers)
      });
      const result = await response.json();
      console.log(JSON.stringify(result, null, 2));
    }
    c'est donc souvent au choix de chacun

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    Merci à vous deux

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

Discussions similaires

  1. erreur '' n'est pas une valeur entière correcte
    Par ffxlenoir dans le forum Langage
    Réponses: 5
    Dernier message: 02/12/2005, 13h57
  2. Réponses: 5
    Dernier message: 12/09/2005, 17h34
  3. L'envois de mail ne m'envois pas de mail ...
    Par PrinceMaster77 dans le forum ASP
    Réponses: 10
    Dernier message: 27/10/2004, 16h28
  4. [Pb : champ Text = pas de valeur par defaut ?]
    Par mat_dum dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 18/08/2003, 12h57
  5. Réponses: 2
    Dernier message: 22/07/2002, 18h02

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