Colocar Resposta 
 
Avaliação do Tópico:
  • 0 votos - 0 Média
  • 1
  • 2
  • 3
  • 4
  • 5
PHP + SQL + XML
13-04-2010, 15:58 (Esta mensagem foi modificada pela última vez a: 13-04-2010 16:42 por mpmont.)
Mensagem: #1
PHP + SQL + XML
boa tarde,

estou a tentar fazer uma pequena aplicação em flash que vai buscar todo o conteúdo a xml.

Então, agora pensei em fazer um pequeno backoffice para a coisa e estou a fazer uns testes para ver se consigo por a coisa a funcionar, mas até agora sem sucesso.

Pelo que li a melhor maneira para fazer isto é ter uma base de dados que basicamente tem a estrutura do xml.

por exemplo tenho o xml articles que pode ser algo como:

<articles>
<article>
<id>1</id>
<title>asd</title>
<intro>asdasd</intro>
<content>asdasd</content>
<date>asdasd</date>
</article>
</articles>

e então terei uma tabela chamada articles que tem esta estrutura.

Depois sempre que vou submeter um artigo novo por um formulário em php tenho que ir buscar os dados à base de dados e re-escrever o ficheiro articles.xml.

Na parte do inserir na base de dados os novos dados, não tenho qualquer problema, no entanto é na parte do escrever de novo o xml é que as coisas se complicam.

aqui vai o que consegui fazer até agora:

Código PHP:
//vai buscar conteudo à bd
    
$query "SELECT * FROM articles";
    
$get_articles mysql_query($query$connection);
    
confirm_query($get_articles);

//vai buscar o ficheiro xml
    
$xml simplexml_load_file("articles.xml");

while (
$row mysql_fetch_array($get_articles)){    
         
$article $xml  ->articles->addChild('article');//linha 31
         
$article->addChild('id'utf8_encode($row ['idarticle']));//linha 32
         
$article->addChild('title'utf8_encode($row ['title']));
         
$article->addChild('intro'utf8_encode($row ['intro']));
         
$article->addChild('content'utf8_encode($row ['content']));
         
$article->addChild('date'utf8_encode($row ['date']));
    }
    
$xml->asXML("articles.xml"); 

por agora recebo dois erros:

Warning: SimpleXMLElement::addChild() [simplexmlelement.addchild]: Cannot add child. Parent is not a permanent member of the XML tree in D:\wamp\www\xmlteste\addnew.php on line 31

Fatal error: Call to a member function addChild() on a non-object in D:\wamp\www\xmlteste\addnew.php on line 32

alguém me pode ajudar??

não tenho experiência nenhuma em trabalhar com php e XML.. a única experiência que tenho é de php + SQL e mesmo assim não é assim tanta.
ok, ja consigo adicionar a nova info no ficheiro xml:

fiz a seguinte modificação:
Código PHP:
$xml simplexml_load_file("articles.xml"); 
    
$xml->articles[0] = NULL;
    
$sxe = new SimpleXMLElement($xml->asXML());
    while (
$row mysql_fetch_array($get_articles)){    
         
$article $xml  ->addChild('article');
         
$article->addChild('id'utf8_encode($row ['idarticle']));
         
$article->addChild('title'utf8_encode($row ['title']));
         
$article->addChild('intro'utf8_encode($row ['intro']));
         
$article->addChild('content'utf8_encode($row ['content']));
         
$article->addChild('date'utf8_encode($row ['date']));
    }
    
$xml->asXML("articles.xml");
    
gravarXML($xml); 

como podem ver adicionei na linha 2 $xml->articles[0] = NULL; supostamente isto deveria apagar todo o conteudo do node articles, no entanto isso não acontece...

já só falta isto pois agora quando escrevo o xml ele nao apaga o conteudo que já lá estava e fica a dobrar...
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
13-04-2010, 17:08
Mensagem: #2
RE: PHP + SQL + XML
Boas,

Por acaso não costumo utilizar esse método para gravar XML's, escrevo mesmo as tags e escrevo no ficheiro.

Assim de repente (e sem ver exactamente o que faz o método asXML() nem perceber a existência do $sxe), mostra a tua função gravarXML, sff.

BrunoBernardino.com
Visitar Website de este utilizador Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
13-04-2010, 17:30 (Esta mensagem foi modificada pela última vez a: 13-04-2010 17:35 por mpmont.)
Mensagem: #3
RE: PHP + SQL + XML
Código PHP:
function gravarXML$simpleXMLobject ) {
                     
$dom = new DOMDocument('1.0');
                     
$dom->preserveWhiteSpace false;
                     
$dom->formatOutput true;
                     
$dom->loadXML$simpleXMLobject->asXML() );
                     
$dom->save("articles.xml");
                     
$dom->save("articles__CLONE.xml");

return 
true;



eu acho que também preferia escrever as tags... por acaso não tens nenhum exemplo para eu me guiar??? Tongue

é que todos os exemplos que encontrei usavam simpleXML

o asXML serve para indentar o XML quando é criado! p'lo menos foi o que li...
basicamente o que me falta fazer agora é apagar todo o conteúdo dentro do articles antes de voltar a escrever...
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
14-04-2010, 12:20 (Esta mensagem foi modificada pela última vez a: 14-04-2010 14:31 por WebDevXtream.)
Mensagem: #4
RE: PHP + SQL + XML
Olá bom dia,

Penso que o Bruno se está a referir a isto:

Código PHP:
//Inicia os dados a gravar no ficheiro XML

//Cabeçalho do ficheiro XML para ser Válido
$Dados "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n";

//Inicia a o corpo dos artigos
$Dados .= "<articles>\r\n";

//Obtem os dados da base de dados e "formata-os" em formato xml
while ($row mysql_fetch_array($get_articles)){
   
$Dados .= "\t<article>\n";
   
$Dados .= "\t\t<id>" utf8_encode($row ['idarticle']) . "</id>\n";
   
$Dados .= "\t\t<title>" utf8_encode($row ['title']) . "</title>\n";
   
$Dados .= "\t\t<intro>" utf8_encode($row ['intro'])) . "</intro>\n";
   
$Dados .= "\t\t<content>" .utf8_encode($row ['content'])) . "</content>\n";
   
$Dados .= "\t\t<date>" utf8_encode($row ['date'])) . "</date>\n";
   
$Dados .= "\t</article>\r\n";
}
//Finaliza a conversão dos artigos em formato XML

$Dados .= "</articles>\r\n"//Finaliza o corpo dos artigos

//Trata de gravar a Nossa informação no Ficheiro XML
$Ficheiro 'Artigos.xml';
$Handle fopen($Ficheiro'w');
fwrite($Handle$Dados);
print 
"Ficheiro 'Artigos.xml' Gerado!";
fclose($Handle);
//Termina a gravação do ficheiro e faz um output 

Espero ter-te ajudado de alguma forma.

Abraço

[Imagem: 1_joao5_4.png] [Imagem: logo.png]
WebDevXtream.com - WebDesign, SEO, Domínios, Alojamento, e-Commerce e Publicidade
Visitar Website de este utilizador Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
14-04-2010, 13:54 (Esta mensagem foi modificada pela última vez a: 14-04-2010 13:54 por Bruno Bernardino.)
Mensagem: #5
RE: PHP + SQL + XML
O ficheiro articles.xml tem as permissões necessárias?

Quanto ao exemplo que me pediste, é muito simples, é como se estivesses a escrever um ficheiro de texto, vê esta função:

Código PHP:
<?php
function writeXML() {
    
$_CAMINHODOXML '/caminho/do/ficheiro.xml';

    
ob_start();
?>
<images>
<?php
    $sql 
"";//-- Aqui fazes uma query, ou pegas num array de onde obtenhas os dados para escrever no xml 
    
while ($result mysql_fetch_object($query)) {//-- Isto é um exemplo, mas obviamente se estiveres a ir buscar os valores a um array, terá de ser um foreach ou um for simples.
?>
<image><?php echo $result->image?></image>
<?php
    
}
?>
</images>
<?php
    $xml 
ob_get_clean();
    
$fconts '<?xml version="1.0" encoding="utf-8" standalone="yes"?>'."\n".$xml;
    
file_put_contents($_CAMINHODOXML,$fconts);
}
?>

BrunoBernardino.com
Visitar Website de este utilizador Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
14-04-2010, 17:22 (Esta mensagem foi modificada pela última vez a: 14-04-2010 17:24 por mpmont.)
Mensagem: #6
RE: PHP + SQL + XML
olá e desde já obrigado por estarem a ajudar,

@WebDevXtream
esse teu exemplo ele escreve o ficheiro todo, mas imagina que eu no mesmo ficheiro tinha mais info do a info relativa aos articles? como é que eu fazia para ele escrever apenas dentro de <articles> criando cada um dos artigos dentro desta tag...
o meu exemplo com simplexml está a funcionar, só não apaga antes de escrever no sitio, mas já escreve no sitio certo... ou seja se houvesse uma maneira de apagar o conteudo do ficheiro entre <articles> e </articles> era ouro sobre azul Tongue
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
14-04-2010, 17:40 (Esta mensagem foi modificada pela última vez a: 14-04-2010 17:44 por WebDevXtream.)
Mensagem: #7
RE: PHP + SQL + XML
Olá,

Não sei se percebo muito bem a tua ideia...

No exemplo que te dei, no fundo o ficheiro xml é re-escrito todas as vezes que é executado, ou seja não há necessidade de te preocupares com o conteúdo que está dentro de <articles>...</articles> pois consoante a tua "query" são "escritos" os artigos que tu pretendes.

E o exemplo também foi no seguimento da sugestão do Bruno, de escrever as tag's directamente.

Eu no teu caso, e atenção que estou a "Lançar para o Ar", pois não conheço o que estás no fundo a programar, criaria uma função que me iria gerar este bloco do <articles> (retirando como é obvio a parte de escrever o ficheiro e os header's de geração de xml), e depois na zona onde pretendesse que fosse incorporado a parte de <articles> chamava a função.

Assim sendo tens o script com todas as informações que pretendes, além da parte do <articles>, e depois apenas são escritos os resultados da query no formato xml naquele determinado ponto em que chamas a função, e podes continuar a anexar mais informação no script.

No fim escreves o ficheiro xml no servidor, coma minha solução "fwrite()" ou com a do Bruno "file_put_contents()", são a mesma coisa.

Sei que pode estar a parecer um pouco confuso mas também estamos no campo das suposições Wink.

Um abraço.

[Imagem: 1_joao5_4.png] [Imagem: logo.png]
WebDevXtream.com - WebDesign, SEO, Domínios, Alojamento, e-Commerce e Publicidade
Visitar Website de este utilizador Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
Colocar Resposta 


Saltar Fórum:


Utilizadores a ver este tópico: 1 Visitante(s)