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

Validator et &

16 réponses
Avatar
Denis Beauregard
Bonjour,

J'essaie de valider du code généré avec du PHP avec validator.w3.org
et j'ai quelques problèmes avec les &.

Si mon code produit ceci :

<a href="fiche.php?op=af&no=641217" target="top">GRENIER, A</a>

validator croit que le &no est une entité inconnue et donne un message
d'erreur.

>general entity "no" not defined and no default entity

J'ai donc remplacé le & par %26 et si je place la souris sur le
lien, je vois la même URL fiche.php?op=af&no=641217 dans la barre
en bas de la page.

Mais si je suis ce lien, cela ne fonctionne plus ! L'URL de la ligne
d'adresse est celle générée en PHP,
http://site.com/fiche.php?op=af%26no=641217 et la fiche demandée
n'apparaît plus. Je pensais que PHP transformerait le %26 en & de
façon transparente.

Ce cas est tellement commun que je ne vois pas pourquoi à la fois
validator et PHP ont des demandes opposées.

Je peux toujours ramener le & dans le code, mais j'aurais voulu
avoir une page sans erreur.


Denis

10 réponses

1 2
Avatar
Olivier Miakinen
Le 08/02/2010 14:41, Denis Beauregard a écrit :

J'essaie de valider du code généré avec du PHP avec validator.w3.org
et j'ai quelques problèmes avec les &.

Si mon code produit ceci :

<a href="fiche.php?op¯&nod1217" target="top">GRENIER, A</a>



Si ton code produit ceci, il est incorrect. Tu dois utiliser l'entité
&amp; ou l'un des équivalents &38; ou &#x26; à la place.

J'ai donc remplacé le & par %26 et si je place la souris sur le
lien, je vois la même URL fiche.php?op¯&nod1217 dans la barre
en bas de la page.



Mauvaise idée. Au lieu de prendre la séquence d'échappement HTML, pour
que le &amp; soit correctement transformé en le caractère & qui a un
sens spécial dans une URL, tu as pris la séquence d'échappement pour les
URL, lui faisant donc perdre son sens spécial.

Ce cas est tellement commun que je ne vois pas pourquoi à la fois
validator et PHP ont des demandes opposées.



Ce cas est vraiment commun, en effet, et PHP n'a rien à y voir. Il
faut juste distinguer les séquences d'échappement HTML des séquences
d'échappement d'URL.

Cordialement,
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 08/02/2010 14:50, je répondais à Denis Beauregard :

Si mon code produit ceci :
<a href="fiche.php?op¯&nod1217" target="top">GRENIER, A</a>



Si ton code produit ceci, il est incorrect. Tu dois utiliser l'entité
&amp; ou l'un des équivalents &38; ou &#x26; à la place.



<cit. http://www.la-grange.net/w3c/html4.01/charset.html#h-5.3.2>
Quatre références d'entités de caractères méritent une attention
particulière car elles sont fréquemment utilisées pour masquer certains
caractères spéciaux.

* « &lt; » représente le caractère « < » ;
* « &gt; » représente le caractère « > » ;
* « &amp; » représente le caractère « & » ;
* « &quot; » représente le caractère « " ».
</cit.>
Avatar
Olivier Miakinen
[Désolé pour le triple envoi, la prochaine fois j'essaierai de
rassembler toutes mes idées avant de faire un article unique.]

Le 08/02/2010 14:50, je répondais à Denis Beauregard :

Ce cas est tellement commun que je ne vois pas pourquoi à la fois
validator et PHP ont des demandes opposées.



Ce cas est vraiment commun, en effet, et PHP n'a rien à y voir.



PHP n'est en rien responsable, mais en revanche, PHP peut t'aider :
<http://fr.php.net/manual/fr/function.htmlspecialchars.php>.
Avatar
Denis Beauregard
Le Mon, 08 Feb 2010 15:00:54 +0100, Olivier Miakinen
<om+ écrivait dans fr.comp.infosystemes.www.auteurs:

[Désolé pour le triple envoi, la prochaine fois j'essaierai de
rassembler toutes mes idées avant de faire un article unique.]

Le 08/02/2010 14:50, je répondais à Denis Beauregard :

Ce cas est tellement commun que je ne vois pas pourquoi à la fois
validator et PHP ont des demandes opposées.



Ce cas est vraiment commun, en effet, et PHP n'a rien à y voir.



PHP n'est en rien responsable, mais en revanche, PHP peut t'aider :
<http://fr.php.net/manual/fr/function.htmlspecialchars.php>.



Merci !

J'allais annuler mon message initial mais tu tires plus vite que
mon ombre...

J'ai relu plus attentivement le message d'erreur de validator et
ils donnent directement la solution. En gros, oui, c'est la faute
à PHP et la solution est aussi dans PHP, soit ajouter la ligne
suivante au début

ini_set('arg_separator.output','&amp;');

tout en utilisant cette entité dans l'URL.

Je retourne à ma validation et cette fois, je lirai de plus près
les fameux messages d'erreur...


Denis
Avatar
Sergio
Denis Beauregard a écrit :
Bonjour,

J'essaie de valider du code généré avec du PHP avec validator.w3.org
et j'ai quelques problèmes avec les &.

Si mon code produit ceci :

<a href="fiche.php?op¯&nod1217" target="top">GRENIER, A</a>

validator croit que le &no est une entité inconnue et donne un message
d'erreur.

general entity "no" not defined and no default entity





Il faut remplacer le & par l'entité &amp;

(et en passant target="_top" si tu veux sortir d'une frame)

Ta ligne :
<a href="fiche.php?op¯&amp;nod1217" target="_top">GRENIER, A</a>

--
Serge http://leserged.online.fr/
Mon blog: http://cahierdesergio.free.fr/
Soutenez le libre: http://www.framasoft.org
Avatar
Olivier Miakinen
Le 08/02/2010 15:07, Denis Beauregard a écrit :

J'allais annuler mon message initial mais tu tires plus vite que
mon ombre...



:-D

J'ai relu plus attentivement le message d'erreur de validator et
ils donnent directement la solution. En gros, oui, c'est la faute
à PHP et la solution est aussi dans PHP, soit ajouter la ligne
suivante au début

ini_set('arg_separator.output','&amp;');



Ah, tu n'avais pas précisé qu'il s'agissait d'URL générées
automatiquement par le mécanisme des sessions ! Dans ce cas, en
effet, il semble bien que ce soit de la faute de PHP.
Avatar
Denis Beauregard
Le Mon, 08 Feb 2010 15:45:12 +0100, Olivier Miakinen
<om+ écrivait dans fr.comp.infosystemes.www.auteurs:

Le 08/02/2010 15:07, Denis Beauregard a écrit :

J'allais annuler mon message initial mais tu tires plus vite que
mon ombre...



:-D

J'ai relu plus attentivement le message d'erreur de validator et
ils donnent directement la solution. En gros, oui, c'est la faute
à PHP et la solution est aussi dans PHP, soit ajouter la ligne
suivante au début

ini_set('arg_separator.output','&amp;');



Ah, tu n'avais pas précisé qu'il s'agissait d'URL générées
automatiquement par le mécanisme des sessions ! Dans ce cas, en
effet, il semble bien que ce soit de la faute de PHP.



En fait, j'utilise une session dans le code, mais c'est une URL
que je générais à la main. La page de validator mentionne bien
que c'est une histoire de session, mais je ne vois pas comment
cela va influencer le code que je génère directement à la main,
par un simple
echo '<a href="fiche.php?op¯&amp;no='.$line['fi'].'" target="top">

C'est bien moi qui envoie le code et non le mécanisme de session.

Ceci dit, mon code est maintenant 100% valide.


Denis
Avatar
Denis Beauregard
Le Mon, 08 Feb 2010 15:39:03 +0100, Sergio
écrivait dans
fr.comp.infosystemes.www.auteurs:

Denis Beauregard a écrit :
Bonjour,

J'essaie de valider du code généré avec du PHP avec validator.w3.org
et j'ai quelques problèmes avec les &.

Si mon code produit ceci :

<a href="fiche.php?op¯&nod1217" target="top">GRENIER, A</a>

validator croit que le &no est une entité inconnue et donne un message
d'erreur.

general entity "no" not defined and no default entity





Il faut remplacer le & par l'entité &amp;

(et en passant target="_top" si tu veux sortir d'une frame)

Ta ligne :
<a href="fiche.php?op¯&amp;nod1217" target="_top">GRENIER, A</a>



Je suppose que c'est mon navigateur qui ne voit pas la différence,
mais top et _top donnent les mêmes résultats... Et de ce côté, il
me reste à trouver comment fermer la fenêtre ainsi créée (ou
l'onglet dans FF) avec un lien dans la page.


Denis
Avatar
Denis Beauregard
Le Mon, 08 Feb 2010 10:02:32 -0500, Denis Beauregard
écrivait dans
fr.comp.infosystemes.www.auteurs:

Je suppose que c'est mon navigateur qui ne voit pas la différence,
mais top et _top donnent les mêmes résultats... Et de ce côté, il
me reste à trouver comment fermer la fenêtre ainsi créée (ou
l'onglet dans FF) avec un lien dans la page.



Oubliez ce dernier commentaire. J'ai trouvé :-)


Denis
Avatar
Denis Beauregard
Le Mon, 08 Feb 2010 15:39:03 +0100, Sergio
écrivait dans
fr.comp.infosystemes.www.auteurs:

Denis Beauregard a écrit :
Bonjour,

J'essaie de valider du code généré avec du PHP avec validator.w3.org
et j'ai quelques problèmes avec les &.

Si mon code produit ceci :

<a href="fiche.php?op¯&nod1217" target="top">GRENIER, A</a>

validator croit que le &no est une entité inconnue et donne un message
d'erreur.

general entity "no" not defined and no default entity





Il faut remplacer le & par l'entité &amp;

(et en passant target="_top" si tu veux sortir d'une frame)

Ta ligne :
<a href="fiche.php?op¯&amp;nod1217" target="_top">GRENIER, A</a>



Est-ce une différence entre Seamonkey et les autres ?

Chez moi, avec target="top", cela ouvre un autre onglet dans SM, mais
pas avec _top. Et par la suite, mon lien pour fermer ne marche pas
avec _top.

Il s'agit ici d'un nouvel URL par rapport à mes tests précédents.
Chez moi, avec Easyphp, cela fonctionnait avec _top, mais avec un
onglet déjà créé. De même, dans l'adresse publique utilisée pour
tester le code avec validator, l'onglet était déjà ouvert. Je viens
de recommencer avec une autre URL, celle pour les tests par des
usagers, après avoir fermé le navigateur et ouvert une session en
utilisant un mot de passe, donc dans ces conditions un peu
différentes, _top n'ouvrait pas de nouvel onglet, alors que top le
faisait.

Je précise que j'avais trouvé "top" en faisant une recherche mais que
dans ma mémoire, c'était _top. Faut-il avoir les deux et si oui,
comment ?


Denis
1 2