Ir para conteúdo

POWERED BY:

Arquivado

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

Rayane de Araújo

criação de xml com php e consultas mysql

Recommended Posts

Boa noite a todos,

 

Meu código acessa ao banco de dados que contém postagens de um fórum e cria um arquivo xml com essas postagens. Porém, quando escolho alguns fóruns para serem salvos no arquivo xml, da erro desse tipo:

Warning: DOMDocument::createElement(): unterminated entity reference q=figuras+sobre+polui%C3%A7%C3%A3o&sl=en&tl=pt

 

Não sei se o problema é por a postagem ser uma imagem ou se é por causa do símbolo: "&".

 

Alguém pode me ajudar??

 

Muito obrigada

Compartilhar este post


Link para o post
Compartilhar em outros sites
Aqui está a parte do código que da erro:


$dom = new DOMDocument("1.0", "ISO-8859-1");

#retirar os espacos em branco

$dom->preserveWhiteSpace = false;

#gerar o codigo

$dom->formatOutput = true;

#criando o nó principal (root)

$root = $dom->createElement("topicos");

#nó filho (contato)

$topico = $dom->createElement("topico_1");


mysql_connect("localhost", "user", "senha") or die (mysql_error ());

mysql_select_db("moodle19") or die(mysql_error());

$strSQL = "SELECT c.fullname, f.name FROM mdl_forum f, mdl_course c WHERE c.id = f.course";

$conteudo = mysql_query($strSQL);

while($texto = mysql_fetch_array($conteudo)){

$nome_forum = $texto['name'];

//$nome_forum_decodificado = utf8_decode($nome_forum);

$nome_curso = $texto['fullname'];

//$nome_curso_decodificado = utf8_decode($nome_curso);


if(($nome_forum == $_POST['nome_forum']) && ($nome_curso == $_POST['nome_curso'])){

$resultado_nome_forum = retira_acentuacao($nome_forum);

$nome = $dom->createElement("nome", $resultado_nome_forum);

}

}

$topico->appendChild($nome);

$n = 0;

$array_com_todos_os_ids = array();

$i = 0;


$strSQL = "SELECT c.fullname, f.name, u.firstname, u.lastname, fp.userid, fp.message, fp.id

FROM mdl_user u, mdl_forum_discussions fd, mdl_course c, mdl_forum_posts fp, mdl_forum f

WHERE c.id=f.course AND f.id=fd.forum AND fd.id=fp.discussion AND fp.userid=u.id";


$conteudo = mysql_query($strSQL);

while($texto = mysql_fetch_array($conteudo)){

$identificador = $texto['id'];

$nome_forum = $texto['name'];

//$nome_forum_decodificado = utf8_decode($nome_forum);

$nome_curso = $texto['fullname'];

//$nome_curso_decodificado = utf8_decode($nome_curso);

$autor = $texto['firstname'].$texto['lastname'];

//$autor_decodificado = utf8_decode($texto['firstname'].$texto['lastname']);

$mensagem = $texto['message'];

//$mensagem_decodificada = utf8_decode($texto['message']);


if(($nome_forum == $_POST['nome_forum']) && ($nome_curso == $_POST['nome_curso'])){

//verifico se esse post ja não foi gravado antes

if(in_array($identificador,$array_com_todos_os_ids)){


}

else{

$postagem = $dom->createElement("postagem_$n");

$resultado = retira_acentuacao($mensagem);

$resultado_nome = retira_acentuacao($autor);

#setanto nomes e atributos dos elementos xml (nós)

$post = $dom->createElement("conteudo", $resultado);

$autor = $dom->createElement("autor", $resultado_nome);

#adiciona os nós (informacaoes do contato) em contato

$postagem->appendChild($autor);

$postagem->appendChild($post);

$topico->appendChild($postagem);

$root->appendChild($topico);

$dom->appendChild($root);

$n = $n + 1;


}

$array_com_todos_os_ids[$i] = $identificador;

$i = $i + 1;

}

}


//$root->appendChild($topico);

//$dom->appendChild($root);

$dom->save($_SERVER['DOCUMENT_ROOT']."/Postagens.xml");

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente colocar no lugar de $resultado, só uma string vazia pra confirmar se é o conteúdo da variável que está causando o problema.

 

Se for, coloque aqui o conteúdo da variavel

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu pela dica! Coloquei uma string com um "blablabla" e funcionou normal, logo o problema é a variável msm!

a variável contém as postagens dos alunos nos fóruns. O acesso à tabela está correto pois ta pegando certinho o nome dos autores, só o conteúdo que ta dando erro msm. Mas só da erro em alguns casos. Quando as postagens tem imagens dá erro!

a variável é a seguinte:

$resultado = retira_acentuacao($mensagem);

 

obs.: a função retira_acentuacao tbm está ok. Acho q o problema é realmente a postagem ser uma imagem ou algo do tipo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Funcionou perfeitamente! valeu mesmo. Só que agora eu só consigo gravar as postagens que passaram pelo htmlspecialchars. Tentei fazer um if mas não deu certo, pois deu erro em uma postagem. Fiz assim:

if(($resultado=="")|| ($resultado==null)){
$post = $dom->createElement("conteudo", $mensagem);
}
else{
$post = $dom->createElement("conteudo", $resultado);
}
onde mensagem é a variável que contém as postagens sem passar pela htmlspecialchars e resultado é mensagem depois de passar pela htmlspecial chars.
Alguma sugestão?

Compartilhar este post


Link para o post
Compartilhar em outros sites

To usando. To fazendo assim:

$mensagem_sem_caracter_especial = htmlentities($mensagem, ENT_QUOTES, 'UTF-8');

$resultado = retira_acentuacao($mensagem_sem_caracter_especial);

$post = $dom->createElement("conteudo", $resultado);

 

Só que é como se ele só retornasse as mensagens que foram modificadas, ou seja, as mensagens que ele tirou os caracteres especiais


Todo esse código está dentro de um while, gravando no xml uma postagem em cada iteração. Quando eu ponho p imprimir o conteúdo de $resultado (variável que contém o resultado do htmlentities) ele mostra como vazia quando não encontra caracteres especiais nas postagens. Ele só exibe quando possui caracteres especiais que foram modificados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Graças a Deus, conseguiiii =D

O problema era o parâmetro que eu estava passando para o htmlentities. Mudei isto:

$mensagem_sem_caracter_especial = htmlentities($mensagem, ENT_QUOTES, 'UTF-8');

por isto:

$mensagem_sem_caracter_especial = htmlentities($mensagem);

Acredito que o parâmetro ENT_QUOTES, fazia com que a função somente retornasse o que ela modificou. Quando passei sem esse parâmetro, a função retornou tanto o que ela modificou quanto o que não precisou ser modificado por ela (o que não tinha caracteres especiais).

 

Valeu mesmo pela ajuda =D

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.