Pergunta

Por que o htmlspecialchars () não pode codificar continuamente os caracteres após cada envio de formulário? Dê uma olhada no exemplo a seguir:

<?php $_POST['txt'] = htmlspecialchars($_POST['txt']); ?>
<form method="post">
<input name="txt" value="<?=$_POST['txt'] ?>" />
<input type="submit" name="save" value="test" />
</form>

Você pode ver isso em correr em http://verticalcms.com/htmlspecialchars.php.

Agora faça o seguinte

1) Type & into the text field
2) Hit the test button once
3) When the page completes post back, hit the test button again
4) When the page completes post back, view the page source code

Na caixa de entrada, o valor é & amp;

Eu estava esperando & amp; amp;

Por que não é & amp; amp; ???

Foi útil?

Solução

Isso simplesmente é a codificação da entidade HTML. Ao usar "&" em um atributo html, ele deve ser codificado. E é isso que você está fazendo.

Então, o navegador lê

<input value="&amp;" />

e traduz -o para um "widget da caixa de texto com valor '&'".

O mesmo seria verdadeiro para outros chars especiais:

<input value="&quot" />

resultaria em um "personagem".

Quando você envia o formulário, o navegador envia esses valores não codificados; portanto, seu script PHP o recebe como "&", não "&".

Outras dicas

Os valores em $ _Post já estão decodificados para HTML para conveniência. Então, quando o seu script começa, o seguinte é verdadeiro:

$_POST['txt'] == '&';
htmlspecialchars('&') == '&amp;'

Editar] Parece que isso precisa de mais explicações

Quando um formulário como o acima é submetido ao servidor pelo navegador com um único ampersa e como o valor de 'txt', ele coloca o seguinte no corpo da solicitação:

txt=&amp;

O valor é codificado porque o navegador concatenaria vários campos com um caráter amperes e como

txt=&amp;&user=soulmerge&pass=whatever

O PHP pega os valores transmitidos e os decodifica para a conveniência do programador - ele faz com que um ampers e agora eu fosse o motivo da pergunta em primeiro lugar - acho que entendi errado. A pergunta real foi respondida corretamente por Ferdinand.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top