PHP 5.5 и выше: почему "не работает" htmlspecialchars?
Начиная с версии PHP 5.5, функция htmlspecialchars, вызванная с единственным аргументом, который только и указывали 99% программистов, может повести себя странно - скажем, удалить все символы кириллицы из переданной ей строки, особенно если строка состояла только из них.
Возникают трудноуловимые ошибки и массовый плач "не работает". В этом блоге к таким скриптам относятся, например, эти: 1, 2, 3.
Ситуация решается очень легко.
1. Скрипты размещены в нужной кодировке, например, Windows-1251, и это отражено в мета-теге заголовка HTML:
<!doctype html> <html> <head> <title>Firework</title> <meta charset="Windows-1251"/> </head> <body> <?php //... ?> </body></html>
2. В папке скрипта создан файл .htaccess со строкой
AddDefaultCharset windows-1251
(или utf-8, если в пункте 1 указана кодировка "Юникод").
3. Функция htmlspecialchars вызвана кодом вида
htmlspecialchars($value,ENT_COMPAT,'cp1251')
вместо
htmlspecialchars($value)
Второй аргумент можно выбрать по своему вкусу, я здесь указал обрабатывать двойные кавычки, но не одинарные (апострофы). Возможные значения второго аргумента и список обозначений кодировок (третий аргумент) также есть на странице описания функции.
Соответственно, модуль params.php, который у меня есть во многих скриптах, достаточно привести к виду
<?php
if (isset($params) && !empty($params)) {
foreach ($params as $num=>$var) {
if (isset($_POST[$var]))
$$var = trimall(htmlspecialchars(magic($_POST[$var]),ENT_COMPAT,'cp1251'));
else if (isset($_GET[$var]))
$$var = trimall(htmlspecialchars(magic($_GET[$var]),ENT_COMPAT,'cp1251'));
else if (isset($_SESSION[$var])) {
$$var = trimall(htmlspecialchars(magic($_SESSION[$var]),ENT_COMPAT,'cp1251'));
unset ($_SESSION[$var]);
}
else $$var = '';
}
}
?>
P.S. Для обработки всех кавычек лучше указывать второй аргумент функции htmlspecialchars как
ENT_QUOTES, а не ENT_COMPAT.
P.P.S. С некоторых пор (с PHP 5.6) лучше вообще отказаться от однобайтовых кодировок и переходить на UTF-8.
20.01.2018, 12:11 [4100 просмотров]

