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 [3636 просмотров]