Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

problème curieux, php s'arrête ???

21 réponses
Avatar
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 \n";
}
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...

10 réponses

1 2 3
Avatar
Olivier Miakinen
Bonjour,

Le 16/10/2014 13:29, Une Bévue a écrit :
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>";



Ç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).

[...]

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'])).

[...]

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...



Et si tu essayais de faire un « flush() » ou un « echo "n" » à la
fin du script ?
Avatar
Une Bévue
Le 16/10/14 14:46, Olivier Miakinen 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).



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é ;-)
Avatar
Olivier Miakinen
Le 16/10/2014 17:14, 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).



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='...



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 !

merci beaucoup, ce n'était donc pas un pb de php mais d'étourderie...

j'y suis abonné ;-)



Ce serait bien que tu prennes l'habitude de *toujours* regarder
le HTML généré.
Avatar
Une Bévue
Le 16/10/14 18:12, Olivier Miakinen a écrit :
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 !

>





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.
Avatar
Olivier Miakinen
Le 17/10/2014 09:09, Une Bévue a écrit :

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 !



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à.



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 ?

le "comme si" indiquait que je n'en étais pas sûr.



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.

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.



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.

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.



Tu dois apprendre à ne pas faire d'hypothèse avant d'avoir *vu* le
HTML (code source) plutôt que ses effets.

euh je regarde toujours ce qui se passe à la console et au niveau des
éléments html.



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 ».
Avatar
Denis Beauregard
Le Fri, 17 Oct 2014 12:08:49 +0200, Olivier Miakinen
<om+ écrivait dans fr.comp.lang.php:

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.



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
Avatar
Une Bévue
Le 17/10/14 12:08, Olivier Miakinen a écrit :
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.



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é.

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.



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).

Sais-tu au moins ce qu'est le code source HTML et comment l'afficher ?



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={&quot;firstname&quot;:&quot;Alfred&quot;,&quot;lastname&quot;:&quot;Hitchcock&quot;}"></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 =&gt; Alfred
lastname =&gt; Hitchcock
</pre>
Avatar
Une Bévue
Le 17/10/14 12:08, Olivier Miakinen a écrit :
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.



euh, côté php je peux très bien faire :

echo "Il n'est pas... <br />";


>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.


Tu dois apprendre à ne pas faire d'hypothèse avant d'avoir*vu* le
HTML (code source) plutôt que ses effets.



mais, je l'ai bien regardé, seulement il n'y avait rien, le body du
document iframe est vide dans ce cas.

>euh je regarde toujours ce qui se passe à la console et au niveau des
>éléments html.


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 ».



rien de suspect côté html.
Avatar
Une Bévue
Le 18/10/14 15:16, Une Bévue a écrit :
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.



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.
Avatar
Olivier Miakinen
Le 18/10/2014 15:16, Une Bévue a écrit :

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.



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é.



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.

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.



euh, je n'avais posté que du php, mon erreur est bien côté php (manque
un ' de fermeture d'attribut).



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.

MAIS le php est affiché dans un iframe (cf + bas).



Ah, je crois que je commence à comprendre pourquoi on avait du mal
à s'entendre.

[...]

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>



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.

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 :
[...]
<iframe id="send_JS_2_php" name="send_JS_2_php" style="width:
450px;height: 250px;"
src="send_JS_2_php.php?json={&quot;firstname&quot;:&quot;Alfred&quot;,&quot;lastname&quot;:&quot;Hitchcock&quot;}"></iframe></body></html>



Ce n'est donc pas ça non plus qu'il faut regarder. Ce qui est important,
c'est :
<http://...chemin.../send_JS_2_php.php?json={"firstname":...etc...}>

Ce que tu dois faire, donc, c'est lancer *cette* requête dans ton
navigateur, et regarder le code source par Ctrl+U.

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.



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.
1 2 3