Kommunauty
Connexion
Inscription

Problème PHP : json_encode retourne null


Izindor Messages : 4

Bonjour à tous,

Suite à l'aide de Lucas et Courroux, je viens poster ici une petite demande d'aide concernant du PHP 5.0 non objet.

Voici donc le code incriminé :


$data['result'] ='
<form method="post" action="./index.php">
<table>
<tr>
<td colspan="3">';
foreach ($_SESSION['compagnies'] AS $compagnies)
{
$selectionne = ($compagnies['eID']==$_SESSION['compagnie']['eID']) ? 'class="selected"' :NULL;
$data['result'].='
<a href="#eid='.$compagnies['eID'].'" title="'.$compagnies['escouade'].'" '.$selectionne.'>
<img src="imgs/unite/'.$compagnies['mID'].'.png" alt="" />
</a>';
} $data['result'].='
La compagnie sélectionnée est : '.$_SESSION['compagnie']['eID'].'
</td>
</tr>
</table>
</form>';

Sur cette page, par exemple :

1) $data['result'] ='test'; fonctionne et retourne bien 'test';

2) $data['result'] ='test' + $data['result'].='2'; plante et renvoie 'null';

Je ne comprends pas du tout d'ou pourrait provenir le bug, cet extrait provient d'une PHP appelée par une requête AJAX, et lorsque j'avais ce code sur une page PHP pur, tout fonctionnait niquel ! Pire encore, j'utilise le même système (.=) sur d'autres pages appelées via JS et tout fonctionne 0.0

D'ou pourrait bien provenir ce bug ? Avec Lucas que je remercie énormément encore ici, nous étions à cours d'idée, mais avons réussi à trouver que l'erreur vient réellement de la déclaration de cette satanée variable $data !

Voici le code complet de la page pour information :
Fermer ce cadre


<?php session_start();ob_start();
define('007',TRUE);define('SCARABE','Tu es perdu petit scarabé ?');
require '/home/www/zazou/mediewar/inc/bdd.php';
require '/home/www/zazou/mediewar/inc/session.php';
require '/home/www/zazou/mediewar/inc/fonctions.php';
///////////////////////////////////////////////////////////////////////////////////////////////////
if(!defined('007') || !Connecte()) exit(SCARABE);
///////////////////////////////////////////////////////////////////////////////////////////////////

$data = array('error' => '','result' => '');
$_GET['eid'] = intval(trim($_GET['eid']));

if (ctype_digit($_GET['eid'])) {

$eid = ($_GET['eid'] =! 0) ? $_GET['eid'] : $_SESSION['compagnie']['eID'];

if (PlayerValideID('eID', $eid, 'z_escouade', $BDD)) {
$req_compagnie=$BDD->prepare(' SELECT e.eID, e.escouade, e.effectif, e.pa, e.moral, e.formation, c.x, c.y,
m.mID, m.metier, m.effectif_max, m.attaque, m.pv, m.portee, m.vision
FROM z_escouade e
LEFT JOIN z_metier m USING (mID)
LEFT JOIN z_carte c USING (eID)
LEFT JOIN z_seigneur s USING (sID)
WHERE e.eID=:eID');
$req_compagnie->bindValue(':eID', $eid, PDO::PARAM_INT);
$req_compagnie->execute();

$_SESSION['compagnie'] = $req_compagnie->fetch(PDO::FETCH_ASSOC);

$data['result'] ='
<form method="post" action="./index.php">
<table>
<tr>
<td colspan="3">';
foreach ($_SESSION['compagnies'] AS $compagnies)
{
$selectionne = ($compagnies['eID']==$_SESSION['compagnie']['eID']) ? 'class="selected"' :NULL;
$data['result'].='
<a href="#eid='.$compagnies['eID'].'" title="'.$compagnies['escouade'].'" '.$selectionne.'>
<img src="imgs/unite/'.$compagnies['mID'].'.png" alt="" />
</a>';
} $data['result'].='
La compagnie sélectionnée est : '.$_SESSION['compagnie']['eID'].'
</td>
</tr>';/*{
<tr>
<td>
<img src="imgs/'.$row['mID'].'eff.png" alt="[Effectif]" title="Effectif" /> '.$row['effectif'].'/'.$row['effectif_max'].'</br>
<img src="imgs/'.$row['mID'].'att.png" alt="[Attaque]" title="Attaque" /> '.$row['attaque'].'</br>
<img src="imgs/def.png" alt="[Défense]" title="Défense" /> '.$row['pv'].'
</td>
<td>
<img src="imgs/portee.png" alt="[Portée]" title="Portée" /> '.$row['portee'].'</br>
<img src="imgs/moral.png" alt="[Moral]" title="Moral" /> '.$row['moral'].'</br>
<img src="imgs/pa.png" alt="[PA]" title="Points d\'Action" /> '.$row['pa'].'
</td>
</tr>}*/ $data['result'].='
</table>
</form>';

} else $data['error'] = 'Cette compagnie ne nous appartient pas ou n\'existe pas !';
} else $data['error'] = 'Impossible de vérifier que la compagnie existe bien : ID incorrect.';


///////////////////////////////////////////////////////////////////////////////////////////////////
header('Content-type: application/json');
echo json_encode($data); ?>

Merci énormément d'avance !

mardi 17 juillet 2012

SiMax Messages : 7572

Salut !

Je ne sais pas si j'ai bien compris : tu veux juste coller les trois éléments ?

Si c'est ça, le "+" effectue une addition numérique, pour coller deux variables il faut juste un point. Essaye :

$data['result'] = 'test'.$data['result'].'2';
mardi 17 juillet 2012

Izindor Messages : 4

Non ce n'est pas cela SiMax. Le problème c'est que si on déclare par exemple $data['result'] ='test'; cela fonctionne parfaitement, le mot 'test ' s'affiche bien sur la page de retour. Mais là ou c'est complètement tordu, c'est que dès l'instant ou on commence à déclarer cette variable (ex : $data['result'] ='test 2' et qu'on y ajoute par la suite d'autres données (ex : $data['result'].='test 3', $data['result'] vaut alors "null", comme si elle n'était même pas déclarée ! (il faut se dire qu'il n'y a pas d'apostrophes autour du mot "null" quand on regarde sur Firebug le retour de la fonction AJAX, donc cela voudrait dire que soit la variable n'est même plus déclarée, soit elle est inconnue... Pourtant sur mon code pHP que tu vois ici elle est déclarée :S !).

Tu vois ou je veux en venir ?

mardi 17 juillet 2012

SiMax Messages : 7572

Et quand tu es sous PHP uniquement, sans AJAX, ça fonctionne correctement ? Que retourne la variable $data['result'] ? Et que retourne json_encode($data) ?

Et en AJAX, si tu fais directement $data['result'] = 'test 3'; ça fonctionne ? (pour tester avec un espace)

mardi 17 juillet 2012 (Dernière édition mardi 17 juillet 2012)

Izindor Messages : 4

Désolé du timming, j'ai commencé à bosser et j'ai été indisponible avant le week-end. Lorsque je suis sous PHP, la page en entier fonctionne à merveille, et je n'ai aucun soucis. C'est en ajax que ça merdouille. Je teste avec un espace et je te dis ça !

EDIT : un des bugs est résolu. Je faisais un intval($variable) avant de faire une condition ctype_digit($variable), ce qui provoquait forcément un refus d'entrer dans la condition étant donné que ctype_digit ne fonctionne bien que pour des chaînes de caractères !

Maintenant quand j'ajoute un echo data(result) cela m'affiche dans firebug en retour le bon texte. Cependant lorsque je vire cet echo et que je passe par le json_encode habituel, result reprend la valeur "null" comme à son habitude :/...

samedi 21 juillet 2012 (Dernière édition samedi 21 juillet 2012)

SiMax Messages : 7572

Si tu as au moins PHP 5.3, fais un json_last_error(), ça nous en dira peut être plus.

Sinon ça peut aussi venir d'un problème d'encodage et/ou caractères spéciaux, vérifie bien de ce côté et essaye peut être un petit utf8_encode et/ou htmlentities.

EDIT : vérifie aussi directement l'encodage de tes fichiers.

samedi 21 juillet 2012 (Dernière édition samedi 21 juillet 2012)

Izindor Messages : 4

Je viens de trouver l'erreur grâce à toi : mauvais encodage de la page... Je suis effaré. Je vérifie l'encodage de la page, il me dit "UTF8 sans boom" sous Notepad++, super donc. Je fais une modification, je vérifie : AINSI !!! J’hallucine !!! Je viens de repasser en UTF8 et là ça fonctionne du tonnerre. Comment c'est possible un truc pareil ? Je rêve 0.0......

Merci pour ton aide

samedi 21 juillet 2012 (Dernière édition samedi 21 juillet 2012)

SiMax Messages : 7572

De rien ! N'hésite pas à passer de temps en temps sur le forum pour aider les débutants ou pour discuter programmation

samedi 21 juillet 2012

Répondre Pour répondre, tu dois d'abord t'inscrire rapidement sur Kommunauty. Rejoins-nous vite !