11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous
Je m'arrache les cheveux depuis ce matin sur le problème suivant :
Dans une page générée par php j'ai généré le script suivant

var STAGEID = 'Stage2024';
var USERDATA = {"mbID":"jpmoularde","pup":"tenor0","firstName":"Jean-Pierre","lastName":"Moularde","phone":"XXXXXX","email":"xxxxx@free.fr"};
console.log(USERDATA);		

le résultat dans la console est

{
  "mbID": "",
  "pup": "",
  "firstName": "",
  "lastName": "",
  "phone": "",
  "email": ""
}

c'est à dire que la structure de l'objet est connue mais que les valeurs sont annulée.
C'est un mécanisme que j'utilise souvent sans problème.

Auriez vous une idée de ce qui peut se passer ?
Merci de votre aide.
Modifié par PapyJP (12 Mar 2024 - 11:44)
Bonjour,

Mis à part la variable "STAGEID" qui ne sert à rien pour ce qui nous occupe, il n'y a aucune raison que ton script ne puisse pas fonctionner (de toute façon je l'ai testé par principe). Le problème vient forcément d'ailleurs.
Merci de ta réponse
ce que je constate c'est que si je retire "phone":"..." les données sont correctement assignées !
Tu dis que c'est généré par PHP.. donc les valeurs aussi.
Si les valeurs sont vide à la base, ton json sera sans valeur.

mais comme on voit pas le php qui génére tes data.

En tout cas le problème vient de ta génération du json en php
Modifié par JENCAL (12 Mar 2024 - 13:54)
maintenant ça ne marche plus, même si j'enlève le téléphone !
le zombie est manifestement ailleurs, mais je ne vois pas où.
Ces données que tu récupères en PHP : elles proviennent d'où ? Comment sont-elles stockées ?

Il est possible qu'un script soit prévu quelques part pour changer à la volée les clefs de la collection, je le fais pour changer mes clefs PostgreSQL snake_case en camelCase.
Administrateur
Bonjour,

est-ce que les données de l´objet sont présentes dans le code source, générées côté serveur ?
Est-ce que tu attends DOMContentLoaded avant de faire le console.log ? Si tu attends 20ms (1 frame) de plus avec setTimeout, est-ce mieux ?

Et si tu génères 1/ ton objet 2/ un console.log({"mbID":"jpmoularde","pup":"tenor0","firstName":"Jean-Pierre","lastName":"Moularde","phone":"XXXXXX","email":"xxxxx@free.fr"}); directement est-ce que ça au moins ça fonctionne ? Smiley ravi

$STAGEID = 'Stage2024';
$USERDATA = [...];
$json_USERDATA = json_encode($USERDATA , JSON_UNESCAPED_UNICODE);
echo <<<SCRIPT
		<script>
			var STAGEID = '$STAGEID';
                        console.log($json_USERDATA);
			var USERDATA= $json_USERDATA;
                        console.log(USERDATA);
		</script>
SCRIPT;

le 1er console.log donne la bonne valeur, les deuxième donne un objet avec les bons noms de propriétés mais une valeur égale à "".

J'ai laissé tomber et j'ai pris une autre approche qui de toute façon est mieux appropriée à mon problème.
Modifié par PapyJP (13 Mar 2024 - 11:13)
Ah, tiens, syntaxe HereDoc en PHP :

echo <<<SCRIPT
SCRIPT;

Je ne connaissais pas. Merci.
Modifié par Olivier C (13 Mar 2024 - 15:48)
Olivier C a écrit :
Ah, tiens, syntaxe HeredDoc en PHP :

echo &lt;&lt;&lt;SCRIPT
SCRIPT;

Je ne connaissais pas. Merci.


d'ailleurs le problème vient surement de là les variables ne sont pas interprétées dans les chaînes délimitées
Modérateur
JENCAL a écrit :


d'ailleurs le problème vient surement de là les variables ne sont pas interprétées dans les chaînes délimitées


Pas sûr Smiley cligne puisque cette syntaxe permet d'interpréter les var avec l'indentation de la chaine.

@PapyJP: délimite tes vars avec des accolades et dis-nous ce qu'il en est.


echo <<<SCRIPT
		<script>
			var STAGEID = '{$STAGEID}';
                        console.log({$json_USERDATA});
			var USERDATA= {$json_USERDATA};
                        console.log(USERDATA);
		</script>
SCRIPT;


À la place de cette syntaxe, j'ai tendance maintenant à utiliser sprintf/printf/etc.
Modifié par niuxe (13 Mar 2024 - 17:06)
Je fais ça depuis des années et ça marche très bien. Les variables sont bien interprétées comme des chaînes de caractères.
J’en ai fait un autre du même type ce matin qui marche très bien.
Je pense que le zombie est dû à un effet de bord que je ne suis pas arrivé à trouver. Mais comme de toute façon ce n’était pas la meilleure chose à faire, je laisse tomber.
J’ai remplacé ce code par un appel AJAX à un autre script php qui fait exactement la même chose avec le même code, sauf le <script> qui est remplacé par die($json_USERDATA);
Modérateur
Bonjour,

Il nous manque le contenu de la (probablement) ligne la plus importante qui est $USERDATA = [...]; Smiley biggrin

Le code ci-dessous indique 2 fois de suite dans la console {"mbID":"jpmoularde","pup":"tenor0","firstName":"Jean-Pierre","lastName":"Moularde","phone":"XXXXXX","email":"xxxxx@free.fr"}
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Php et script js</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<?php
$STAGEID = 'Stage2024';
$USERDATA = ["mbID"=>"jpmoularde","pup"=>"tenor0","firstName"=>"Jean-Pierre","lastName"=>"Moularde","phone"=>"XXXXXX","email"=>"xxxxx@free.fr"];
$json_USERDATA = json_encode($USERDATA , JSON_UNESCAPED_UNICODE);
echo <<<SCRIPT
	<script>
		var STAGEID = '$STAGEID';
		console.log($json_USERDATA);
		var USERDATA = $json_USERDATA;
		console.log(USERDATA);
	</script>
SCRIPT;
?>
</body>
</html>

À noter qu'on peut se poser la question de savoir si
var USERDATA = $json_USERDATA;
fonctionne en toutes circonstances. Y en a beaucoup qui préfèrent écrire quelque chose du genre
$json_USERDATA2 = addslashes($json_USERDATA);
puis
var USERDATA = '$json_USERDATA2';
var USERDATA2 = JSON.parse(USERDATA);
Ici, cela n'a pas d'importance. Dans le cas général, je ne sais pas qui a raison !

Amicalement,
Modifié par parsimonhi (13 Mar 2024 - 18:00)