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

Petit nouveau ! | 3 Messages

16 avr. 2021, 17:22

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

Mammouth du PHP | 1766 Messages

16 avr. 2021, 17:43

$page .= isset($datas->nodata) ? $datas->nodata : '&#8709;';
ne déclenchera pas de warning.

Petit nouveau ! | 3 Messages

16 avr. 2021, 18:41

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 ?

Mammouth du PHP | 1766 Messages

16 avr. 2021, 19:17

avec https://www.php.net/manual/fr/function.eval.php
et $page .= $this->parseJson('$datas->nodata');

Petit nouveau ! | 3 Messages

16 avr. 2021, 19:53

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