php htmlspecialchars () de uma forma para outra
-
21-08-2019 - |
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; ???
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="&" />
e traduz -o para um "widget da caixa de texto com valor '&'".
O mesmo seria verdadeiro para outros chars especiais:
<input value=""" />
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('&') == '&'
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=&
O valor é codificado porque o navegador concatenaria vários campos com um caráter amperes e como
txt=&&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.