Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ebotega

Erro com nl2br, não respeita os parágrafos

Recommended Posts

Pessoal, tenho um registro no banco de dados que foi gravado com "utf8_encode" para respeitar os acentos e tal... ok. Quando imprimo os resultados na tela com nl2br para respeitar quando uma linha é pulada, na tela imprime <br /> invés de pular linha. Se eu tirar o nl2br, claro, imprime tudo em uma única linha.

 

Já tentei str_replace entre outros meio. Como faço pra funcionar a quebra de linha e não imprimir o "<br />".

 

Valeu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

por acaso está usando htmlentities ou algo do gênero antes de salvar no banco ?

 

 

verificou como está o resultado do código enviado ao browser ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

então... pra gravar no banco eu uso o utf8_encode, pra gravar com os acentos, qualquer outra forma de gravar no banco geram caracteres estranhos. Para mostrar o conteúdo eu uso o htmlentities para mostrar os acentos e usava o nl2br para respeitar quando uma linha é pulada, mas não tá rolando... as linhas.

 

Será que o erro tá na forma de gravar no banco?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos começar do começo. Usar utf_encode() para respeitar acentos... é gambiarra :P

 

Apesar de em algumas situações parecer uma Batalha de Titãs, com calma e planjeamento você não precisa sujar seu código com essa função em diversas partes do código.

 

Enfim...

 

Você sabe que nl2br() serve estritamente para converter os \n e \r em uma string justamente na tag HTML <br/>, né?

 

Pergunto porque ficou meio dúbia sua interpretação do uso da função. Além do mais, à parte da função sendo aplicada à string, você ainda deve ecoar o conteúdo.

 

Quem vai de fato pular a linha no âmbito visual, é o browser ao interpretar o HTML.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Vamos começar do começo. Usar utf_encode() para respeitar acentos... é gambiarra :P

Apesar de em algumas situações parecer uma Batalha de Titãs, com calma e planjeamento você não precisa sujar seu código com essa função em diversas partes do código.

 

ok... ok, como gravo as palavras com acentos então no mysql?

 

 

Você sabe que nl2br() serve estritamente para converter os \n e \r em uma string justamente na tag HTML <br/>, né?

Pergunto porque ficou meio dúbia sua interpretação do uso da função. Além do mais, à parte da função sendo aplicada à string, você ainda deve ecoar o conteúdo.

Quem vai de fato pular a linha no âmbito visual, é o browser ao interpretar o HTML.

 

ok.. ok (de novo), alguns usuários, ao escreverem em uma textarea, incluem diversos "enteres" para iniciar um novo parágrafo. Li que com o nl2br, quando trazemos esse conteúdo para uma variável qualquer e damos um echo nela para mostrar esse conteúdo do banco, a impressão sairia com os "enteres" dados pelo usuário.

Se não é dessa forma, como devo fazer para a página respeitar as quebras de linha inseridas?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, no momento estou sem servidor local para testar e responder com precisão.

 

Mas onde você vai exibir os dados inseridos via textarea? De volta ao próprio textarea (para uma possível alteração) ou fora dele, na página normal?

 

Normalmente, se for dentro dele não precisa de nada. Fora dele, é só converter com nl2br() mesmo.

 

Agora se você grava as informações com os <br />, para exibir dentro do textarea pode precisar desfazer o efeito da função, substituindo, com str_replace() mesmo, essas tags pelas barras invertidas (manualmente) ou usando PHP_EOL (automaticamente).

 

Sobre a acentuação tem diversos tópicos falando sobre isso mas, em resumo, basta que você padronize. Se sua aplicação é ISO 8859-1 (Ocidental) sem banco também deve ser (ou o equivalente latin1_bin). Se seu banco é UTF8, sua aplicação também deverá ser (e sem assinatura BOM para te poupar dor de cabeça).

Compartilhar este post


Link para o post
Compartilhar em outros sites

ebotega,, se puder conserte o sistema definindo um encode padrão para o projeto inteiro para evitar o uso de utf8_encode. decode, etc... pois causa processamento "desnecessário"

 

 

quanto ao seu problema específico, faça esse teste para compreender um pouco sobre o uso do nl2br(), o qual não tem relação alguma com banco de dados;

 

<?php 
$str = "A\r\nB";
echo $str;
$str = nl2br( $str );
echo '<hr>' . $str;
$str = htmlentities( $str );
echo '<hr>' . $str;
?>

 

 

no post #2, perguntei se você estava utilizando algum conversor como o htmlentites por causa dessa sua descrição no post #1

na tela imprime <br /> invés de pular linha.

 

Se na tela do browser está imprimindo a sintaxe html então provavelmente no código fonte html deve estar assim

<br />

ou seja, está no formato htmlentities..

 

 

Se não for viável consertar o sistema inteiro para um padrão de codificação específico, sugiro que utilize o nl2br() após o htmlenties() para evitar esse conflito e solucionar o caso específico.

 

Aproveitando o exemplo de teste, veja agora como fica o resultado ao inverter a ordem de execução:

<?php 
$str = "A\r\rB";
echo $str;
$str = htmlentities( $str );
echo '<hr>' . $str;
$str = nl2br( $str );
echo '<hr>' . $str;
?>

 

 

 

veja também :seta: PHP, HTML, MySQL - Charset Encoding

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok bruno/hinom, excelente conteúdo, já esclarece muita coisa, principalmente que terei que rever o meu projeto.

 

Nesse caso, para trabalhar sem dor de cabeça com acentos em páginas simples em php e mysql, qual o charset/collation indicado ou, pelo menos, qual o mais utilizado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

então...

 

a index.php está com "charset=utf-8", o insert no banco está limpo... sem utf8_decode, quando trago os registros no banco aparecem certinho, mesmo sem htmlentities, o banco eu recriei como "utf8_general_ci" e quando incluo no banco "ação", no banco grava "ação".

 

o banco e o código estão com utf8 (página sem BOM), aparece tudo certo e agora até com os espaços quando coloco nl2br, mas no banco tá zoado... o que pode ser agora?

 

detalhe: insert com utf8_decode aparece com acentuação no banco.

:angry:

Compartilhar este post


Link para o post
Compartilhar em outros sites

3 perguntas

 

a index.php está com "charset=utf-8"

no php ou na metatag html ?

 

 

como está a configuração do mbstring ?

exemplo de configuração padrão: http://imageshack.us/photo/my-images/690/53853239.jpg/

 

 

verificou se as tabelas e seus respectivos campos estão extendendo a configuração do charset/collation definido para o banco?

note que no mysql é possível que a base de dados esteja em utf-8 e a tabela esteja em latin e ainda mesmo um campo da tabela esteja em shift-jis. verifique cuidadosamente se está tudo num mesmo padrão

 

 

 

off:

uma forma que poderá resolver sem precisar mexer muito é executar antes de cada query de inserção ou update:

mysql_query("SET NAMES 'UTF8'");

mysql_query("set CHARACTER set 'utf-8'");

 

 

mas isso, para o seu caso não tem necessidade pois pode ser resolvido criando uma padronização do charset

Compartilhar este post


Link para o post
Compartilhar em outros sites
no php ou na metatag html ?

na metatag da index.php (<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />).

 

como está a configuração do mbstring ?

exemplo de configuração padrão: http://imageshack.us/photo/my-images/690/53853239.jpg/

o meu está igual ao da imagem do link

 

verificou se as tabelas e seus respectivos campos estão extendendo a configuração do charset/collation definido para o banco?

uso algumas vezes para a modelagem o MySQLWorkbench, conferi também no PHPMyAdmin e no Toad for MySQL e nos três, tanto a base como as tabelas e seus campos estão como utf8_general_ci. No MySQLWorkbench aparece utf8_default_ci.

 

 

 

uma forma que poderá resolver sem precisar mexer muito é executar antes de cada query de inserção ou update:

mysql_query("SET NAMES 'UTF8'");

mysql_query("set CHARACTER set 'utf-8'");

até testei mas deram outros problemas e descartei...

Compartilhar este post


Link para o post
Compartilhar em outros sites

aparentemente pelas suas respostas, parece estar correto.

 

não consigo deduzir algo certo, por isso, mais algumas perguntas

 

1.em client-side

- browser e versão

- sistema operacional e versão

 

2.em server side

- versão do mysql, apache e php

- sistema operacional do server e versão

 

3.qual editor de textos está usando para editar as paginas php?

4.certificou-se de remover o utf8-BOM ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

1.em client-side

- browser e versão

- sistema operacional e versão

 

2.em server side

- versão do mysql, apache e php

- sistema operacional do server e versão

Em ambos o S.O. é XP professional, browser IE, Crhome e Firefox. Mysql 5.1.41, Apache 2.2.17 e PHP 5.3.4

 

3.qual editor de textos está usando para editar as paginas php?

4.certificou-se de remover o utf8-BOM ?

Dreamweaver e eventualmente Notepad++, já conferi em ambos e nos dois está setado para não usar BOM.

 

...

 

valeu pela força até aqui...

Compartilhar este post


Link para o post
Compartilhar em outros sites

já tinha visto esse passo-a-passo mas sem fazê-lo, enfim... segui conforme manda o figurino e grava na boa e imprime na boa mas no banco a palavra "ação" aparece como "ação", mesmo com um "header('Content-Type: text/html; charset=utf-8');" na página do insert.

Compartilhar este post


Link para o post
Compartilhar em outros sites

coincidência ou não, já esperava por essa resposta sua. rss

 

vou te guiar para outro passo.

 

pode ser chato as vezes, mas é que como sou alheio ao que você está fazendo e como está fazendo, preciso de pistas para saber orientar.

 

faça o teste,

 

na página que faz o insert, antes de executar a query faça com que a sintaxe SQL seja impressa na tela

 

algo do tipo

echo $sql; exit; // coloque o exit para interromper o restante da execução. o importante aqui é debugar e ver como está a query.
mysql_query( $sql )

 

veja como está a query, se possui o encode correto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

então... segue print do $sql, espero que enteda, tentei detalhar o máximo algumas situações.

 

 

Teste 1: com utf8_decode

 

string:

"a ação está em execução"

 

script de insert (com utf8_decode):

$sql = "INSERT INTO respostas (resposta, perguntas_cod_pergunta, cod_usuario, tipo_usuario, data_cadastro) VALUES ('". utf8_decode($descricao) ."', ". $post .", ". $cod_usuario .", '". $tipo ."', now())";

 

script de insert com os parâmetros (echo no $sql):

INSERT INTO respostas (resposta, perguntas_cod_pergunta, cod_usuario, tipo_usuario, data_cadastro) VALUES ('a a??o est? em execu??o', 7, 10, 'art', now())

 

no banco aparece:

"a ação está em execução"

 

echo no campo do banco USANDO htmlentities aparece na tela:

"a ação está em execução"

 

echo no campo do banco NÃO USANDO htmlentities aparece na tela:

"a a??o est? em execu??o"

 

**********

 

Teste 2: sem utf8_decode

 

string:

"a ação está em execução"

 

script de insert (com utf8_decode):

$sql = "INSERT INTO respostas (resposta, perguntas_cod_pergunta, cod_usuario, tipo_usuario, data_cadastro) VALUES ('". $descricao ."', ". $post .", ". $cod_usuario .", '". $tipo ."', now())";

 

script de insert com os parâmetros (echo no $sql):

INSERT INTO respostas (resposta, perguntas_cod_pergunta, cod_usuario, tipo_usuario, data_cadastro) VALUES ('a ação está em execução', 7, 10, 'art', now())

 

no banco aparece:

"a ação está em execução"

 

echo no campo do banco USANDO htmlentities aparece na tela:

"a ação está em execução"

 

echo no campo do banco NÃO USANDO htmlentities aparece na tela:

"a ação está em execução"

 

*********

 

Será que tiramos algumas conclusões com os resultados acima?

 

Parece que, com o utf8_decode no insert, ele grava certo no banco e imprime certo com htmlentities. Sem o utf8_decode no inser ele grava "errado" no banco mas imprime certo sem precisar de htmlentities.

:mellow:

 

Obrigado até aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

tenho perguntas sobre por que está usando utf8_decode($descricao) se as páginas e tudo mais já está em utf8, mas antes preciso de duas perguntas:

 

 

1. qual a origem da variável $descricao ?

- vem pelo $_POST?

- é feito alguma filtragem antes de chegar na montagem da query SQL ?

 

2. nessa mesma página que recebe o formulario e faz o insert no banco, faça isso antes de montar a query:

print_r( $_POST ); exit;

apenas para saber como os dados estão vindo do formulário.

Compartilhar este post


Link para o post
Compartilhar em outros sites

tenho perguntas sobre por que está usando utf8_decode($descricao) se as páginas e tudo mais já está em utf8, mas antes preciso de duas perguntas:

Pois é, o banco já está em utf8 e a página também, coloquei esse apenas para gravar os acentos no mysql, conforme te mostrei nos exemplos anteriores com e sem utf8_decode.

 

1. qual a origem da variável $descricao ?

- vem pelo $_POST?

- é feito alguma filtragem antes de chegar na montagem da query SQL ?

A $descricao está vindo de um textarea via $_POST sem nenhum outro tipo de filtro, saca um trecho do código que recebe a string e faz o insert aí em baixo...

...
if ( !empty($_POST['descricao']) )
{
  @$descricao	= $_POST['descricao'];
  @$sql = "INSERT INTO respostas (resposta, perguntas_cod_pergunta, cod_usuario, tipo_usuario, data_cadastro) VALUES ('". utf8_decode($descricao) ."', ". $post .", ". $cod_usuario .", '". $tipo ."', now())";

  if ( mysql_query($sql) or die(mysql_error()) )
     echo "resposta ok";
}
else
...

 

2. nessa mesma página que recebe o formulario e faz o insert no banco, faça isso antes de montar a query:

print_r( $_POST ); exit;

apenas para saber como os dados estão vindo do formulário.

imprime na tela isso quando tento incluir a string "ação": "Array ( [descricao] => ação [bt_login_x] => 40 [bt_login_y] => 8 )"

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.