Conditions entre un Ficher PHP et JSON

Résolu
DevRevoltium Messages postés 38 Statut Membre -  
DevRevoltium Messages postés 38 Statut Membre -
Bonjour, j'ai cherché partout ma réponse, mais je n'est pas trouvé comment faire. Ce que j 'aimerais faire, est
d'ouvrir un fichier JSON et de le lire et de updater/modifier le fichier .JSON avec un Formulaire ce que j'ai fais et qui fonctionne voilà le code:
<?php 
if(isset($_POST['submit'])){
$article_name = $_POST['article_name'];
$price = $_POST['article_price'];
$image = $_POST['article_image'];

$myfile = fopen("json/file.json", "r") or die("Unable to open file!");
$name_txt = '
[
{
"name": "'.$article_name.'",
"price": "'.$price.'",
"image": "'.$image.'"
}
]';
fwrite($myfile, $name_txt);
fclose($myfile);
}
?>


Le problème que je rencontre est que si je fais 2 articles ou +, cela ne marchera pas, car il manquera la virgule après les accolades ensuite le deuxième problème que je rencontre, c'est que le crochet se refait chaque fois alors que il faudrait jusqu'il les met au premier ça a l'assez complexe et ça fait un moment que je cherche comment faire merci à la personne ou aux personne qui m'aidera

-DevRevoltium-

19 réponses

Résumé de la discussion

Lire et mettre à jour un fichier JSON via un formulaire PHP lorsque l'on ajoute plusieurs articles pose des problèmes de virgules et de structure. Plusieurs réponses proposent d'utiliser json_encode sur un tableau associatif puis d'écrire le JSON dans le fichier avec fwrite, afin d'obtenir une structure valide sans réécriture manuelle. Des conseils mettent l'accent sur les entrées en tableau (article_name[], article_price[], article_image[]) et sur l'usage de foreach pour assembler tous les articles dans un seul tableau avant l'encodage. D'autres expliquent qu'il faut envisager une boucle qui ajoute des éléments au tableau plutôt que d'écrire chaque ligne manuellement, afin d'éviter les erreurs de syntaxe et de format.

Bobot (l'IA à votre service)
  1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    Bonjour
    Il ne faut pas chercher à écrire le texte au format JSON à la main... Mais plutôt stocker les différentes variables dans un array
    Puis utiliser la fonction json_encode..
    0
  2. DevRevoltium Messages postés 38 Statut Membre
     
    D'accord je vais essayer

    Mais je fais comment pour lui mettre name, price, image dans un array ?

    -DevRevoltium-
    0
  3. blackmefias_3350 Messages postés 713 Date d'inscription   Statut Membre Dernière intervention   70
     
    Bonsoir,

    je ne suis pas un pro de php, mais n'avez pas oublier un ";" ou "," dans la partie ci dessous

    $name_txt ='
    [
    {
    " name " : " '.$article_name.' ",

    " price " : " '.$price.' ",

    " image " : " '.$image.' "

    }

    ]';

    0
  4. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    <?php 
        if(isset($_POST['submit'])){
            $article_name = $_POST['article_name'];
            $price = $_POST['article_price'];
            $image = $_POST['article_image'];
    
            $myfile = fopen("json/file.json", "r") or die("Unable to open file!");
            
            $datas = ['name'=>$article_name, 'price'=>$price, 'image'=>$image]; // on stocke les données dans un array associatif
            $name_txt = json_encode($datas); // on transforme l'array au format json
            
            fwrite($myfile, $name_txt);
            fclose($myfile);
        }
    ?>
    

    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      et si tu as deux articles ...

       $datas = ['name'=>$article_name, 'price'=>$price, 'image'=>$image];
       $datas[] = ['name'=>$article_name2, 'price'=>$price2, 'image'=>$image2];
      


      bien sûr.. si tu as plusieurs articles .. au lieu de créer manuellement chaque ligne de l'array .. tu pourras ( devras ) passer par une boucle...
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. DevRevoltium Messages postés 38 Statut Membre
     
    Oui j'avais vu mais je veux d'abord trouver un moyen de réglé le problème en premier lieu
    0
  7. DevRevoltium Messages postés 38 Statut Membre
     
    D'accord et la boucle je la fait avec un while ou un for ?
    comme ça

    <?php 
        if(isset($_POST['submit'])){
            $article_name = $_POST['article_name'];
            $price = $_POST['article_price'];
            $image = $_POST['article_image'];
            $article_name2 = $_POST['article_name'];
            $price2 = $_POST['article_price'];
            $image2 = $_POST['article_image'];
    
            $myfile = fopen("json/file.json", "a") or die("Unable to open file!");
            $datas = ['name'=>$article_name, 'price'=>$price, 'image'=>$image];
            $datas[] = ['name'=>$article_name2, 'price'=>$price2, 'image'=>$image2];
            while($data = $datas){
                $datas[] = ['name'=>$article_name2, 'price'=>$price2, 'image'=>$image2];
            }
            $name_txt = json_encode($datas);
            fwrite($myfile, $name_txt."\n");
            fclose($myfile);
        }
    ?>
    

    0
  8. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    Alors.. déjà .. ce n'est pas sur la variable $datas que tu vas devoir faire ta boucle .. mais sur tes variables $_POST ...

    fais donc un var_dump de la variable $_POST pour voir ce qu'elle contient exactement....

    Par contre, il serait pas mal de nous montrer également le code de ton formulaire...
    J'imagine que si tu as plusieurs articles, tu as utilisé des attributs "name" dans tes input au format array .. par exemple
    <input name="article_name[]"  value="" />
    


    et dans ce cas, dans ton post, chaque variable sera sous forme d'array
    tu pourras alors faire un joli foreach dessus
    genre
    <?php
      
      var_dump($_POST); // juste pour que tu vois ce que la variable contient et sous quelle forme elle se présente...
    
      $article_name = $_POST['article_name'];
    
    
      $datas = []; // on initialise la variable qui contiendra les données
    
    //on boucle sur chaque article
    foreach($article_name as $K=>$V ){
      //ici tu traites chaque article .. 
      $name = $V;
      $price = $_POST['article_price'][$K];
      $image = $_POST['article_image'][$K];
    
      $datas[] = ['name'=>$name, 'price'=>$price, 'image'=>$image];
    }
    
     //on transforme l'array en JSON
    $name_txt = json_encode($datas);
    
    //On stocke le contenu dans le fichier
     $myfile = fopen("json/file.json", "a") or die("Unable to open file!");
     fwrite($myfile, $name_txt."\n");
     fclose($myfile);
    
    
    0
  9. DevRevoltium Messages postés 38 Statut Membre
     
    Tous d'abord voici mon formulaire

    <form action="#" method="POST" enctype="application/json">
        <input type="text" name="article_name" id="article_name" placeholder="Nom..">
        <input type="text" name="article_price" id="article_price" placeholder="Prix..">
        <input type="text" name="article_image" id="article_image" placeholder="Image..">
        <input name="submit" type="submit" value="Créer">
    </form>
    

    de ce que j''ai pu comprendre je le remplace par ça ?
    <form action="#" method="POST" enctype="application/json">
        <input type="text" name="article_name[]" id="article_name" placeholder="Nom..">
        <input type="text" name="article_price[]" id="article_price" placeholder="Prix..">
        <input type="text" name="article_image[]" id="article_image" placeholder="Image..">
        <input name="submit" type="submit" value="Créer">
    </form>
    

    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      Tout dépend comment tu penses gérer "plusieurs produits .."

      Par exemple
      <form action="" method="POST">
        <label> Produit 1</label>
          <input type="text" name="article_name[]" id="article_name" placeholder="Nom..">
          <input type="text" name="article_price[]" id="article_price" placeholder="Prix..">
          <input type="text" name="article_image[]" id="article_image" placeholder="Image..">
        <label> Produit 2</label>
          <input type="text" name="article_name[]" id="article_name2" placeholder="Nom..">
          <input type="text" name="article_price[]" id="article_price2" placeholder="Prix..">
          <input type="text" name="article_image[]" id="article_image2" placeholder="Image..">
      
      
          <input name="submit" type="submit" value="Créer">
      
      </form>
      
      0
  10. DevRevoltium Messages postés 38 Statut Membre
     
    Non je compte ajouter un produit à la fois
    0
  11. DevRevoltium Messages postés 38 Statut Membre
     
    Pour le foreach quand je créer un article j'ai ce warning

    Warning: Invalid argument supplied for foreach() in C:\wamp64\www\Aide\admin.php on line 28
    0
  12. DevRevoltium Messages postés 38 Statut Membre
     
    voici le code
    if(isset($_POST['submit'])){
            var_dump($_POST); // juste pour que tu vois ce que la variable contient et sous quelle forme elle se présente...
    
            $article_name = $_POST['article_name'];
            
            $datas = [];
    
            foreach($article_name as $K=>$V){
                $name = $V;
                $price = $_POST['article_price'][$K];
                $image = $_POST['article_image'][$K];
      
                $datas[] = ['name'=>$name, 'price'=>$price, 'image'=>$image];
            }
    
            $name_txt = json_encode($datas);
    
            $myfile = fopen("json/file.json", "a") or die("Unable to open file!");
    
            $name_txt = json_encode($datas);
            fwrite($myfile, $name_txt."\n");
            fclose($myfile);
        }


    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      Vu que tu viens de dire que tu ne compte ajouter qu'un seul produit à la fois ils font donc revenir au premier code que je t'ai suggéré.
      Par contre tu parles d'ajouter... Tu veux dire ajouter en plus dans le fichier json ?

      Il faut donc commencer par lire le contenu du fichier
      Stocker la donner dans la variable $datas
      Puis traiter le submit de ton formulaire pour y ajouter le nouveau produit
      0
      1. DevRevoltium Messages postés 38 Statut Membre > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Ok alors je refait le $myfile mais à la place du a je met r c'est ça ?
        0
  13. DevRevoltium Messages postés 38 Statut Membre
     
    Finalement j'ai réalisé que j'avais oublié les crochets dans le formulaire mais si je veux les faires 1 par 1 mais bon pas grave. Mais ensuite si je veux en rajouter 2 Je ne peux pas, car il y déjà la fin des crochets alors comment je fais ?
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      Comme je viens de te le dire ..

      1 - Lire le contenu du fichier JSON
      2 - Stocker les données dans la variable $datas ( regarde la fonction json_decode )
      3 - Ajouter les données du POST dans la variable $datas
      4 - Ecoder $datas au format json
      5- Réécrire le fichier
      0
      1. DevRevoltium Messages postés 38 Statut Membre > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
         
        D'accord je vais faire de mon mieux pour y arriver et quand je pense que c'est bon je reviens vous demander si j'ai un truc mal fait
        0
      2. DevRevoltium Messages postés 38 Statut Membre > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
         
        dernier truc comment je fais cela ?

        3 - Ajouter les données du POST dans la variable $datas
        0
  14. DevRevoltium Messages postés 38 Statut Membre
     
    <?php
        if(isset($_POST['submit'])){
            $article_name = $_POST['article_name'];
            $price = $_POST['article_price'];
            $image = $_POST['article_image'];
    
            $myfile = fopen("json/file.json", "r") or die("Unable to open file!");
            $datas = [];
            $name_txt = json_decode($datas);
            $datas = ['name'=>$article_name, 'price'=>$price, 'image'=>$image];
            $name_txt = json_encode($datas);
            fwrite($myfile, $name_txt);
            fclose($myfile);
        }
    ?>
    

    J'ai essayé de faire ce que vous m'avez dit mais toujours un erreur:
    Warning: json_decode() expects parameter 1 to be string, array given in C:\wamp64\www\Aide\admin.php on line 28 (dans le code c'est ligne 9)
    0
  15. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    un truc du genre
    <?php 
    // chemin vers le fichier
    $filename = "json/file.json";
    
    
    //on traite le submit 
    if(isset($_POST['submit'])){
      
      
      //initialisation variable $datas
       $datas = [];
       
      // lecture des données déjà présentes dans le fichier
      if ( file_exists($filename)){
         $string = file_get_contents($filename);
         //on décode les données et on les stocke en tant qu'array
         $json_a = json_decode($string, true);
    
         //on stocke les données dans $datas
         $datas = !empty( $json_a) ? $json_a : [] ;
     }
      
      //on récupère les données qui sont envoyées par le formulaire
        $article_name = $_POST['article_name'];
        $price = $_POST['article_price'];
        $image = $_POST['article_image'];
    
      //on stocke les données du formulaire dans $datas
      $datas[] = ['name'=>$article_name, 'price'=>$price, 'image'=>$image]; // on stocke les données dans un array associatif
      
      //on retransforme $datas en JSON
      $name_txt = json_encode($datas); // on transforme l'array au format json
    
      //on  le fichier en écriture
      $myfile = fopen($filename, "r") or die("Unable to open file!");
      fwrite($myfile, $name_txt);
      fclose($myfile);
    
      //tu peux aussi utiliser file_put_contents à la place de tes trois dernières lignes
     // file_put_contents($filename, $name_txt );
    }
    ?>
    


    EDIT : petite correction ligne 27
    Edit 2 : Correction ligne 19
    Edit 3 : Vérification existence du fichier avant de lire son contenu
    0
  16. DevRevoltium Messages postés 38 Statut Membre
     
    Hum d'accord, mais la plus aucun article insert dans le file.json
    0
  17. DevRevoltium Messages postés 38 Statut Membre
     
    En remplaçant les 3 dernières ligne cela marche mais ça modifie le message moi je veux avoir toute les articles que j'ajoute 1 par 1
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      Lign,e 27, j'ai oublié des crochets
        $datas[] = ['name'=>$article_name, 'price'=>$price, 'image'=>$image]; // on stocke les données dans un array associatif
       
      
      0
      1. DevRevoltium Messages postés 38 Statut Membre > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Oh Wow merci infiniment c'est exactement ce que je voulais !
        0
      2. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832 > DevRevoltium Messages postés 38 Statut Membre
         
        Pense à marquer le sujet en résolu
        0
      3. DevRevoltium Messages postés 38 Statut Membre > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
         
        D'accord =)
        0
  18. DevRevoltium Messages postés 38 Statut Membre
     
    Hum re-bonjour j'ai remarqué un truc qui n'allait pas je ne peux pas faire une boucle avec un foreach de toute mes articles, car mes articles ne sont pas à la même hauteur voilà ce que ça donne


    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      Ligne 19
      Remplace par
      $datas= !empty( $json_a) ? $json_a : [] ;
      

      Supprime ton fichier json puis relance le script et ajoute des produits
      0
      1. DevRevoltium Messages postés 38 Statut Membre > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Ok je vais essayer
        0
      2. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832 > DevRevoltium Messages postés 38 Statut Membre
         
        Dans le script, il faudra certainement vérifier que le fichier existe avant d'essayer d'en lire le contenu.
        0
      3. DevRevoltium Messages postés 38 Statut Membre > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Oui mais il existe déjà alors pas besoin si ?
        0
      4. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832 > DevRevoltium Messages postés 38 Statut Membre
         
        C'est juste une sécurité.
        J'ai édité le code tu peux copier coller directement
        0
  19. DevRevoltium Messages postés 38 Statut Membre
     
    J'ai toujours la même chose



    EDIT: Je n'avais pas vu l'édit que tu a fait alors je réessaye
    0
  20. DevRevoltium Messages postés 38 Statut Membre
     
    Merci tous fonctionne parfaitement !
    0