Page 1 sur 1

Notice: Undefined property: stdClass:: avec valeurs nulles json_decode()

Posté : 16 avr. 2021, 17:22
par Networkbell
Bonjour, j'ai un soucis avec une vérification de données json nulles.

J'ai fait un petit test pour identifier le problème en gardant l'architecture MVC :

En fait mon code s'exécute bien, l'erreur survient quand je rajoute

Code : Tout sélectionner

ini_set("display_errors", "1"); error_reporting(E_ALL);
dans mon index
mais ayant beaucoup de valeurs nulles dans mon fichier json, j'ai remarqué que ça ralentissait énormément mon traitement PHP. Les valeurs nulles sont normales, en revanche le fait de ne pas réussir à empécher les codes d'erreurs pour des valeurs nulles, là je bloque.

Voici le test

my test.json files :

Code : Tout sélectionner

{ "data1": "test1", "data2": "test2", "data3": "test3", "data4": "test4", "data5": "test5", "data6": { "key1": "value1", "key2": "value2", "key3": "value3", "key4": "value4", "key5": "value5", "key6": "value6", "key7": "value7" }, "data7": "test7" }


my index.php :

Code : Tout sélectionner

<?php /* DEBUG FUNCTION */ ini_set("display_errors", "1"); error_reporting(E_ALL); require 'test_controller.php'; $controller = new Controller(); $controller->dispatch();


my test_controller.php :

Code : Tout sélectionner

<?php require 'test_view.php'; require 'test_model.php'; class Controller { protected $view; protected $model; public function __construct() { $this->view = new TestView(); $this->model = new TestModel(); } public function dispatch() { $json = $this->model->getAPI(); $this->view->displayHome($json); } }


my test_model.php :

Code : Tout sélectionner

<?php class TestModel { public function __construct() { } public function getAPI() { $data = file_get_contents('test.json'); $json = json_decode($data); return $json; } }


my test_view.php :

Code : Tout sélectionner

<?php class TestView { public function __construct() { } public function parseJson($datas){ $value = '&#8709;'; $data = (isset($datas)) ? $datas : $value ; return $data; } public function displayHome($datas) { $page = $this->parseJson($datas->data1); $page .= '<br>'; $page .= $this->parseJson($datas->nodata); $page .= '<br>'; $page .= $this->parseJson($datas->data6->key1); $page .= '<br>'; $page .= $this->parseJson($datas->data6->nokey); $page .= '<br>'; echo $page; } }

Le résultat est le suivant :

Notice: Undefined property: stdClass::$nodata in /home/meteobel/networkbell.com/mbell/test/test_view.php on line 21

Notice: Undefined property: stdClass::$nokey in /home/meteobel/networkbell.com/mbell/test/test_view.php on line 25


test1

value1

J'ai donc bien le résultat attendu (les valeurs nulles sont remplacés par ∅ = '&#8709;'), mais les codes d'erreurs révélés et la lenteur d'exécution me posent problème

Aussi je ne comprend pas pourquoi j'ai :

Notice: Undefined property: stdClass::

alors que je fait un test avec isset avec ma fonction parseJson()

Merci de m'apporter de l'aide.

Cordialement

Re: Notice: Undefined property: stdClass:: avec valeurs nulles json_decode()

Posté : 16 avr. 2021, 17:43
par or 1
$page .= isset($datas->nodata) ? $datas->nodata : '&#8709;';
ne déclenchera pas de warning.

Re: Notice: Undefined property: stdClass:: avec valeurs nulles json_decode()

Posté : 16 avr. 2021, 18:41
par Networkbell
Merci or 1

En fait à l'origine je faisais comme ça en déclarant chaque données individuellement dans un isset ? true : false mais je trouvais ça très redondant d'où l'idée de la fonction qui fait le test en amont.

N'y a t'il pas moyen de faire un test isset générique dans une fonction ?

Re: Notice: Undefined property: stdClass:: avec valeurs nulles json_decode()

Posté : 16 avr. 2021, 19:17
par or 1
avec https://www.php.net/manual/fr/function.eval.php
et $page .= $this->parseJson('$datas->nodata');

Re: Notice: Undefined property: stdClass:: avec valeurs nulles json_decode()

Posté : 16 avr. 2021, 19:53
par Networkbell
Ok je vois l'esprit.

Mais
Attention
La construction de langage eval() est très dangereuse car elle autorise l'exécution de code PHP arbitraire. Son utilisation est vivement déconseillée. Si vous avez soigneusement vérifié qu'il n'y a pas d'autres options que de l'utiliser, gardez une attention toute particulière à ne pas y passer de données provenant d'un utilisateur sans les avoir précédemment validées minutieusement.

Dans mon cas je suppose que y'a pas trop de risques, mais je préfèrerai être sûr