|
|
|
| Ниже написанный код взят из книги "PHP5/6 в подлиннике". Код нерабочий. По идее он должен выводить написанную пользователем строку, причем даже если это строка какой-либо код на js или на HTML, то есть спец. символы должны заменятся. Но этого не происходит, обычную строку он выводит, но вот какой-либо код нет. Подскажите, пожалуйста, почему? Это листинг 8.10 из книги, набранный слово в слово
<?php
$error = array();
if (!empty($_POST))
{
if(empty($_POST['first'])) $error[] = "текстовое поле не заполнено";
if(empty($error))
{
echo $_POST['first'];
exit();
}
}
if(!empty($error))
{
foreach($error as $err)
{
echo "<span style=\"color:red\">$err</span><br>";
}
}
?>
<form method="post">
<input type="text" name="first" value="<?= htmlspecialchars($_POST['first'], ENT_QUOTES); ?>">
<input type="submit" value="Отправить">
</form> | |
|
|
|
|
|
|
|
для: FallenAngel
(24.08.2011 в 11:48)
| | Понизьте уровень тревожности интерпретатора либо через директиву error_reporting php.ini, либо при помощи функции error_reporting()
<?php
// Выставляем уровень обработки ошибок
// (http://www.softtime.ru/info/articlephp.php?id_article=23)
error_reporting(E_ALL & ~E_NOTICE);
$error = array();
if (!empty($_POST))
{
if(empty($_POST['first'])) $error[] = "текстовое поле не заполнено";
if(empty($error))
{
echo $_POST['first'];
exit();
}
}
if(!empty($error))
{
foreach($error as $err)
{
echo "<span style=\"color:red\">$err</span><br>";
}
}
?>
<form method="post">
<input type="text" name="first" value="<?php echo htmlspecialchars($_POST['first'], ENT_QUOTES); ?>">
<input type="submit" value="Отправить">
</form>
|
| |
|
|
|
|
|
|
|
для: cheops
(24.08.2011 в 12:00)
| | Спасибо за уровень тревожности, так выглядит эстетичнее: нет notice в форме ввода. Кстати, почему запись <?= > не работает аналогично <?php echo ?> ? То есть когда <?= htmlspecialchars($_POST['first'], ENT_QUOTES); ?> то она так и выводится в форме, когда <?php echo htmlspecialchars($_POST['first'], ENT_QUOTES); ?> - то выводится notice, ведь в обоих случаях должен быть notice . А вот проблема с вводом в форму какого-либо кода осталась. Когда я ввожу <script language="javascript" type="text/javascript"> alert("awfawfa"); </script>, то он при обработке не выводится. И кстати интересен еще 1 момент, если я убираю htmlspecialchars($_POST['first'], ENT_QUOTES) из кода, то сообщение в браузере "awfawfa" не появляется. А ведь должно?
Резюмирую:
1. Почему <?php echo ?> и <?= ?> работают по-разному?
2. Почему не выводится <script language="javascript" type="text/javascript"> alert("awfawfa"); </script>?
3. Почему не выводится awfawfa в alert, если убрать htmlspecialchars()? | |
|
|
|
|
|
|
|
для: FallenAngel
(24.08.2011 в 12:38)
| | >1. Почему <?php echo ?> и <?= ?> работают по-разному?
За работу коротких тэгов <?= и ?> несет ответственность директива short_open_tag конфигурационного файла php.ini. В последних версиях PHP она по умолчанию отключена (раньше было наоборот).
| |
|
|
|
|
|
|
|
для: cheops
(24.08.2011 в 12:45)
| | спасибо!!! ВКЛ - заработало:) | |
|
|
|
|
|
|
|
для: FallenAngel
(24.08.2011 в 12:38)
| | 2. Содержимое тэга <script> не выводится, для того, чтобы его увидеть нужно посмотреть исходный код страницы (в разных браузерах это делается по-разному, но этот пункт обязательно должен быть в контекстном меню, вызываемом правой кнопкой мыши).
3. Вероятно у вас включен режим "магических кавычек", посмотрите исходный код, если там, что вроде этого - так оно и есть (он нарушает работу JavaScript).
<script language=\"javascript\" type=\"text/javascript\"> alert(\"awfawfa\"); </script>
| Режим "магических кавычек" управляется директивой magic_quotes_gpc конфигурационного файла php.ini, где-то он включен, где-то он выключен, но в ближайших версиях PHP этот режим будет исключен, так как приносит больше проблем, чем решает.
| |
|
|
|
|
|
|
|
для: cheops
(24.08.2011 в 12:50)
| | 2. Действительно, в исходном коде присутствует <script language="javascript" type="text/javascript"> alert("awfawfa"); </script> , но ведь htmlspecialchars() должен преобразовать <script></script> и сделать его видимым в браузере(также ссылаюсь на рис.9.2 и рис.9.3, стр. 259 и 260 соответственно "PHP5/6 в подлиннике", где тэг <script></script> выводится). Даже если я ввожу выдуманный <sefsefsefesf> он также не выводится в окне браузера (хотя также есть в исходном коде).
3. Посмотрел директиву - она в режиме off. В исходном коде <script language=\"javascript\" type=\"text/javascript\"> alert(\"awfawfa\"); </script> нет , а есть <script language="javascript" type="text/javascript"> alert("awfawfa"); </script> | |
|
|
|
|
|
|
|
для: FallenAngel
(24.08.2011 в 13:08)
| | Ха, попробовал в IE(ранее работал с Google Chrome), там п. 3 работает - выводится awfawfa (как без использования htmlspecialchars так и с использованием) в окне сообщения, а вот п.2 без изменений
<?php
// Выставляем уровень обработки ошибок
// (http://www.softtime.ru/info/articlephp.php?id_article=23)
error_reporting(E_ALL & ~E_NOTICE);
$error = array();
if (!empty($_POST))
{
if(empty($_POST['first'])) $error[] = "текстовое поле не заполнено";
if(empty($error))
{
echo $_POST['first'];
exit();
}
}
if(!empty($error))
{
foreach($error as $err)
{
echo "<span style=\"color:red\">$err</span><br>";
}
}
?>
<form method="post">
<input type="text" name="first" value="<?php echo htmlspecialchars($_POST['first'], ENT_QUOTES); ?>">
<input type="submit" value="Отправить">
</form>
|
| |
|
|
|
|
|
|
|
для: FallenAngel
(24.08.2011 в 13:08)
| | Видимым, но не рабочим код станет если строку
заменить на
echo htmlspecialchars($_POST['first']);
|
| |
|
|
|
|
|
|
|
для: cheops
(24.08.2011 в 14:05)
| | А как можно объяснить тот факт, что в ИЕ яваскриптовый код рабочий, а уже в гугле нет?(когда htmlspecialchars отсутствует) | |
|
|
|
|
|
|
|
для: FallenAngel
(24.08.2011 в 14:20)
| | На самом деле то, что мы называем JavaScript отличается от браузера к браузеру. В IE на самом деле используется вариант Microsoft, который даже называется по другому - JScript. Он более лоялен к синтаксису... например, в нем можно опускать двоеточия, еще чего-то он пропускает и обрабатывает корректно... В других браузерах стоит классический JavaScript, который не реализует фич Microsoft. | |
|
|
|