8722 sujets

Développement web côté serveur, CMS

Pages :
Bonjour à toutes et à tous ! Smiley biggrin
Je développe actuellement le site web d'un restaurant et je dois créer un interface administrateur permettant aux employés de modifier la carte eux-même.
J'ai donc pensé à créer une base de données au format JSON.
Le problème est que je n'arrive pas à récupérer ces données en PHP qui m'affiche un horrible NULL...
Merci d'avance ! Smiley biggrin

Le fichier menu.json :

{
  "entrees" :
  [
    {
      "nom" : "Oeufs du jour",
      "prix" : "1.80€"
    },

    {
      "nom" : "Oeufs tomate cerise du jour",
      "prix" : "3.30€"
    },

    {
      "nom" : "Carottes rapées",
      "prix" : "3.60€"
    },

    {
      "nom" : "Taboulet oriental",
      "prix" : "3.60€"
    },

    {
      "nom" : "Taboulet vert",
      "prix" : "3.80€"
    },

    {
      "nom" : "Taboulet meridionnal",
      "prix" : "3.80€"
    },

    {
      "nom" : "Mini penne",
      "prix" : "3.80€"
    }

    {
      "nom" : "Pommes de terre au thon",
      "prix" : "3.80€"
    },

    {
      "nom" : "Salade de lantilles aux échalottes",
      "prix" : " 3.80€"
    },

    {
      "nom" : "Tartare de concombre",
      "prix" : "3.60€"
    },

    {
      "nom" : "Salade Alaska",
      "prix" : " 3.80€"
    },

    {
      "nom" : "Tomates mozarella pesto",
      "prix" : "3.80€"
    }
  ],

  "plats" :
  [
    {
      "nom" : "Pavé de saumon",
      "prix" : "8.20€"
    },

    {
      "nom" : "Jardinière de légumes",
      "prix" : "7.80€"
    },

    {
      "nom" : "Lasagnes pur boeuf",
      "prix" : "7.60€"
    },

    {
      "nom" : "Filet de merlut aux épinard à la crème",
      "prix" : "7.40€"
    },

    {
      "nom" : "Chilicon carne pur boeuf",
      "prix" : "6.90€"
    },

    {
      "nom" : "Plat lite sans sucre au saumon",
      "prix" : "7.80€"
    },

    {
      "nom" : "3 légumes farcits au riz",
      "prix" : "6.90€"
    }

    {
      "nom" : "Spaghettis bolognaise",
      "prix" : "7.50€"
    },

    {
      "nom" : "Gratin de courgettes",
      "prix" : " 6.90€"
    },

    {
      "nom" : "Sauté de poulet à la sauce forestière",
      "prix" : "7.80€"
    },

    {
      "nom" : "Ratatouille maison avec sa semoule et merguez",
      "prix" : " 7.50€"
    },

    {
      "nom" : "Steack haché sauce forestière",
      "prix" : "7.80€"
    },

    {
      "nom" : "Poulet basquez",
      "prix" : "7.80€"
    },

    {
      "nom" : "Gambas sauce curry avec ses morilles",
      "prix" : "7.80€"
    },

    {
      "nom" : "Ratatouille veau à la lionnaise",
      "prix" : "7.80€"
    }
  ],

  "desserts" :
  [
    {
      "pattiseries" :
      [
        {
          "nom" : "Eclair au café / chocolat",
          "prix" : "2.50€"
        },

        {
          "nom" : "Cannelai",
          "prix" : "2.00€"
        },

        {
          "nom" : "Tarte poire chocolat",
          "prix" : "2.70€"
        },

        {
          "nom" : "Tarte aux pommes",
          "prix" : "3.00€"
        },

        {
          "nom" : "Flan",
          "prix" : "3.00€"
        },

        {
          "nom" : "Gateau au daim",
          "prix" : "3.00€"
        }
      ]
    },

    {
      "yaourts" :
      [
        {
          "nom" : "Jokey / Taillefine",
          "prix" : "2.00€"
        },

        {
          "nom" : "Mami Nova chocolat",
          "prix" : "2.00€"
        },

        {
          "nom" : "Pot de terre",
          "prix" : "2.70€"
        },

        {
          "nom" : "Mousse au chocolat",
          "prix" : "3.00€"
        },

        {
          "nom" : "Tiramisu",
          "prix" : "3.00€"
        }
      ]
    },

    {
      "fromages" :
      [
        {
          "nom" : "Coulis de framboise",
          "prix" : "3.00€"
        },

        {
          "nom" : "Fruits exotiques",
          "prix" : "3.00€"
        },

        {
          "nom" : "Crème de marron",
          "prix" : "3.00€"
        },

        {
          "nom" : "Brisure de daim",
          "prix" : "3.00€"
        },

        {
          "nom" : "Brisure d'Oréo",
          "prix" : "3.00€"
        }
      ]
    },
  ]
}


Le traitement PHP :

$menu = file_get_contents("db-json/menu.json");
$parsedMenu = json_decode($menu); 
var_dump($parsedMenu);

Modifié par TooKi (05 Nov 2018 - 12:06)
Il te faudrait vérifier si $menu est correct, autrement dit si file_get_contents() s'est bien passé. Voir dans le fichier error_log de PHP (à activer le log si nécessaire).
Non aucune erreur n'est signalée par PHP... Smiley decu
Modifié par TooKi (05 Nov 2018 - 15:39)
Il faut t'assurer que tu as le bon niveau de logging en développement : error_reporting = E_ALL & ~E_STRICT
Le problème persiste toujours alors que j'ai donné la valeur E_ALL & ~E_STRICT au error_reporting de mon php.ini ... Smiley decu
C'est à n'y rien comprendre ! Comment je peux avancer si je ne connais pas la cause du problème Smiley fache
Modifié par TooKi (06 Nov 2018 - 10:57)
Modérateur
Bonjour,

Pour le json c'est à peu près pareil que Mysql pour ce qui concerne les erreurs, il faut les invoquer pour les observer.

En ajoutant ceci à la suite de votre code:
echo json_last_error(), ' - ', json_last_error_msg();

on obtient en retour
4 - Syntax error


Et effectivement, à y regarder de plus près, votre fichier contient des erreurs. Il manque à plusieurs endroits des virgules (comme après les Mini penne par exemple).
Meilleure solution
Je n'ai jamais eu besoin de procéder ainsi avec MySQL... Smiley hum
Normalement, une bonne configuration du php.ini suffit, pas besoin de rajouter quoi que ce soit dans le code enfin bon Smiley ravi
Effectivement il manquait ou il y avait des virgules en trop dans mon fichier json...
Encore une fois c'est une erreur toute bête mais qui m'arrive assez souvent malheureusement Smiley ohwell il faudrait que je relise plus attentivement mon code avant de me tourner vers les forums Smiley ravi ca me ferait gagner énormément de temps mais sur le moment vraiment je ne voyais pas l'erreur.
En tout cas merci beaucoup pour vos réponses !
Modifié par TooKi (06 Nov 2018 - 12:02)
Modérateur
Json est un format apportant nombre d'avantages mais qui présente l'inconvénient d'être très rigide sur sa syntaxe.
Une erreur et c'est écran blanc.

Il est plus facile de construire ses données sous forme de tableau ; ainsi les erreurs sont directement levées par Php et permettent de corriger facilement car est indiquée la ligne incriminée.

Ensuite, un simple json_encode() et hop, un fichier de donnée conforme, minifié et complètement opérationnel.


De rien pour la réponse, ça m'a fait plaisir Smiley smile
Pour vérifier qu'un fichier JSON est valide, l'ouvrir directement dans un navigateur ( CHrome, Firefox, ...)
$filename = "db-json/menu.json";
$menu = file_get_contents($filename);
$parsedMenu = json_decode($menu); 
if($parsedMenu === null) {
   echo "FIchier $filename invalide\n";
  exit;
}
var_dump($parsedMenu); 

Modifié par bazooka07 (07 Nov 2018 - 14:34)
Modérateur
bazooka07 a écrit :
Qui a mangé le reste du biscuit ?
C'est sûr, c'est Maurice ! Il a fait le même coup avec les Choco-Suisse ! Smiley lol
Greg_Lumiere a écrit :

Il est plus facile de construire ses données sous forme de tableau ; ainsi les erreurs sont directement levées par Php et permettent de corriger facilement car est indiquée la ligne incriminée.

Ensuite, un simple json_encode() et hop, un fichier de donnée conforme, minifié et complètement opérationnel.

OK mais les données sont déjà construite sous forme de tableau dans un fichier JSON non ??? Smiley hum

Et sinon j'ai un autre problème c'est que par exemple si je fais :

$plats = $parsedMenu->{'plats'};

Ca fonctionne très bien, je peux ensuite boucler sur tous mes plats.

Par contre quand je fais :

$patisseries = $parsedMenu->{"desserts"}->{"patisseries"};

La j'ai une erreur PHP me disant : Notice: Trying to get property 'patisseries' of non-object in /Users/quentinsastourne/www/Pain Bayard/interface-admin.php on line 14

J'ai essayé plein de syntaxe différente en rajoutant par exemple un [0] devant {"desserts"} mais rien n'y fait... Smiley ohwell
Modifié par TooKi (08 Nov 2018 - 12:43)
array(3) { [0]=> object(stdClass)#35 (1) { ["patisseries"]=> array(6) { [0]=> object(stdClass)#29 (2) { ["nom"]=> string(26) "Eclair au café / chocolat" ["prix"]=> string(7) "2.50€" } [1]=> object(stdClass)#30 (2) { ["nom"]=> string(8) "Cannelai" ["prix"]=> string(7) "2.00€" } [2]=> object(stdClass)#31 (2) { ["nom"]=> string(20) "Tarte poire chocolat" ["prix"]=> string(7) "2.70€" } [3]=> object(stdClass)#32 (2) { ["nom"]=> string(16) "Tarte aux pommes" ["prix"]=> string(7) "3.00€" } [4]=> object(stdClass)#33 (2) { ["nom"]=> string(4) "Flan" ["prix"]=> string(7) "3.00€" } [5]=> object(stdClass)#34 (2) { ["nom"]=> string(14) "Gateau au daim" ["prix"]=> string(7) "3.00€" } } } [1]=> object(stdClass)#41 (1) { ["yaourts"]=> array(5) { [0]=> object(stdClass)#36 (2) { ["nom"]=> string(18) "Jokey / Taillefine" ["prix"]=> string(7) "2.00€" } [1]=> object(stdClass)#37 (2) { ["nom"]=> string(18) "Mami Nova chocolat" ["prix"]=> string(7) "2.00€" } [2]=> object(stdClass)#38 (2) { ["nom"]=> string(12) "Pot de terre" ["prix"]=> string(7) "2.70€" } [3]=> object(stdClass)#39 (2) { ["nom"]=> string(18) "Mousse au chocolat" ["prix"]=> string(7) "3.00€" } [4]=> object(stdClass)#40 (2) { ["nom"]=> string(8) "Tiramisu" ["prix"]=> string(7) "3.00€" } } } [2]=> object(stdClass)#47 (1) { ["fromages"]=> array(5) { [0]=> object(stdClass)#42 (2) { ["nom"]=> string(19) "Coulis de framboise" ["prix"]=> string(7) "3.00€" } [1]=> object(stdClass)#43 (2) { ["nom"]=> string(16) "Fruits exotiques" ["prix"]=> string(7) "3.00€" } [2]=> object(stdClass)#44 (2) { ["nom"]=> string(16) "Crème de marron" ["prix"]=> string(7) "3.00€" } [3]=> object(stdClass)#45 (2) { ["nom"]=> string(15) "Brisure de daim" ["prix"]=> string(7) "3.00€" } [4]=> object(stdClass)#46 (2) { ["nom"]=> string(15) "Brisure d'Oréo" ["prix"]=> string(7) "3.00€" } } } }
a vue d'oeil,

$parsedMenu->{"desserts"}[0]["pattiseries"]; pour la 1er patisseries
Modifié par JENCAL (08 Nov 2018 - 13:35)
du genre

foreach($parsedMenu->{"desserts"} as patisseries)
{
// ça boucle trois fois et tu fais ce que tu veux
}
JENCAL a écrit :

$parsedMenu->{"desserts"}[0]["pattiseries"]; pour la 1er patisseries

Ceci me renvoi Fatal error: Uncaught Error: Cannot use object of type stdClass as array in...

JENCAL a écrit :

ou boucler sur
$parsedMenu->{"desserts"} et tu aura t'es trois patisseries

Le truc c'est qu'il n'y a pas trois patisseries... Dans desserts, il y a trois catégories, patisseries, yaourts, fromages, qui eux même contiennent des données nom et prix.

JENCAL a écrit :

foreach($parsedMenu->{"desserts"} as patisseries)
{
// ça boucle trois fois et tu fais ce que tu veux
}

J'ai déjà essayé de boucler de cette manière mais il y a toujours une erreur genre je fais

$patisseries = $parsedMenu->{"desserts"}[0];
foreach($patisseries as $patisserie)
{
     echo
     '
          <li class="spaceBetween bottom30">
               <input type="text" value="' . $patisserie["nom"] . '" class="right30" />
          </li>
      ';
}

Ca me renvoi Notice: Undefined index: nom

Et si dans le input je met plutôt $patisserie->{"nom"} ca me renvoi
Notice: Trying to get property 'nom' of non-object
ah. ok Smiley smile

Essaye vraiment de faire des var_dump();die; un maximum de fois. pour "voir" ce que les variables contiennent, ça aide bcp !

foreach($patisseries as $patisserie)
{
    var_dump($patisserie);
}
die;


comme ça tu vois bien.
Et avec ton JSON_DECODE oublie pas de lui mettre TRUE si tu veux travailler sur des array()

comme ça : json_decode($data, true);
Pages :