php htmlspecialchars () из одной формы в другую - PullRequest
0 голосов
/ 06 февраля 2009

Почему htmlspecialchars () не может постоянно кодировать символы после каждой отправки формы? Взгляните на следующий пример:

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

Вы можете увидеть это при работе на http://verticalcms.com/htmlspecialchars.php.

Теперь сделайте следующее

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

В поле ввода значение & amp;

Я ожидал & amp; усилитель;

Почему это не & amp; усилитель; ???

Ответы [ 2 ]

2 голосов
/ 06 февраля 2009

Это просто кодировка сущности HTML. При использовании «&» в атрибуте HTML он должен быть закодирован. И это то, что вы делаете.

Итак, браузер читает

<input value="&amp;" />

и переводит его в «виджет текстового поля со значением« & »».

То же самое будет верно для других специальных символов:

<input value="&quot" />

приведет к символу ".

Когда вы отправляете форму, браузер отправляет эти значения в незашифрованном виде, поэтому ваш PHP-скрипт получает их как «&», а не «& amp;».

0 голосов
/ 06 февраля 2009

Значения в $ _POST уже html-декодированы для удобства. Поэтому, когда ваш скрипт запускается, верно следующее:

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

[править] Похоже, это требует дальнейшего объяснения

Когда форма, подобная приведенной выше, передается на сервер браузером с одним амперсандом в качестве значения 'txt', в текст запроса помещается следующее:

txt=&amp;

Значение закодировано, поскольку браузер объединяет несколько полей с символом амперсанда, например

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

PHP принимает переданные значения и декодирует их для удобства программиста - он делает амперсанд из & Теперь я подумал, что это было причиной вопроса в первую очередь - думаю, я ошибся. Фердинанд правильно ответил на вопрос.

...