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

Langage PHP Discussion :

Manipulation de données JSON en PHP


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2018
    Messages : 9
    Par défaut Manipulation de données JSON en PHP
    Bonjour

    Je rencontre quelques problèmes pour manipuler des données JSON en PHP, notamment pour la suppression et l'ajout.


    Voici une partie de mon fichier JSON :

    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
    47
    48
    49
    50
    51
    52
    53
     
    {
      "entrees":
      [
        {
          "nom":"Oeufs du jour"
        },
     
        {
          "nom":"Oeufs tomate cerise du jour"
        },
     
        {
          "nom":"Carottes rapées"
        },
     
        {
          "nom":"Taboulet oriental"
        },
     
        {
          "nom":"Taboulet vert"
        },
     
        {
          "nom":"Taboulet meridionnal"
        },
     
        {
          "nom":"Mini penne"
        },
     
        {
          "nom":"Pommes de terre au thon"
        },
     
        {
          "nom":"Salade de lantilles aux échalottes"
        },
     
        {
          "nom":"Tartare de concombre"
        },
     
        {
          "nom":"Salade Alaska"
        },
     
        {
          "nom":"Tomates mozarella pesto"
        }
      ]
    }

    Et mon fichier PHP réduit à l'essentiel :

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    <?php
      $menu = file_get_contents("db-json/menu.json");
      $decodedMenu = json_decode($menu);
      $entrees = $decodedMenu->{"entrees"};
      $nbEntrees = count($entrees);
      $moyenneNbEntrees = ceil($nbEntrees / 2);
     
      if(isset($_POST["supprimer"]))
      {
        $id = $_POST["id"];
     
        if ($_POST["categorie"] == "entrees")
        {
          unset($entrees[$id]);
        }
     
        $encodedMenu = json_encode($decodedMenu);
        file_put_contents("db-json/menu.json", $encodedMenu);
      }
     
      if(isset($_POST["modifier"]))
      {
        $id = $_POST["id"];
     
        if ($_POST["categorie"] == "entrees")
        {
          $entrees[$id]->{"nom"} = $_POST["nom"];
        }
      }
     
      if(isset($_POST["ajouter"]))
      {
        if ($_POST["categorie"] == "entrees")
        {
          array_push($entrees, array('nom' => $_POST["nom"]));
        }
      }
    ?>
     
    <div class="flexStart">
      <ul>
        <?php
          for($i = 0; $i < $moyenneNbEntrees; $i++)
          {
            echo
            '
              <li>
                <form method="post" action="interface-admin.php">
                  <input type="text" name="nom" value="' . $entrees[$i]->{"nom"} . '" />
                  <input type="hidden" name="id" value="' . $i . '" />
                  <input type="hidden" name="categorie" value="entrees" />
                  <button name="modifier"> Modifier </button>
                  <button name="supprimer"> Supprimer </button>
                </form>
              </li>
            ';
          }
        ?>
      </ul>
     
      <ul>
        <?php
          for($i = $moyenneNbEntrees; $i < $nbEntrees; $i++)
          {
            echo
            '
              <li>
                <form method="post" action="interface-admin.php">
                  <input type="text" name="nom" value="' . $entrees[$i]->{"nom"} . '" />
                  <input type="hidden" name="id" value="' . $i . '" />
                  <input type="hidden" name="categorie" value="entrees" />
                  <button name="modifier"> Modifier </button>
                  <button name="supprimer"> Supprimer </button>
                </form>
              </li>
            ';
          }
        ?>
      </ul>
    </div>
     
    <form method="post" action="interface-admin.php">
      <label for="nom"> Ajouter une entrée </label>
      <input type="text" name="nom" id="nom" placeholder="Nom" />
      <input type="hidden" name="categorie" value="entrees" />
      <button name="ajouter"> Ajouter </button>
    </form>

    Alors le problème c'est que lorsque je clique sur un des boutons supprimer, deux erreurs apparaissent à l'emplacement de l'entrée que je souhaitais supprimer :

    Notice: Undefined offset: numéro de la ligne que je souhaite supprimer in monfichier.php on line ligne correspondante au input de mon formulaire de suppression
    Notice: Trying to get property 'nom' of non-object in monfichier.php on lineligne correspondante au input de mon formulaire de suppression

    Pour l'ajout aucune erreur ne s'affiche quand j'envoi le formulaire mais l'ajout ne se fait pas.


    Merci d'avance pour votre aide !

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    1. Les deux Notices: Tu as retiré un élément de ton tableau $entrees avec unset($entrees[$id]) donc il est normal qu'il y ait un trou dedans et l'index $id n'existe plus. Donc quand par la suite tu le parcours avec une de tes boucles for (pourquoi y en a t'il deux? quel est l'intérêt?), quand la variable $i atteint la valeur de l'index $id on tombe sur $entrees[$i] qui n'existe plus.
    2. Pourquoi les ajouts et les suppressions ne marchent pas: c'est simple, tu modifies $entrees qui n'est que la copie d'une partie de $decodedMenu, puis tu retransformes $decodedMenu en json pour ensuite l'enregistrer. À aucun moment $decodedMenu n'a été modifié, tu as juste modifié $entrees.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    On utilise de préférence foreach() pour parcourir l'array.

    Avec un compteur si tu veux séparer en 2 listes ul/li : moitié = ceil(count($array)/2))

  4. #4
    Membre régulier
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2018
    Messages : 9
    Par défaut
    Salut à vous et merci pour vos réponses !


    Alors CosmoKnacki c'est ce que j'avais cru comprendre pour les deux notices sauf que je pensais que si, par exemple, je supprime le premier champ de mon tableau $entrees, le deuxième devrait donc devenir le premier non ? Tu vois ce que je veux dire ??? Et du coup il ne devrait pas y avoir de "trou" dedans...

    Pour ce qui est des deux boucles, l'intérêt est que j'aimerais afficher le tableau sur deux colonnes cote à cote ! Du coup obligé de faire deux boucles.

    Pour ton deuxième point $entrees correspond à $decodedMenu->{"entrees"}; donc quand je modifie $entrees je modifie forcèment $decodedMenu... Après c'est vrai que sur mon post j'ai oublié de mettre $encodedMenu = json_encode($decodedMenu); et file_put_contents("db-json/menu.json", $encodedMenu); à la fin des if mais considère qu'ils y sont


    jreaux62 j'entend bien que le foreach est mieux pour les tableaux sauf que je ne peux pas l'utilisé dans mon cas puisque j'ai besoin de faire deux liste séparées et tu verras en regardant mon code que j'utilise déjà ceil quand je fait $moyenneNbEntrees = ceil($nbEntrees / 2);


    Voila donc je ne vois pas trop comment je pourrais faire...

  5. #5
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Pour ton deuxième point $entrees correspond à $decodedMenu->{"entrees"}; donc quand je modifie $entrees je modifie forcèment $decodedMenu...
    Non c'est faux. Car $entrees n'est pas lié à $decodedMenu, c'est une copie du tableau $decodedMenu->{"entrees"}, et les modifications que tu appliques sur cette copie ne sont pas répercutées comme par magie sur l'original.

  6. #6
    Membre régulier
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2018
    Messages : 9
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Non c'est faux. Car $entrees n'est pas lié à $decodedMenu, c'est une copie du tableau $decodedMenu->{"entrees"}, et les modifications que tu appliques sur cette copie ne sont pas répercutées comme par magie sur l'original.
    Oui $entrees est une copie de $decodedMenu->{"entrees"} mais les modifications que j'appliques ne sont pas répercutées comme par magie sur l'original, elles le sont grace à $encodedMenu = json_encode($decodedMenu); et file_put_contents("db-json/menu.json", $encodedMenu);. Je procède exactement de la même manière avec la modification et ca fonctionne, les motifs se font sur mon JSON donc bon...

    Merci jreaux je n'aurais pas pensé à faire comme ça mais ca fait un peu code bidouillé je trouve... Y a vraiment pas moyen de faire pareil avec un for ??? Sinon tampis je vais utiliser ta méthode !

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    • Avec for(...), il faut OBLIGATOIREMENT que les index se suivent.
    • Avec foreach(...), ce n'est pas nécessaire (et c'est l'avantage !).


    Exemple, en générant 2 listes :
    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
    <?php
    $array = [
    	11 => 'onze',
    	22 => 'vingt deux',
    	33 => 'trente trois',
    	44 => 'quarante quatre',
    	55 => 'cinquante cinq',
    	];
     
    // 2 listes, coupées à la moitié
    $moitie = ceil(count($array)/2);
    $compteur = 0;
    echo '<ul>'."\n";
    foreach( $array as $idx => $val )
    {
    	echo '  <li>'.$idx.' : '.$val.'</li>'."\n";
    	$compteur++; // on incrémente
    	// on coupe à la moitie
    	if( $compteur == $moitie )
    	{
    		echo '</ul>'."\n"; // on change de liste
    		echo '<ul>'."\n";
    	}
    }
    echo '</ul>'."\n";
    ?>
    On obtient bien :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <ul>
      <li>11 : onze</li>
      <li>22 : vingt deux</li>
      <li>33 : trente trois</li>
    </ul>
    <ul>
      <li>44 : quarante quatre</li>
      <li>55 : cinquante cinq</li>
    </ul>

    Pour info :
    ."\n" (avec double-quote obligatoires) permet juste de faire un saut de ligne dans le code.
    C'est plus "propre".

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

Discussions similaires

  1. chatJs lire de données json en php
    Par Mika2008 dans le forum jQuery
    Réponses: 1
    Dernier message: 05/05/2015, 11h14
  2. Récupération de données JSON d'un script PHP
    Par Nickonet dans le forum Android
    Réponses: 5
    Dernier message: 12/08/2012, 18h18
  3. [AJAX] json recuperer des donneés envoyé par php
    Par karimphp dans le forum AJAX
    Réponses: 1
    Dernier message: 14/05/2010, 11h13
  4. [MySQL] manipulation des données via PHP
    Par baouk2000 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 20/03/2010, 00h24
  5. Réponses: 2
    Dernier message: 19/06/2009, 14h21

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