2013-08-02 5 views
0

У меня есть следующий код в верхней части каждого из моих PHP страниц:Undo mysql_real_escape_string

<?php 

    function name_format($str) 
    { 
     return trim(mysql_real_escape_string(htmlspecialchars($str, ENT_QUOTES))); 
    } 
?> 

foreach ($_POST as $key => $value) { 
     if (!is_array($value)) 
     { 
      $_POST[$key] = name_format($value); 
     } 
    } 

Это было очень полезно до сих пор. Я испытал, что, если я хочу отобразить текст из <textarea>, прежде чем записывать его в базу данных, тогда вместо обычных разрывов строк он отображает «\ r \ n». Даже если я пытаюсь сделать следующее, он не работает:

$str = str_replace("\r\n", "<br>", $str); 
+6

Не будет * не делать это в первую очередь * быть лучше, чем делать и уничтожать его? :) 'mysql_real_escape_string()' действительно должен использоваться только с целью ускорения данных перед тем, как делать запрос. –

+0

Почему вы * присваиваете * '$ _POST'? Это действительно странно. – tadman

+0

'echo nl2br ($ str);'? – Martijn

ответ

0

ошибку вы делаете здесь перезаписывании $_POST с версией строки, которые вы надеетесь будут соответствовать все контекстов (используя mysqli_real_escape_string и htmlspecialchars в то же время).

Вы должны оставить исходное значение нетронутым, и бежать туда, где он используется, используя соответствующую функцию для этого контекста. (Это одна из причин, почему функция «магических кавычек» ранних версий PHP общепризнано, что это была плохая идея.)

Итак, в вашем коде базы данных вы подготовили переменную для использования с SQL (в частности, MySQL):

$comment = mysqli_real_escape_string(trim($_POST['comment'])); 

И в шаблоне, вы бы подготовить переменную для использования с HTML:

$comment = htmlspecialchars(trim($_POST['comment'])); 

Возможно добавление вызова nl2br() в контексте HTML, как хотелось бы.

Смежные вопросы