Réponse multiple avec JSON

Eléphanteau du PHP | 43 Messages

27 mai 2011, 11:20

Bonjour. Après des heures de lecture et de recherche, je me retourne vers vous tous pour mon problème.
Après une requête PHP/MYSQL, je transforme le résultat en chaîne JSON.

Code : Tout sélectionner

$row = mysql_fetch_assoc($query) $json = json_encode($row);
la chaîne JSON est sous la forme {"pseudo": "Toto", "NIVEAU": "1"}
Il m'est donc possible de récupérer les variables sous Ajax:

Code : Tout sélectionner

reponse=eval('('+xhr_object.responseText+')'); $(div).innerHTML='Pseudo: '+reponse.pseudo+"<br/>\n"+'Niveau: '+reponse.NIVEAU;
Tout va bien.

Mais le problème vent lorque le retour MYSQL renvoit plusieurs lignes de réponses:
La chaîne JSON ressemble alors à 3 lignes {"pseudo": "Toto", "NIVEAU": "1"}{"pseudo": "Titi", "NIVEAU": "2"}{"pseudo": "Tito", NIVEAU": "3"}
et Ajax renvoit une erreur au Navigateur sur le format de la chaîne, même en tentant les

Code : Tout sélectionner

$(div).innerHTML='Pseudo: '+reponse.pseudo[1]+"<br/>\n"+'Niveau: '+reponse.NIVEAU[1];
J'ai alors vu que la chaîne JSON devrait être séparée par des virgules, et plus précisement sous la forme :

Code : Tout sélectionner

{"user": [ {"pseudo": "Toto", "NIVEAU": "1"}, {"pseudo": "Titi", "NIVEAU": "2"}, {"pseudo": "Tito", "NIVEAU": "3"} ] };
voir http://www.json.org/js.html

et la commande javascript : $(div).innerHTML += 'Pseudo: '+reponse.user[2].pseudo+"<br/>\n"+'Niveau: '+reponse.user[2].NIVEAU;
fonctionne.

Ma question est : comment faire pour que la chaîne multiple soit retournée au bon format en PHP ?
L'essai suivant me retourne des réponses en duplicata
<?php

// Accès MySQL
    include '../commun/connexion.inc.php';
	include '../commun/fonctions.inc.php';
	
	// $pseudo = $_GET['pseudo'];
	// $sql = "select * from tbl_user where pseudo='$pseudo'";
	$table = 'tbl_user';
	$sql = "select * from $table";
	$query = mysql_query($sql);
	$numrows = mysql_num_rows($query);
	echo '{"user"'.": [ ";	
	$json = ''; 
while ($row = mysql_fetch_assoc($query)) {
		if ($json == '') $json = json_encode($row); // 1ère ligne sans début de virgule
		else {$json .= ", ".json_encode($row); // lignes suivantes séparées par une virgule sauf la fin
		echo $json;}
		}
	echo " ] }";
?>

Merci de votre aide !

(Le défi ultérieur consitera à itérer la chaîne JSON en javasript pour afficher tous les résultats)
mctarek

Eléphant du PHP | 127 Messages

27 mai 2011, 11:33

Je te conseille de stocker tes résultats dans un tableau et de n'utiliser le json_encode qu'un seule fois sur ton tableau de données. Cette fonction encode très bien les tableaux ;)
(code non testé)
<?php
        // Accès MySQL
        include '../commun/connexion.inc.php';
        include '../commun/fonctions.inc.php';
        
        // $pseudo = $_GET['pseudo'];
        // $sql = "select * from tbl_user where pseudo='$pseudo'";
        $table = 'tbl_user';
        $sql = "select * from $table";
        $query = mysql_query($sql);
        $numrows = mysql_num_rows($query);
        $resultats = array():
        while ($row = mysql_fetch_assoc($query)) {
                $resultats[] = $row;
                }
        echo json_encode($resultats);
?>

Eléphanteau du PHP | 15 Messages

27 mai 2011, 11:34

Salut,
essai d'encoder un tableau complet la je pense que tu encodes chaque ligne

$row = mysql_fetch_assoc($query)
$json = json_encode($row);

essai de faire plutot :

while ($row = mysql_fetch_assoc($query)){
$ligne[]=$row;
}
$json = json_encode($ligne);
Agence de communication et de formation aux outils du web marketing http://www.linesoft.fr
Plateforme d'emailing - création de newsletter - gestion de campagnes d' email marketing http://www.emailing-express10.fr
Ressources pour webmaster gratuites ,icones,fichiers vectoriels,psd ... http://www.ressource-web.fr

Eléphanteau du PHP | 43 Messages

27 mai 2011, 11:52

Résolu ! Merci à vous tous. mctarek.

Gablain
Invité n'ayant pas de compte PHPfrance

11 janv. 2014, 00:04

Merci beaucoup !!