Preserve quebras de linha de TextArea ao gravar em MySQL

105

Estou usando uma textarea para permitir que os usuários insiram comentários. No entanto, se os usuários inserirem novas linhas, as novas linhas não aparecerão quando forem impressas. Existe alguma maneira de fazer as quebras de linha ficarem.

Alguma ideia de como preservar as quebras de linha?

Hirvesh
fonte
Acabei de desabilitar o htmlawed e parece que não tem nada a ver com quebras de linha, as quebras de linha ainda não aparecem. Então, estou apenas escrevendo os dados textarea diretamente no mysql, e eles não aparecem quando eu echo os dados do banco de dados mysql.
Hirvesh
Também pesquisei a tabela mysql usando phpmyadmin e vi o campo de comentário. Nenhuma etiqueta <br/> está sendo armazenada,
Hirvesh
Estou fazendo um sistema de comentários no estilo do Facebook, então realmente não quero que seja wysiwyg. Nenhuma ideia de por que as quebras de linha não preservam então?
Hirvesh

Respostas:

158

Duas soluções para isso:

  1. Função PHP nl2br():

    por exemplo,

    echo nl2br("This\r\nis\n\ra\nstring\r");
    
    // will output
    This<br />
    is<br />
    a<br />
    string<br />
  2. Envolva a entrada em <pre></pre>tags.

    Veja: W3C Wiki - HTML / Elementos / pré

superUntitled
fonte
2
+1, acabei de receber um lugar privilegiado em meus favoritos para PHP nl2br():)
Zuul
1
Eu acho que escolher e estilizar <pre> </pre> muito melhor para xss.
EGurelli
38

Aqui está o que eu uso

$textToStore = nl2br(htmlentities($inputText, ENT_QUOTES, 'UTF-8'));

$inputTexté o texto fornecido pelo formulário ou textarea. $textToStoreé o texto retornado de nl2bre htmlentities, para ser armazenado em seu banco de dados. ENT_QUOTESirá converter aspas simples e duplas, então você não terá problemas com elas.

Hiroki
fonte
2
Eu acredito que UTF-8 agora é o padrão em PHP. Mas é claro que não custa ser explícito.
ProfileTwist
Como inserir espaços em branco entre textos?
JWC de
Você deve sempre armazenar dados brutos no banco de dados. Em seguida, converta e higienize os dados antes de exibi-los.
Edward
3

Minha própria resposta: usar essa função dos dados da textarea resolve o problema:

function mynl2br($text) { 
   return strtr($text, array("\r\n" => '<br />', "\r" => '<br />', "\n" => '<br />')); 
} 

Mais aqui: http://php.net/nl2br

Hirvesh
fonte
2

Estou usando essas duas etapas de método para preservar o mesmo texto que está em textarea para armazenar no mysql e, em um momento futuro, também posso simplesmente exibir texto simples ...

passo 1:

$status=$_POST['status'];<br/>
$textToStore = nl2br(htmlentities($status, ENT_QUOTES, 'UTF-8'));

Na consulta, digite $textToStore....

passo 2:

escreva o código para a consulta selecionada ... e os valores de eco direto ....

Funciona

Jayendra Bariya
fonte
Você deve sempre armazenar dados brutos no banco de dados. Em seguida, converta e higienize os dados antes de exibi-los.
Edward
1

Isso funciona:

function getBreakText($t) {
    return strtr($t, array('\\r\\n' => '<br>', '\\r' => '<br>', '\\n' => '<br>'));
}
UbiQue
fonte
0
function breakit($t) {
    return nl2br(htmlentities($t, ENT_QUOTES, 'UTF-8'));
}

isso pode te ajudar

passar a área de texto

Libin Thomas
fonte
-8

por que fazer pessoas são tãããão difíceis quando pode ser tããão fácil :)

//here is the pull from the form
$your_form_text = $_POST['your_form_text'];


//line 1 fixes the line breaks - line 2 the slashes
$your_form_text = nl2br($your_form_text);
$your_form_text = stripslashes($your_form_text);

//email away
$message = "Comments: $your_form_text";
mail("[email protected]", "Website Form Submission", $message, $headers);

você obviamente precisará de cabeçalhos e provavelmente terá mais campos, mas esta é a sua área de texto.

Duncan
fonte
6
Isso é inseguro e não é muito relevante para a questão.
Evan Darwin
1
Apenas tente .... Poste por e-mail ou SQL .... Batata batata ..... Tente executar as linhas e corrigir o problema .... Sem um monte de linhas de código confuso que às vezes funciona ou não .... :)
Duncan
De todas as respostas, esta é a menos concisa
JacobRossDev