Je reçois une erreur étrange avec json_decode()
. Il décode correctement les données (je les ai vues avec print_r
), mais lorsque j'essaie d'accéder aux informations à l'intérieur du tableau, je reçois:
Fatal error: Cannot use object of type stdClass as array in
C:\Users\Dail\software\abs.php on line 108
J'ai seulement essayé de faire: $result['context']
où $result
a les données renvoyées par json_decode()
Comment puis-je lire les valeurs à l'intérieur de ce tableau?
Utilisez le second paramètre de json_decode
pour lui faire renvoyer un tableau:
_$result = json_decode($data, true);
_
La fonction json_decode()
renvoie un objet par défaut.
Vous pouvez accéder aux données comme ceci:
var_dump($result->context);
Si vous avez des identifiants comme from-date
(le trait d'union causerait une erreur PHP en utilisant la méthode ci-dessus), vous devez écrire:
var_dump($result->{'from-date'});
Si vous voulez un tableau, vous pouvez faire quelque chose comme ça:
$result = json_decode($json, true);
Ou convertissez l'objet en un tableau:
$result = (array) json_decode($json);
Vous devez y accéder en utilisant ->
puisque c'est un objet.
Changer votre code de:
_$result['context'];
_
À:
_$result->context;
_
Utilisez true
comme deuxième paramètre de json_decode
. Cela décodera le JSON en un tableau associatif au lieu de stdObject
instances:
$my_array = json_decode($my_json, true);
Voir la documentation pour plus de détails.
J'ai le même problème aujourd'hui, résolu comme ceci:
Si vous appelez json_decode($somestring)
, vous obtiendrez un objet et vous devrez y accéder comme $object->key
, mais si vous appelez json_decode($somestring, true)
, vous obtiendrez un dictionnaire et pourrez y accéder comme $array['key']
.
Ce n'est pas un tableau, c'est un objet de type stdClass.
Vous pouvez y accéder comme ceci:
echo $oResult->context;
Plus d'infos ici: Qu'est-ce que stdClass en PHP?
Comme le Manuel PHP dit,
print_r - Imprime des informations lisibles par l'homme sur une variable
Lorsque nous utilisons json_decode();
, nous obtenons un objet de type stdClass en tant que type de retour. Les arguments qui doivent être passés à l'intérieur de print_r()
doivent être soit un tableau, soit une chaîne. Par conséquent, nous ne pouvons pas passer d'objet à l'intérieur de print_r()
. J'ai trouvé 2 façons de gérer cela.
Convertit l'objet en tableau.
Ceci peut être réalisé comme suit.
$a = (array)$object;
En accédant à la clé de l'objet
Comme mentionné précédemment, lorsque vous utilisez la fonction json_decode();
, elle renvoie un objet de stdClass. vous pouvez accéder aux éléments de l'objet à l'aide de ->
Operator.
$value = $object->key;
On peut également utiliser plusieurs clés pour extraire les sous-éléments si l’objet contient des tableaux imbriqués.
$value = $object->key1->key2->key3...;
Il y a aussi d'autres options pour print_r()
, comme var_dump();
et var_export();
P.S : si vous définissez le deuxième paramètre de la json_decode();
sur true
, l'objet sera automatiquement converti en une array();
Voici quelques références:
http://php.net/manual/en/function.print-r.php
http://php.net/manual/en/function.var-dump.php
http://php.net/manual/en/function.var-export.php
Vous pouvez convertir un objet stdClass en tableau comme ceci:
$array = (array)$stdClass;
Lorsque vous essayez d'y accéder en tant que $result['context']
, vous le traitez comme un tableau. Si l'erreur vous dit que vous avez réellement affaire à un objet, vous devez y accéder en tant que $result->context
Voici la signature de la fonction:
mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )
Lorsque param est false, ce qui est la valeur par défaut, il retournera un type php approprié. Vous récupérez la valeur de ce type en utilisant le paradigme object.method.
Lorsque param est true, les tableaux associatifs sont renvoyés.
Il retournera NULL en cas d'erreur.
Si vous souhaitez extraire une valeur via un tableau, définissez assoc sur true.
au lieu d'utiliser les crochets, utilisez l'opérateur d'objet. Par exemple, mon tableau basé sur un objet de base de données est créé comme ceci dans une classe appelée DB:
class DB {
private static $_instance = null;
private $_pdo,
$_query,
$_error = false,
$_results,
$_count = 0;
private function __construct() {
try{
$this->_pdo = new PDO('mysql:Host=' . Config::get('mysql/Host') .';dbname=' . Config::get('mysql/db') , Config::get('mysql/username') ,Config::get('mysql/password') );
} catch(PDOException $e) {
$this->_error = true;
$newsMessage = 'Sorry. Database is off line';
$pagetitle = 'Teknikal Tim - Database Error';
$pagedescription = 'Teknikal Tim Database Error page';
include_once 'dbdown.html.php';
exit;
}
$headerinc = 'header.html.php';
}
public static function getInstance() {
if(!isset(self::$_instance)) {
self::$_instance = new DB();
}
return self::$_instance;
}
public function query($sql, $params = array()) {
$this->_error = false;
if($this->_query = $this->_pdo->prepare($sql)) {
$x = 1;
if(count($params)) {
foreach($params as $param){
$this->_query->bindValue($x, $param);
$x++;
}
}
}
if($this->_query->execute()) {
$this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
$this->_count = $this->_query->rowCount();
}
else{
$this->_error = true;
}
return $this;
}
public function action($action, $table, $where = array()) {
if(count($where) ===3) {
$operators = array('=', '>', '<', '>=', '<=');
$field = $where[0];
$operator = $where[1];
$value = $where[2];
if(in_array($operator, $operators)) {
$sql = "{$action} FROM {$table} WHERE {$field} = ?";
if(!$this->query($sql, array($value))->error()) {
return $this;
}
}
}
return false;
}
public function get($table, $where) {
return $this->action('SELECT *', $table, $where);
public function results() {
return $this->_results;
}
public function first() {
return $this->_results[0];
}
public function count() {
return $this->_count;
}
}
pour accéder aux informations, j'utilise ce code sur le script du contrôleur:
<?php
$pagetitle = 'Teknikal Tim - Service Call Reservation';
$pagedescription = 'Teknikal Tim Sevice Call Reservation Page';
require_once $_SERVER['DOCUMENT_ROOT'] .'/core/init.php';
$newsMessage = 'temp message';
$servicecallsdb = DB::getInstance()->get('tt_service_calls', array('UserID',
'=','$_SESSION['UserID']));
if(!$servicecallsdb) {
// $servicecalls[] = array('ID'=>'','ServiceCallDescription'=>'No Service Calls');
} else {
$servicecalls = $servicecallsdb->results();
}
include 'servicecalls.html.php';
?>
puis, pour afficher les informations, je vérifie si servicecalls a été défini et a un nombre supérieur à 0. N'oubliez pas que ce n'est pas un tableau que je référence, alors j'accède aux enregistrements avec l'opérateur d'objet "->" comme ceci:
<?php include $_SERVER['DOCUMENT_ROOT'] .'/includes/header.html.php';?>
<!--Main content-->
<div id="mainholder"> <!-- div so that page footer can have a minum height from the
header -->
<h1><?php if(isset($pagetitle)) htmlout($pagetitle);?></h1>
<br>
<br>
<article>
<h2></h2>
</article>
<?php
if (isset($servicecalls)) {
if (count ($servicecalls) > 0){
foreach ($servicecalls as $servicecall) {
echo '<a href="/servicecalls/?servicecall=' .$servicecall->ID .'">'
.$servicecall->ServiceCallDescription .'</a>';
}
}else echo 'No service Calls';
}
?>
<a href="/servicecalls/?new=true">Raise New Service Call</a>
</div> <!-- Main content end-->
<?php include $_SERVER['DOCUMENT_ROOT'] .'/includes/footer.html.php'; ?>
J'ai eu cette erreur à l'improviste parce que mon identifiant facebook a soudainement cessé de fonctionner (j'avais également changé d'hôtes) et a lancé cette erreur. La solution est vraiment facile
Le problème était dans ce code
$response = (new FacebookRequest(
FacebookSession::newAppSession($this->appId, $this->appSecret),
'GET',
'/oauth/access_token',
$params
))->execute()->getResponse(true);
if (isset($response['access_token'])) { <---- this line gave error
return new FacebookSession($response['access_token']);
}
En principe, la fonction isset () attend un tableau mais trouve un objet. La solution simple consiste à convertir l'objet PHP en tableau à l'aide de (tableau) quantificateur. Ce qui suit est le code fixe.
$response = (array) (new FacebookRequest(
FacebookSession::newAppSession($this->appId, $this->appSecret),
'GET',
'/oauth/access_token',
$params
))->execute()->getResponse(true);
Notez le quantificateur use off array () en première ligne.
Le changer pour
$results->fetch_array()