Conditions entre un Ficher PHP et JSON

Résolu
DevRevoltium Messages postés 37 Date d'inscription   Statut Membre Dernière intervention   -  
DevRevoltium Messages postés 37 Date d'inscription   Statut Membre Dernière intervention   -
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-
A voir également:

19 réponses

jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
DevRevoltium Messages postés 37 Date d'inscription   Statut Membre Dernière intervention  
 
D'accord je vais essayer

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


-DevRevoltium-
0
blackmefias_3350 Messages postés 710 Date d'inscription   Statut Membre Dernière intervention   64
 
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
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
<?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
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
DevRevoltium Messages postés 37 Date d'inscription   Statut Membre Dernière intervention  
 
Oui j'avais vu mais je veux d'abord trouver un moyen de réglé le problème en premier lieu
0
DevRevoltium Messages postés 37 Date d'inscription   Statut Membre Dernière intervention  
 
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
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
DevRevoltium Messages postés 37 Date d'inscription   Statut Membre Dernière intervention  
 
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
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
DevRevoltium Messages postés 37 Date d'inscription   Statut Membre Dernière intervention  
 
Non je compte ajouter un produit à la fois
0
DevRevoltium Messages postés 37 Date d'inscription   Statut Membre Dernière intervention  
 
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
DevRevoltium Messages postés 37 Date d'inscription   Statut Membre Dernière intervention  
 
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
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
DevRevoltium Messages postés 37 Date d'inscription   Statut Membre Dernière intervention   > jordane45 Messages postés 38486 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
DevRevoltium Messages postés 37 Date d'inscription   Statut Membre Dernière intervention  
 
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
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
DevRevoltium Messages postés 37 Date d'inscription   Statut Membre Dernière intervention   > jordane45 Messages postés 38486 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
DevRevoltium Messages postés 37 Date d'inscription   Statut Membre Dernière intervention   > jordane45 Messages postés 38486 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
DevRevoltium Messages postés 37 Date d'inscription   Statut Membre Dernière intervention  
 
<?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
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
DevRevoltium Messages postés 37 Date d'inscription   Statut Membre Dernière intervention  
 
Hum d'accord, mais la plus aucun article insert dans le file.json
0
DevRevoltium Messages postés 37 Date d'inscription   Statut Membre Dernière intervention  
 
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
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
DevRevoltium Messages postés 37 Date d'inscription   Statut Membre Dernière intervention   > jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention  
 
Oh Wow merci infiniment c'est exactement ce que je voulais !
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > DevRevoltium Messages postés 37 Date d'inscription   Statut Membre Dernière intervention  
 
Pense à marquer le sujet en résolu
0
DevRevoltium Messages postés 37 Date d'inscription   Statut Membre Dernière intervention   > jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention  
 
D'accord =)
0
DevRevoltium Messages postés 37 Date d'inscription   Statut Membre Dernière intervention  
 
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
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Ligne 19
Remplace par
$datas= !empty( $json_a) ? $json_a : [] ;

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





EDIT: Je n'avais pas vu l'édit que tu a fait alors je réessaye
0
DevRevoltium Messages postés 37 Date d'inscription   Statut Membre Dernière intervention  
 
Merci tous fonctionne parfaitement !
0