Pages :
(reprise du message précédent)

Bon, j'ai trouvé d'où cela vient, mais pas comment résoudre

Ceci provoque l'erreur dont je parle à mon premier post soit JSON.parse: unexpected character
texte=file('http://localhost/football2/sallesDesMachines/synchro.inc.php?NumeroRencontre='+escape(numero));
console.log(texte);
myJsonObj = JSON.parse(texte);


console.log :
"[{"date":"2008-09-28","Stade":null,"Terrain":null,"Lieu":"AVENUE DE PARIS","Ville":"79260 LA CRECHE","SaisieDistance":"13","equipelocalesaisie":"La Cr\u00e8che 2","equipevisiteusesaisie":"St Maxire AV S 2","competition":"4\u00c8ME DIVISION","choix_journee":"","choix_poste":"Arbitre centre","NomArbitre":null,"NomAssistant1":null,"NomAssistant2":null,"ArbitreRemplacant":null,"NomDeleguePrincipal":null,"NomDelegueAjoint":null,"NomDelegueAccompagnateur":null,"ObservateurPrincipal":null,"ObservateurAdjoint1":null,"ObservateurAdjoint2":null}]"


alors qu'avec ceci :

texte = '[{"date":"2008-09-28","Stade":null,"Terrain":null,"Lieu":"AVENUE DE PARIS","Ville":"79260 LA CRECHE","SaisieDistance":"13","equipelocalesaisie":"La Cr\u00e8che 2","equipevisiteusesaisie":"St Maxire AV S 2","competition":"4\u00c8ME DIVISION","choix_journee":"","choix_poste":"Arbitre centre","NomArbitre":null,"NomAssistant1":null,"NomAssistant2":null,"ArbitreRemplacant":null,"NomDeleguePrincipal":null,"NomDelegueAjoint":null,"NomDelegueAccompagnateur":null,"ObservateurPrincipal":null,"ObservateurAdjoint1":null,"ObservateurAdjoint2":null}]';
			
myJsonObj = JSON.parse(texte);
        
alert(myJsonObj[0].equipelocalesaisie);


Me donne : La Crèche 2 soit ma donnée!

La différence qu'il y a, c'est qu'au début et à la fin de texte, il y a des ' ou lieu des "

Je pense donc que j'ai un problème en amont au niveau de

echo json_encode($ligne);


me donne

[{"date":"2008-09-28","Stade":null,"Terrain":null,"Lieu":"AVENUE DE PARIS","Ville":"79260 LA CRECHE","SaisieDistance":"13","equipelocalesaisie":"La Cr\u00e8che 2","equipevisiteusesaisie":"St Maxire AV S 2","competition":"4\u00c8ME DIVISION","choix_journee":"","choix_poste":"Arbitre centre","NomArbitre":null,"NomAssistant1":null,"NomAssistant2":null,"ArbitreRemplacant":null,"NomDeleguePrincipal":null,"NomDelegueAjoint":null,"NomDelegueAccompagnateur":null,"ObservateurPrincipal":null,"ObservateurAdjoint1":null,"ObservateurAdjoint2":null}]

Modifié par ledisciple1 (19 Oct 2013 - 13:33)
ledisciple1 a écrit :
Bon, j'ai trouvé d'où cela vient, mais pas comment résoudre

Ceci provoque l'erreur dont je parle à mon premier post soit JSON.parse: unexpected character
texte=file('http://localhost/football2/sallesDesMachines/synchro.inc.php?NumeroRencontre='+escape(numero));
console.log(texte);
myJsonObj = JSON.parse(texte);


console.log :
"[{"date":"2008-09-28","Stade":null,"Terrain":null,"Lieu":"AVENUE DE PARIS","Ville":"79260 LA CRECHE","SaisieDistance":"13","equipelocalesaisie":"La Cr\u00e8che 2","equipevisiteusesaisie":"St Maxire AV S 2","competition":"4\u00c8ME DIVISION","choix_journee":"","choix_poste":"Arbitre centre","NomArbitre":null,"NomAssistant1":null,"NomAssistant2":null,"ArbitreRemplacant":null,"NomDeleguePrincipal":null,"NomDelegueAjoint":null,"NomDelegueAccompagnateur":null,"ObservateurPrincipal":null,"ObservateurAdjoint1":null,"ObservateurAdjoint2":null}]"


alors qu'avec ceci :

texte = '[{"date":"2008-09-28","Stade":null,"Terrain":null,"Lieu":"AVENUE DE PARIS","Ville":"79260 LA CRECHE","SaisieDistance":"13","equipelocalesaisie":"La Cr\u00e8che 2","equipevisiteusesaisie":"St Maxire AV S 2","competition":"4\u00c8ME DIVISION","choix_journee":"","choix_poste":"Arbitre centre","NomArbitre":null,"NomAssistant1":null,"NomAssistant2":null,"ArbitreRemplacant":null,"NomDeleguePrincipal":null,"NomDelegueAjoint":null,"NomDelegueAccompagnateur":null,"ObservateurPrincipal":null,"ObservateurAdjoint1":null,"ObservateurAdjoint2":null}]';
			
myJsonObj = JSON.parse(texte);
        
alert(myJsonObj[0].equipelocalesaisie);


Me donne : La Crèche 2 soit ma donnée!

La différence qu'il y a, c'est qu'au début et à la fin de texte, il y a des ' ou lieu des "

Je pense donc que j'ai un problème en amont au niveau de

echo json_encode($ligne);


me donne

[{"date":"2008-09-28","Stade":null,"Terrain":null,"Lieu":"AVENUE DE PARIS","Ville":"79260 LA CRECHE","SaisieDistance":"13","equipelocalesaisie":"La Cr\u00e8che 2","equipevisiteusesaisie":"St Maxire AV S 2","competition":"4\u00c8ME DIVISION","choix_journee":"","choix_poste":"Arbitre centre","NomArbitre":null,"NomAssistant1":null,"NomAssistant2":null,"ArbitreRemplacant":null,"NomDeleguePrincipal":null,"NomDelegueAjoint":null,"NomDelegueAccompagnateur":null,"ObservateurPrincipal":null,"ObservateurAdjoint1":null,"ObservateurAdjoint2":null}]
benj a écrit :
J'avais espérer que tu mettrais le code te la fonction Smiley biggrin

function file(fichier)
{
	if(window.XMLHttpRequest) // FIREFOX
	xhr_object = new XMLHttpRequest();
	else if(window.ActiveXObject) // IE
	xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
	else
	return(false);
	xhr_object.open('GET', fichier, false);
	xhr_object.send(null);
	if(xhr_object.readyState == 4) return(xhr_object.responseText);
	else return(false);
}
Salut Ledisciple1.

Cela ne m'est même pas venu à l'esprit, vu que partout, j'utilise toujours les guillemets au lieu des apostrophes pour encadrer une chaîne de caractères.

La différence vient que les apostrophes ne convertissent pas ce qui doit être convertie, à l'inverse des guillemets. Voici un lien donnant quelques explications.

Dans le cas des accès à MySql, je procède ainsi selon ce que je désire faire.

1) juste un select classique.
Exemple : $requete = "select * from tab_login";

La variable requète est une chaine de caractères. D'où en début et en fin de chaine, les guillemets.
Tu peux mettre aussi les apostrophes, dans ce cas là, cela ne changera rien !
Je te conseil de toujours mettre les guillemets.

2) un select un peu moins classique avec le passage d'une valeur php.
Exemple : $requete = "select * from tab_login where login='+$login+' and password='+$pswd+'";

Si tu veux passer une variable php à cette chaine, tu mets cette variables entre apostrophes droits.
Il n'est pas nécessaire de faire une concaténation en ajoutant le "+", mais si je le fais, c'est par respect de la syntaxe correcte.

3) les chaines de caractères interprété par MySql.
Je ne sais pas comment se nomme ce caractère, mais c'est un apostrophe penché sur la gauche.
L'apostrophe droit se trouve sur la touche 4 de mon clavier et l'apostrophe penché se trouve sur la touche 7.

Exemple : $requete = "INSERT INTO `tab_access`(`ID_REPERTOIRE`, `ID_LIEN`, `CODE_PERIODE`, `NBRE_ACCESS`, `DATE_PERIODE`) VALUES ('+$id_repertoire+','+$id_lien+','+$code_periode+','+$nbre_access+','+$date_periode+')";

En respectant ces particularités, je n'ai jamais eu vraiment besoin de convertir les chaines de caractères avec la commande "utf8-encode".

Edit : pourquoi je fais un panachage entre les apostrophes et les guillemets ?
C'est pour éviter t'introduire l'anti-slash que l'on met devant une apostrophes.
Exemple : $requete = 'select * from tab_login where login=\'+$login+\' and password=\'+$pswd+\'';
Dans cette exemple, il n'y a que des apostrophes, et je ne trouves pas cela très esthétique.

@+
Modifié par tournikoti (20 Oct 2013 - 03:02)
je viens de tester ton code et je n'obtiens pas d'erreur.

Voici le contenu des 2 fichiers. Peut tu tester exactement comme cela et nous dire si c'est ok ?

Fichier test

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title>test</title>
</head>
<body>
<script>
    function file(fichier)
    {
        if(window.XMLHttpRequest) // FIREFOX
        xhr_object = new XMLHttpRequest();
        else if(window.ActiveXObject) // IE
        xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
        else
        return(false);
        xhr_object.open('GET', fichier, false);
        xhr_object.send(null);
        if(xhr_object.readyState == 4) return(xhr_object.responseText);
        else return(false);
    }
    texte=file('http://localhost/Sites/test/test2.php');
    console.log(texte);
    myJsonObj = JSON.parse(texte);
</script>
</body>


Fichier test 2
[{"date":"2008-09-28","Stade":null,"Terrain":null,"Lieu":"AVENUE DE PARIS","Ville":"79260 LA CRECHE","SaisieDistance":"13","equipelocalesaisie":"La Cr\u00e8che 2","equipevisiteusesaisie":"St Maxire AV S 2","competition":"4\u00c8ME DIVISION","choix_journee":"","choix_poste":"Arbitre centre","NomArbitre":null,"NomAssistant1":null,"NomAssistant2":null,"ArbitreRemplacant":null,"NomDeleguePrincipal":null,"NomDelegueAjoint":null,"NomDelegueAccompagnateur":null,"ObservateurPrincipal":null,"ObservateurAdjoint1":null,"ObservateurAdjoint2":null}]
non désolé, toujousr parse erreror

j'ai essayé

if(!empty($ligne)){
            echo json_encode($ligne,JSON_HEX_QUOT);
        }


avec

texte=file('http://localhost/football2/sallesDesMachines/synchro.inc.php?NumeroRencontre='+escape(numero));
    myJsonObj = JSON.parse(texte);
        console.log(myJsonObj);


mais sans succès. J'ai l'impression que JSON_HEX_QUOT n'est pas pris en compte, car l'échappement n'apparait pas dans le log
Le json que tu nous as transmis et que j'ai mis dans le fichier test2.php est bon. Pourquoi donc regarde-tu le code php qui le génère ?

Dans qu'elle navigateur fait tu ton test ? J'ai tester de mon coté qu'avec Firefox.
Bonsoir à toutes et à tous.

@ benji : non, tu ne peux pas obtenir le bon résultat ! Smiley eek
Et en l'état de ce que propose lediscisple1, il récupère en sortie l'exacte correspondance de ce qu'il y a en entrée.
Sauf que le fichier en entrée est incorrecte !
Et à cause de ce fichier non conforme, le JSON.parse provoque une erreur.

@ ledisciple1 : J'ai fait le test chez moi et cela fonctionne très bien. Nul besoin de mettre le "myJsonObj = JSON.parse(texte);" pour convertir quoi que ce soit.

Quel est le problème ?

1) dans le fichier " test 2", tu as "equipelocalesaisie":"La Cr\u00e8che 2" ! L'unicode "/u00e8" correspond au caractère "è".

Donc pourquoi dans le fichier "test 2 " as-tu ce schmilblick ?
Si tu es bien en "UTF-8" comme tu le prétends, tu dois avoir le bon caractère "è" et pas autre chose !

Donc comment ce caractère unicode est arrivé dans ce fichier ?
Ce fichier a-t-il subit une conversion ?

2) nul besoin de convertir quoi que ce soit, vu que de bout en bout, tu es en "UTF-8".
Comme ton fichier en entrée n'est pas conforme à la codification UTF-8", le "JSON.parse" ne fonctionne pas correctement.

3) petite remarque sans rapport avec ton problème.
La bonne détection pour faire de l'Ajax est :
/*============================================*/
/*     Création de l'Objet XMLHttpRequest     */
/*============================================*/

function CreationXHR()
{
	var result = null;

	try	{ result = new XMLHttpRequest(); }

	catch (Error)
	{
		try	{ result = new ActiveXObject("Msxml2.XMLHTTP");	}

		catch (Error)
		{
			try { result = new ActiveXObject("Microsoft.XMLHTTP"); }

			catch (Error)
			{
				result = null;
			}
		}
	}

	return result;
}

Donc en faisant, par exemple :

objetXHR = CreationXHR();

if (objetXHR == null)
{
la détection ne s est pas faite
}
else
{
tout est bon !
}

@+
Modifié par tournikoti (21 Oct 2013 - 02:22)
tournikoti a écrit :


@ ledisciple1 : J'ai fait le test chez moi et cela fonctionne très bien. Nul besoin de mettre le &quot;myJsonObj = JSON.parse(texte);&quot; pour convertir quoi que ce soit.


Je suis donc maudit ! Smiley decu

tournikoti a écrit :

1) dans le fichier &quot; test 2&quot;, tu as &quot;equipelocalesaisie&quot;:&quot;La Cr\u00e8che 2&quot; ! L'unicode &quot;/u00e8&quot; correspond au caractère &quot;è&quot;.

Donc pourquoi dans le fichier &quot;test 2 &quot; as-tu ce schmilblick ?
Si tu es bien en &quot;UTF-8&quot; comme tu le prétends, tu dois avoir le bon caractère &quot;è&quot; et pas autre chose !

Mais tout est bien converti avec le

echo json_encode($ligne);


Ceci est le résultat de echo

[{"date":"2008-09-28","Stade":null,"Terrain":null,"Lieu":"AVENUE DE PARIS","Ville":"79260 LA CRECHE","SaisieDistance":"13","equipelocalesaisie":"La Cr\u00e8che 2","equipevisiteusesaisie":"St Maxire AV S 2","competition":"4\u00c8ME DIVISION","choix_journee":"","choix_poste":"Arbitre centre","NomArbitre":null,"NomAssistant1":null,"NomAssistant2":null,"ArbitreRemplacant":null,"NomDeleguePrincipal":null,"NomDelegueAjoint":null,"NomDelegueAccompagnateur":null,"ObservateurPrincipal":null,"ObservateurAdjoint1":null,"ObservateurAdjoint2":null}]


Ensuite je le récupère comme ceci

texte=file('http://localhost/football2/sallesDesMachines/synchro.inc.php?NumeroRencontre='+escape(numero));
console.log(texte);


le résultat de console.log

"[{"date":"2008-09-28","Stade":null,"Terrain":null,"Lieu":"AVENUE DE PARIS","Ville":"79260 LA CRECHE","SaisieDistance":"13","equipelocalesaisie":"La Cr\u00e8che 2","equipevisiteusesaisie":"St Maxire AV S 2","competition":"4\u00c8ME DIVISION","choix_journee":"","choix_poste":"Arbitre centre","NomArbitre":null,"NomAssistant1":null,"NomAssistant2":null,"ArbitreRemplacant":null,"NomDeleguePrincipal":null,"NomDelegueAjoint":null,"NomDelegueAccompagnateur":null,"ObservateurPrincipal":null,"ObservateurAdjoint1":null,"ObservateurAdjoint2":null}]"


Quand je fais ensuite

myJsonObj = JSON.parse(texte);


c'est là que j'ai mon parse error. Visiblement, il ne supporte pas le 1er ", car quand je fais à la main ce tableau :

'[{"date":"2008-09-28","Stade":null,"Terrain":null,"Lieu":"AVENUE DE PARIS","Ville":"79260 LA CRECHE","SaisieDistance":"13","equipelocalesaisie":"La Cr\u00e8che 2","equipevisiteusesaisie":"St Maxire AV S 2","competition":"4\u00c8ME DIVISION","choix_journee":"","choix_poste":"Arbitre centre","NomArbitre":null,"NomAssistant1":null,"NomAssistant2":null,"ArbitreRemplacant":null,"NomDeleguePrincipal":null,"NomDelegueAjoint":null,"NomDelegueAccompagnateur":null,"ObservateurPrincipal":null,"ObservateurAdjoint1":null,"ObservateurAdjoint2":null}]';


Je récupère bien ma donnée. Plus de parse error


tournikoti a écrit :

Donc comment ce caractère unicode est arrivé dans ce fichier ?
Ce fichier a-t-il subit une conversion ?


Il n'y a pas plus de code que le code que j'ai mis dans cette réponse. Je ne sais pas comme il est converti et pourquoi, il y a " ou lieu de ' au début de l'array

tournikoti a écrit :

2) nul besoin de convertir quoi que ce soit, vu que de bout en bout, tu es en &quot;UTF-8&quot;.
Comme ton fichier en entrée n'est pas conforme à la codification UTF-8&quot;, le &quot;JSON.parse&quot; ne fonctionne pas correctement.


Smiley bawling
tournikoti a écrit :
@ benji : non, tu ne peux pas obtenir le bon résultat !

Tu penses que je n'ai pas testé ?


tournikoti a écrit :
Donc pourquoi dans le fichier &quot;test 2 &quot; as-tu ce schmilblick ?
Si tu es bien en &quot;UTF-8&quot; comme tu le prétends, tu dois avoir le bon caractère &quot;è&quot; et pas autre chose !

As tu fait le test ci-dessous ?
echo json_encode(array('La crèche'));


Résultat : ["La cr\u00e8che"]

Edit :
ledisciple1 a écrit :
J'ai l'impression que JSON_HEX_QUOT n'est pas pris en compte, car l'échappement n'apparait pas dans le log

Les options JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES et JSON_UNESCAPED_UNICODE ont été ajoutées à partir de la version 5.4 de php

Edit 2 :
ledisciple1 a écrit :
c'est là que j'ai mon parse error. Visiblement, il ne supporte pas le 1er ", car quand je fais à la main ce tableau :

C'est la console du navigateur qui rajoute ce caractère quand il affiche un string. Donc c'est normal que cela ne passe pas avec.
Modifié par benj (21 Oct 2013 - 11:31)
Trouvé, pas tout seul, mais trouvé :

Dans le fichier php, il faut rajouter :
header('Content-type: application/json');



Merci à tous pour votre aide
Je serais intéressé de savoir pourquoi dans mon test, ça fonctionne sans le header.
Bonsoir à toutes et à tous.

@ Benji : je n'ai jamais dit que tu ne l'avais pas testé. Vu que j'ignore ce que tu a fais, je ne peux pas me prononcer sur la validité de tes tests. Ce qui m'a surtout surpris, c'est que nous n'obtenons pas les mêmes résultats et pourtant je n'ai pas modifié le code.

J'ai repris le même test et je l'ai testé à l'identique et il a planté :

1) sur le "send(null)" car chez moi cette commande plante si tu mets "xhr_object.open('GET', fichier, false);". Je n'ai pas compris la raison de ce plantage. Alors j'ai modifier le code en rajoutant ce qui me semblait manquer mais surtout en mettant TRUE à la place de FALSE. Et là, plus de plantage !

2) le plantage sur "json.parse();" est dû à l'unicode qu'il ne sait pas interpréter. Du coup, je me suis concentré sur la raison de ce plantage. J'ai compris que le fichier en entrée n'était pas conforme ! J'ai modifié le fichier et tout fonctionne correctement. Donc le code ajax n'est pas en cause ! Enfin quand je dis cela, je pense plus à la conformité du fichier en entrée.

3) oui, j'ai fait le même genre de test que toi.
echo json_encode(array('La crèche'));

Je l'ai fait avec ces caractères là "éêèï" et cela passe correctement. Mais à l'inverse de toi, j'ai retrouvé exactement la même chose que dans le fichier en entrée, comme si aucune conversion se faisait.

4) je n'utilise pas le format "JSON" dans mes traitements. A la place, je préfère travailler avec le format "XML". Je maitrise de bout en bout mes applications, donc je n'ai pas de problème de conversions. Dans mes transferts en XML, j'utilise bien un header que voici :
ObjetXHR2 = CreationXHR();
ObjetXHR2.open("post", "PHP/cumul.php", true);
ObjetXHR2.setRequestHeader("Content-Type","text/xml");

Et j'utilise bien la norme "UTF-8".

5) et pour finir, j'aimerai bien connaitre la solution sans le "header" que propose "Ledisciple1". Je pense qu'il s'agit d'une déclaration à faire dans le fichier "httpd.conf". Je pense à ceci :
AddType application/json .json

Je ne sais pas si cela répond à ta question !

@+
benj a écrit :
Je serais intéressé de savoir pourquoi dans mon test, ça fonctionne sans le header.


Tu n'utilserais pas Jquery par hasard?
Salut à tous,

tournikoti a écrit :
5) et pour finir, j'aimerai bien connaitre la solution sans le header que propose Ledisciple1. Je pense qu'il s'agit d'une déclaration à faire dans le fichier httpd.conf. Je pense à ceci :
AddType application/json .json
Je ne sais pas si cela répond à ta question !

En fait, on ne parle pas de requête sur un fichier .json côté serveur mais plutôt de la réponse HTTP provenant du .php. Il faut donc les en-têtes qui vont bien...
Lier le bon type MIME à la bonne extension ne changera rien dans ce cas-ci.
Enfin, je pense...

Sinon, pour benj, il est effectivement possible que jQuery détecte intelligemment le type de données...
tm
En passant, je viens de voir que mon pseudo était mal encodé dans le tableau de bord des forum... Smiley lol
tm™ a écrit :
En passant, je viens de voir que mon pseudo était mal encodé dans le tableau de bord des forum... Smiley lol

En vérité, cela fait un petit moment Smiley cligne
Tu vas pouvoir former un club avec Stéphanie W. Smiley lol
ledisciple1 a écrit :
Tu n'utilserais pas Jquery par hasard?

Non, le test, dont le code et mentionné plus haut n'utilise pas jQuery.

tm™ a écrit :

En fait, on ne parle pas de requête sur un fichier .json côté serveur mais plutôt de la réponse HTTP provenant du .php. Il faut donc les en-têtes qui vont bien...

Le premier paramètre de JSON.parse doit est un string, pourquoi avoir besoin de l'entête Content-type: application/json ?
Sur mon test j'ai du text/html en réponse.

tm™ a écrit :

Lier le bon type MIME à la bonne extension ne changera rien dans ce cas-ci.
Enfin, je pense...

De fait, la directive n'est pas présente dans mes fichiers de configuration de apache.
@benj, tu as testé avec le JSON généré par un fichier php et appelé par une requête ajax ?
Bonsoir à toutes et à tous.

@ tm : J'ai ajouté dans mon httpd.conf, le "AddType application/json .json" que je n'avais pas au préalable.
Je n'ai toujours pas mis de header dans l'exemple donné par ledisciple1.
Et maintenant, la conversion se fait bien.

Ce que je ne comprends pas, c'est la raison de ce "addtype" pour que la conversion se fasse.
Et ce que je ne comprends pas non plus, c'est le fait d'avoir un caractère au format unicode "\u00e8" dans le fichier en entrée.

C'est peut-être bête comme questions, mais je ne comprends pas la raison de cette contrainte que je n'arrive pas à justifier.

A moins de me tromper, le json sert à la sérialisation des données et non à la codification selon une police de caractères.

@ benji : tu n'as rien dans le httpd.conf. As-tu vérifié le fichier ".htaccess" ?
Et tu n'as pas non plus quelque part, la commande "header('Content-type: application/json');" ?
Et n'aurais-tu pas aussi une "extension json" ?

@+
Modifié par tournikoti (23 Oct 2013 - 01:08)
Pages :