problème curieux, php s'arrête ???
Le
Une Bévue

j'ai un script php très simple :
<?php
error_reporting(E_ALL);
date_default_timezone_set('Europe/Paris');
setlocale(LC_CTYPE, 'fr_FR.utf-8');
if(isset($_GET['json'])) {
echo "HAVE $_GET<br />";
print_r($_GET['json']);
echo "<pre id='pasteboard>";
$pasteboard = json_decode($_GET['json'], true);
foreach($pasteboard as $key => $value) {
echo "$key => $value ";
}
echo "</pre>";
} else {
echo "NO $_GET<br />";
}
?>
ce script php est dans une iframe côté html/js :
<iframe id="send_JS_2_php" name="send_JS_2_php"
src="send_JS_2_php.php"></iframe><br />
avec JS je change le src de cette iframe par :
iframe.src = "send_JS_2_php.php?json=" + JSON.stringify(pasteboard);
là, dans mon iframe, je vois bien que le php reçoit le 'pasteboard car
print_r($_GET['json']); me donne :
{"firstname":"Alfred","lastname":"Hitchcock"}
ce qui correspond tout à fait à l'objet js 'pasteboard :
pasteboard = {firstname: 'Alfred', lastname: 'Hitchcock'};
MAIS, et c'est là que je ne comprends plus tout se passe "comme si"
l'éxécution du script php s'arrêtait là (càd après le
print_r($_GET['json'])).
Un moment j'ai pensé que mon json_decode($_GET['json'] plantait mais le :
echo json_last_error_msg()
ne donne rien
donc même en supprimant ce $pasteboard = json_decode($_GET['json'], true);
simplement en laissant donc :
echo "<pre id='pasteboard>";
echo "</pre>";
je ne vois pas du tout le "<pre id='pasteboard></pre>" dans le html
résultant.
c'est pourquoi je dis que tout se passe "comme si" l'éxécution du script
s'arrêtait après le print_r.
bon, bien sûr, j'ai essayé en direct ce script par qqc comme :
<url_du_script>?json=<le json en question>
ça donne exactement là même chose
<?php
error_reporting(E_ALL);
date_default_timezone_set('Europe/Paris');
setlocale(LC_CTYPE, 'fr_FR.utf-8');
if(isset($_GET['json'])) {
echo "HAVE $_GET<br />";
print_r($_GET['json']);
echo "<pre id='pasteboard>";
$pasteboard = json_decode($_GET['json'], true);
foreach($pasteboard as $key => $value) {
echo "$key => $value ";
}
echo "</pre>";
} else {
echo "NO $_GET<br />";
}
?>
ce script php est dans une iframe côté html/js :
<iframe id="send_JS_2_php" name="send_JS_2_php"
src="send_JS_2_php.php"></iframe><br />
avec JS je change le src de cette iframe par :
iframe.src = "send_JS_2_php.php?json=" + JSON.stringify(pasteboard);
là, dans mon iframe, je vois bien que le php reçoit le 'pasteboard car
print_r($_GET['json']); me donne :
{"firstname":"Alfred","lastname":"Hitchcock"}
ce qui correspond tout à fait à l'objet js 'pasteboard :
pasteboard = {firstname: 'Alfred', lastname: 'Hitchcock'};
MAIS, et c'est là que je ne comprends plus tout se passe "comme si"
l'éxécution du script php s'arrêtait là (càd après le
print_r($_GET['json'])).
Un moment j'ai pensé que mon json_decode($_GET['json'] plantait mais le :
echo json_last_error_msg()
ne donne rien
donc même en supprimant ce $pasteboard = json_decode($_GET['json'], true);
simplement en laissant donc :
echo "<pre id='pasteboard>";
echo "</pre>";
je ne vois pas du tout le "<pre id='pasteboard></pre>" dans le html
résultant.
c'est pourquoi je dis que tout se passe "comme si" l'éxécution du script
s'arrêtait après le print_r.
bon, bien sûr, j'ai essayé en direct ce script par qqc comme :
<url_du_script>?json=<le json en question>
ça donne exactement là même chose
Le 16/10/2014 13:29, Une Bévue a écrit :
Ça n'a rien à voir avec ton problème, mais lorsque tu réussiras à
faire fonctionner le programme PHP tu auras un problème HTML à
cause du « 'pasteboard » (une quote au début, rien à la fin).
Et si tu essayais de faire un « flush() » ou un « echo "n" » à la
fin du script ?
ah ouais, j'ai rectifié, et ça roule. Belle sagacité !
c'est sans doute le html parser qui est resté bloqué sur ce manue de ' à
la fin de mon id='...
merci beaucoup, ce n'était donc pas un pb de php mais d'étourderie...
j'y suis abonné ;-)
Gnîîî ?
Parce que lorsque tu as dit que tu ne voyais pas le "<pre
id='pasteboard></pre>" dans le HTML résultant, en fait tu
n'avais pas vraiment regardé le code HTML, mais juste
espéré que le parser t'afficherait un truc ? :-(
Quand ça ne fonctionne pas, tu n'as pas la curiosité de faire
« Ctrl-U » ou « View > Source » avant de revenir au code PHP ?
Et même quand ça fonctionne, d'ailleurs !
Ce serait bien que tu prennes l'habitude de *toujours* regarder
le HTML généré.
ben si, évidemment, je regardais les éléments html et ne voyais pas
affiché le pre, j'ai posté que tout se passait "comme si" le php
s'arrêtait là.
le "comme si" indiquait que je n'en étais pas sûr.
maintenant je suis très étonné qu'un parser s'arrête là-dessus vu qu'il
referme, par ailleurs, les balises non fermées.
ceci dit j'ai eu ce comportement avec plusieurs navigateurs, ce qui m'a
confirmé dans mon hypothèse d'un pb côté php.
Il est vrai que maintenant il y a de moins en moins de parsers
différents entre navigateurs.
euh je regarde toujours ce qui se passe à la console et au niveau des
éléments html.
J'ai l'impression qu'on ne se comprend pas, et ce serait bien qu'on
se comprenne pour la prochaine fois que tu auras un problème.
Dans le premier cas, si c'est PHP qui s'arrête, tu ne dois pas
avoir les caractères '<', 'p', 'r', 'e', etc. dans le code *source*
HTML, code qui est *produit* par PHP.
Dans le second cas, si tu as fait une erreur dans le code HTML,
ces caractères doivent être présents dans le code *source* HTML,
simplement ça ne t'affiche rien dans le navigateur.
Sais-tu au moins ce qu'est le code source HTML et comment l'afficher ?
C'est ça, le problème qu'il faut régler. Tu *dois* être capable de
lire le code source HTML. Sinon, tu ne sauras jamais distinguer entre
les problèmes dûs à PHP et ceux dûs à HTML, et ça c'est vachement
important.
Tant qu'une chaîne de caractères ouverte par ' n'est pas refermée par
un autre ' je ne vois pas comment il pourrait détecter qu'on est censé
être sorti de la chaîne.
Tu dois apprendre à ne pas faire d'hypothèse avant d'avoir *vu* le
HTML (code source) plutôt que ses effets.
Je ne suis pas sûr qu'on ait la même notion de « regarder au niveau des
éléments HTML ». Ou plutôt, il faudrait que tu puisses « regarder au
niveau des caractères composant le code HTML ».
Cela donne une erreur de parsing, donc un message d'erreur. Si on ne
voit pas le message d'erreur et qu'il y a une fin anormale, il faut
aller voir dans le code source.
Denis
ben, en fait c'est ça, je viens tout juste de répéter mon erreur.
le php s'arrête à la ligne :
echo "<pre id='pasteboard>";
c'est-à-dire celle où il *manque* un caractère comme tu me l'as fait
remarqué.
euh, je n'avais posté que du php, mon erreur est bien côté php (manque
un ' de fermeture d'attribut).
MAIS le php est affiché dans un iframe (cf + bas).
Oui et non, enfin, je veux dire que je regarde plutôt que le code
source, ce qui est une erreur dans ce cas, je regarde à "Inspecter
l'élément", qui ne me donne pas la même chose que le code source.
Bon, le script php aurait du apparaître dans une iframe du html.
le code source de ma page, tel que lu dans mon éditeur de texte :
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>send_JS_2_php</title>
<script>
var iframeElt, pasteboard;
window.addEventListener('load', start, false);
function start(e) {
console.log("start(e)");
pasteboard = {firstname: 'Alfred', lastname: 'Hitchcock'};
iframeElt = document.createElement('iframe');
iframeElt.setAttribute('id', 'send_JS_2_php')
iframeElt.setAttribute('name', 'send_JS_2_php')
iframeElt.setAttribute('style', 'width: 450px;height: 250px;')
document.body.appendChild(iframeElt);
iframeElt.setAttribute('src', "send_JS_2_php.php?json=" +
JSON.stringify(pasteboard));
}
</script>
</head>
<body>
<h3><a
href='http://stackoverflow.com/questions/8191124/send-javascript-variable-to-php-variable'>send
javaScript variable to php variable</a></h3>
</body>
</html>
le code source de ma page tel qu'affiché dans le navigateur (Afficher le
code source de la page) lui est exactement le même.
(donc pratiquement inintéressant)
Par contre, le code source tel qu'affiché dans le navigateur (Inspecter
l'élément > Élément) lui est différent puisque l'iframe y est présent :
<html lang="en"><head>
<meta charset="UTF-8">
<title>send_JS_2_php</title>
<script>
var iframeElt, pasteboard;
window.addEventListener('load', start, false);
function start(e) {
console.log("start(e)");
pasteboard = {firstname: 'Alfred', lastname: 'Hitchcock'};
iframeElt = document.createElement('iframe');
iframeElt.setAttribute('id', 'send_JS_2_php')
iframeElt.setAttribute('name', 'send_JS_2_php')
iframeElt.setAttribute('style', 'width: 450px;height: 250px;')
document.body.appendChild(iframeElt);
iframeElt.setAttribute('src', "send_JS_2_php.php?json=" +
JSON.stringify(pasteboard));
}
</script>
</head>
<body>
<h3><a
href="http://stackoverflow.com/questions/8191124/send-javascript-variable-to-php-variable">send
javaScript variable to php variable</a></h3>
<iframe id="send_JS_2_php" name="send_JS_2_php" style="width:
450px;height: 250px;"
src="send_JS_2_php.php?json={"firstname":"Alfred","lastname":"Hitchcock"}"></iframe></body></html>
MAIS avec un body du #document contenu dans l'iframe *vide* (dans le cas
où volontairement j'ai répété mon erreur de '.
(donc contrairement à ce que je pensais précédemment, ce n'est pas côté
html que ça bloque mais côté php).
Bon, je trouve curieux que php ne transmette pas du html invalide, je ne
savais pas ça.
quand je supprime l'erreur php, j'ai dans le body du document iframe
contenu par la page html :
<pre id="pasteboard">firstname => Alfred
lastname => Hitchcock
</pre>
euh, côté php je peux très bien faire :
echo "Il n'est pas... <br />";
mais, je l'ai bien regardé, seulement il n'y avait rien, le body du
document iframe est vide dans ce cas.
rien de suspect côté html.
je me corrige, il vaut mieux faire comme j'ai l'habitude de faire,
regarder à Menu Contextuel > Inspecter l'élément > Élément.
car là je vois tous les résultats d'un seul coup :
- le code généré par le JS
- le code généré par le php.
Il n'est pas possible que PHP s'arrête ici ! Du point de vue de
PHP, c'est juste un echo d'une chaîne de caractères encadrée par
des guillemets doubles, cette chaîne pouvant contenir n'importe
quel nombre de guillemets simples (pair ou impair). Ce n'est pas
une erreur, et PHP *doit* continuer.
Entendons-nous sur le terme d'erreur. Tu as fait une erreur qui doit
impacter l'interprétation HTML, mais ce n'est pas une erreur *en* PHP.
Ah, je crois que je commence à comprendre pourquoi on avait du mal
à s'entendre.
Sauf que ce n'est pas la page HTML générée par le PHP fautif, ce n'est
donc pas de celle là qu'il faut regarder le code source généré par PHP.
Ce n'est donc pas ça non plus qu'il faut regarder. Ce qui est important,
c'est :
Ce que tu dois faire, donc, c'est lancer *cette* requête dans ton
navigateur, et regarder le code source par Ctrl+U.
Non seulement c'est curieux, mais c'est IM-POS-SI-BLE !!! Tu es passé
par le filtre d'une tentative d'interprétation du HTML, et c'est ça
qui te met de fausses idées dans la tête.