Как получить исходный текст после использования htmlspecialchars() и htmlentities()

У меня есть текст, который я буду сохранять в своей БД. Текст может выглядеть примерно так: Welcome & This is a test paragraph. Когда я сохраняю этот текст в своей БД после его обработки с помощью htmlspecialchars() и htmlentities() в PHP, предложение будет выглядеть так: Welcome & This is a test paragraph.

Когда я извлекаю и отображаю один и тот же текст, я хочу, чтобы он был в исходном формате. Как я могу это сделать?

Это код, который я использую;

$text= htmlspecialchars(htmlentities($_POST['text'])); 
$text= mysqli_real_escape_string($conn,$text);

person Code Whiz    schedule 10.04.2017    source источник
comment
Кстати, html_entity_decode является аналогом htmlentities: лучше измените свой sql, чтобы использовать подготовленный оператор, и привяжите $_POST['text'] к запросу. Я думаю, что вы делаете, чтобы испортить исходные данные.   -  person JustOnUnderMillions    schedule 10.04.2017
comment
Почему это делают? Вставьте данные без изменений и измените их для своих целей, отображения и т. д.   -  person AbraCadaver    schedule 10.04.2017


Ответы (1)


Есть две проблемы.

Во-первых, вы дважды кодируете символы HTML, используя как htmlentities, так и htmlspecialchars. Обе эти функции делают одно и то же, но htmlspecialchars делает это только с подмножеством символов, которые имеют эквиваленты символов HTML (специальные). Таким образом, в вашем примере амперсанд будет закодирован дважды ( так как это является специальным символом), поэтому на самом деле вы получите следующее:

$example = 'Welcome & This is a test paragraph';

$example = htmlentities($example);
var_dump($example);    // 'Welcome & This is a test paragraph'

$example = htmlspecialchars($example);
var_dump($example);    // 'Welcome & This is a test paragraph'

Решите, какую из этих функций вам нужно использовать (вероятно, htmlspecialchars будет достаточно) и используйте только одну из них.

Во-вторых, вы используете эти функции не в то время. htmlentities и htmlspecialchars ничего не сделают для "очистки" ваших данных для ввода в базу данных. (Не говорю, что это то, что вы намереваетесь, поскольку вы не упомянули об этом, но многие люди, похоже, пытаются это сделать.) Если вы хотите защитить себя от внедрения SQL, привяжите свои значения к подготовленным операторам. Экранирование, как вы сейчас делаете с mysqli_real_escape_string, хорошо , но этого действительно недостаточно.

htmlspecialchars и htmlentities имеют определенные цели: конвертировать символы в строки, которые вы собираетесь вывести в документ HTML. Просто подождите, чтобы использовать их, пока вы не будете готовы это сделать.

person Don't Panic    schedule 10.04.2017