Question

J'ai un peu de difficulté à créer un formulaire collant qui mémorisera ce qui y est entré lors de la soumission du formulaire si la valeur est entre guillemets. Le problème est que le HTML est supposé lire quelque chose comme:

<input type="text" name="something" value="Whatever value you entered" />

Cependant, si la phrase: & "Comment puis-je faire cela? &"; est saisi avec des guillemets, le code HTML résultant est similaire à:

<input type="text" this?="" do="" i="" how="" value="" name="something"/>

Comment devrais-je filtrer les guillemets? Je l'ai essayé avec des guillemets magiques de temps en temps, j'ai utilisé striplashes et addlashes, mais je n'ai pas encore trouvé la bonne solution. Quel est le meilleur moyen de résoudre ce problème en PHP?

Était-ce utile?

La solution

Vous souhaitez htmlentities () .

<input type="text" value="<?php echo htmlentities($myValue); ?>">

Autres conseils

Ce qui précède encodera toutes sortes de caractères ayant un code d’entité HTML. Je préfère utiliser:

htmlspecialchars($myValue, ENT_QUOTES, 'utf-8');

Ceci encodera seulement:

'&' (ampersand) becomes '&amp;'
'"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set.
''' (single quote) becomes '&#039;' only when ENT_QUOTES is set.
'<' (less than) becomes '&lt;'
'>' (greater than) becomes '&gt;'

Vous pouvez également faire un strip_tags sur la $ myValue pour supprimer les balises html et php.

C'est ce que j'utilise:

htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_DISALLOWED | ENT_HTML5, 'UTF-8')
  • ENT_QUOTES dit à PHP de convertir les guillemets simples et doubles, ce que je trouve souhaitable.
  • ENT_SUBSTITUTE et ENT_DISALLOWED traitent les caractères Unicode invalides. Ils sont assez similaires - pour autant que je sache, le premier substitue des séquences d'unités de code invalides, c'est-à-dire des caractères codés de manière non valide ou des séquences ne représentant pas des caractères , tandis que le second substitue des points de code invalides pour le document donné. type, c'est-à-dire les caractères non autorisés pour le type de document spécifié (ou la valeur par défaut si non spécifiée explicitement). La documentation est excessivement laconique à leur sujet.
  • ENT_HTML5 est le type de document que j'utilise. Vous pouvez en utiliser un autre, mais il doit correspondre à votre doctype de page.
  • UTF-8 est l'encodage de mon document. Je suggère que, sauf si vous êtes absolument sûr que vous utilisez PHP 5.4.0, vous spécifiez explicitement le codage, en particulier si vous utilisez un texte non anglais. Un hôte sur lequel je travaille utilise une version 5.2.quelque chose, dont la valeur par défaut est ISO-8859-1 et qui produit du charabia.

Comme thesmart le suggère, htmlspecialchars ne code que les caractères HTML réservés, tandis que htmlentities convertit tout ce qui a une représentation HTML. Dans la plupart des contextes, l'un ou l'autre fera l'affaire. Voici une discussion sur le sujet.

Encore une chose: il est préférable de garder les guillemets magiques désactivés, car ils donnent un faux sentiment de sécurité et sont déconseillés dans 5.3.0 et retirés de 5.4.0. S'ils sont activés, chaque citation de vos champs sera précédée d'une barre oblique inverse lors de la publication (et plusieurs publications ajouteront de plus en plus de barres obliques). Je vois que l'OP peut changer le réglage, mais pour les références futures: si vous êtes sur un hôte partagé ou si vous n'avez pas accès à php.ini, le moyen le plus simple est d'ajouter

.
php_flag magic_quotes_gpc Off

vers le .htaccess fichier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top