JeuWeb - Crée ton jeu par navigateur
Enregistrements MySQL vers JSON : conserver des entiers au lieu des chaines varchar - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Enregistrements MySQL vers JSON : conserver des entiers au lieu des chaines varchar (/showthread.php?tid=2031)

Pages : 1 2


Enregistrements MySQL vers JSON : conserver des entiers au lieu des chaines varchar - Furukoo - 28-09-2010

Bonjour
J'utilise ce script pour renvoyer les infos des joueurs inscrits et leurs données associées

<?php include 'define_bdd.php';
ob_start('ob_gzhandler');
$encodable = array();
$connect = mysql_connect(HOST,USER,PASS) or die('Erreur de connexion');
if (!mysql_select_db(BDD,$connect))return 0; if (!$connect)return 0;
$query = 'SELECT `user`,`rate`,`v`,`l`,`d` FROM furukoo ORDER BY rate DESC';
$result = mysql_query($query); mysql_close($connect); if (!$result)return 0;
while($obj = mysql_fetch_object($result)){$encodable[] = $obj;}
mysql_free_result($result);
echo json_encode($encodable);
ob_end_flush();
?>

Le serveur retourne la chaine JSON sous cette forme


[{"user":"Yvan","rate":"1982","v":"906","l":"99","d":"1"},
{"user":"jflx","rate":"1860","v":"85","l":"40","d":"0"},
{"user":"Tracker","rate":"1844","v":"33","l":"40","d":"0"},
{"user":"camick","rate":"1834","v":"9","l":"3","d":"0"}
...]

Sur base de données MySQL les champs rate, v, l, d sont de Type int(11).

Est ce possible de générer une chaine JSON qui renvoie les enregistrement sous cette forme ?


[{"user":"Yvan","rate":1982,"v":906,"l":99,"d":1},
{"user":"jflx","rate":1860,"v":85,"l":40,"d":0},
{"user":"Tracker","rate":1844,"v":33,"l":40,"d":0},
{"user":"camick","rate":1834,"v":9,"l":3,"d":0}
...]

sous une forme numérique donc ...

Merci


RE: retourner une chaine JSON - Sephi-Chan - 28-09-2010

Ça peut t'intéresser : http://www.php.net/manual/en/function.json-encode.php#94629


Sephi-Chan


RE: retourner une chaine JSON - Furukoo - 28-09-2010

Merci ça fonctionne impec.

Pour info j'ai corrigé comme ça :




<?php include 'define_bdd.php';
ob_start('ob_gzhandler');
$connect = mysql_connect(HOST,USER,PASS) or die('Erreur de connexion');
if (!mysql_select_db(BDD,$connect))return 0; if (!$connect)return 0;
$query = 'SELECT `user`,`rate`,`v`,`l`,`d` FROM furukoo ORDER BY rate DESC';
$result = mysql_query($query); mysql_close($connect); if (!$result)return 0;
while ($row = mysql_fetch_assoc($result)) {
// for every field in the result..
for ($i=0; $i < mysql_num_fields($result); $i++) {
$info = mysql_fetch_field($result, $i);
$type = $info->type;
// cast for int
if ($type == 'int')
$row[$info->name] = intval($row[$info->name]);
}
$rows[] = $row;
}
mysql_free_result($result);
echo json_encode($rows);
ob_end_flush();
?>



RE: Enregistrements MySQL vers JSON : conserver des entiers au lieu de chaînes numériques - Sephi-Chan - 28-09-2010

Tant mieux ! Je déplace ton sujet en demande d'aide, je le mets en [Résolu] et je lui donne un nom plus parlant ! Smile


Sephi-Chan


RE: Enregistrements MySQL vers JSON : conserver des entiers au lieu des chaines varchar() - Furukoo - 27-10-2010

Je m'excuse de réouvir ce post.
Les réponses apportées étant trés satisfaisantes.

Je voudrais aller un peu plus loin en fait, et je ne sais pas si c'est possible.
Aujourd'hui, ma chaine json retournée est bien sous cette forme :


[{"user":"Yvan","rate":1962,"v":933,"l":100,"d":1},
{"user":"jflx","rate":1860,"v":85,"l":40,"d":0},
{"user":"Tracker","rate":1844,"v":33,"l":40,"d":0},
{"user":"camick","rate":1834,"v":9,"l":3,"d":0} ... ]

Est ce possible de supprimer les entêtes de la chaine json qui sont répétées autant de
fois qu'il y a d'enregistrements ?

Avoir une chaine json sous cette forme par exemple :


[{"Yvan",1962,933,100,1},
{"jflx",1860,85,40,0},
{"Tracker",1844,33,40,0},
{"camick",1834,9,3,0} ... ]

Merci d'avance pour votre coop


RE: Enregistrements MySQL vers JSON : conserver des entiers au lieu des chaines varchar() - Sephi-Chan - 27-10-2010

Peux-tu nous montrer le var_dump de ta variable $row ?


RE: Enregistrements MySQL vers JSON : conserver des entiers au lieu des chaines varchar - Ter Rowan - 27-10-2010

suffit de ne pas lancer json encode non ?


RE: Enregistrements MySQL vers JSON : conserver des entiers au lieu des chaines varchar() - Furukoo - 27-10-2010

(27-10-2010, 07:42 PM)Sephi-Chan a écrit : Peux-tu nous montrer le var_dump de ta variable $row ?

le var_dump donne ça

array(440) { [0]=> array(5) { ["user"]=> string(4) "Yvan" ["rate"]=> int(1962) ["v"]=> int(933) ["l"]=> int(100) ["d"]=> int(1) } [1]=> array(5) { ["user"]=> string(4) "jflx" ["rate"]=> int(1860) ["v"]=> int(85) ["l"]=> int(40) ["d"]=> int(0) } [2]=> array(5) { ["user"]=> string(7) "Tracker" ["rate"]=> int(1844) ["v"]=> int(33) ["l"]=> int(40) ["d"]=> int(0) } [3]=> array(5) { ["user"]=> string(6) "camick" ["rate"]=> int(1834) ["v"]=> int(9) ["l"]=> int(3) ["d"]=> int(0) } ...


RE: Enregistrements MySQL vers JSON : conserver des entiers au lieu des chaines varchar - Sephi-Chan - 27-10-2010

Ok. Donc tu veux seulement récupérer les valeurs qui caractérisent un utilisateur. Tu peux donc faire :


$rows[] = array_values($row);

Ainsi, l'objet JSON aura la forme suivante :


[
[ "Yvan", 1962, 933, 100, 1 ],
[ "jflx", 1860, 85, 40, 0 ],
[ "Tracker", 1844, 33, 40, 0 ],
[ "camick", 1834, 9, 3, 0 ],
...
]

Par contre, pourquoi souhaites-tu faire ça ? Tu perds complètement le sens de tes données avec cette approche.


Sephi-Chan


RE: Enregistrements MySQL vers JSON : conserver des entiers au lieu des chaines varchar - Furukoo - 27-10-2010

C'est à titre expérimental.
Je me demandais si ça vallait le coup de diminuer le volume de données transmises
(20 Ko pour 400 utilisateurs)

Donc effectivement je divise par 2 le volume de données 10 Ko à la place de 20 Ko.
Le temps de transmission reste identique par contre. (peut être du au fait que c'est zippé)

en tout cas merci pour ton aide .. c'est toujours super interressant d'avoir ton avis.