Jump to content
xplode_me

Dúvida: BD em XML e página em PHP

Recommended Posts

xplode_me

Alguém percebe de XML que me dê uma ajudinha aqui?

O caso é o seguinte:

Tenho uma base de dados de músicas com acordes para guitarra em XML. O ficheiro é unico e segue um padrão:

Tag numero + nome da música

tag musica

tag acordes

tag letra

repetindo-se sempre. O que eu queria fazer era em PHP chamar atraves de um ficheiro por ex: musicas.php uma musica em especifico, contendo esta os respectivos numero, nome, musica acordes e letra..

Qualquer coisa no estilo: musicas.php?musica=001 puxaria a musica 1 da  base de dados e mostrava essa musica! :P

Alguém pa dar uma ajudinha? Eu do PHP dou bem conta o problema ta no XML....

Cumps!

Share this post


Link to post
Share on other sites
Dabubble
Tenho uma base de dados de músicas com acordes para guitarra em XML.

Aquilo que pretendes se bem que nao e impossivel e complicado pois primeiro tens de usar as funcoes de tratamento de ficheiros de php e depois tens de adicionar um modulo para tratamento de XML etens de usar as respectivas funcoes. A outra alternativa e fazeres o teu proprio parser de XML que ainda e mais complicado.

Nao seria mais facil montar uma BD em MySQL ou outro motor de BD qualquer e depois usar as funcoes de BD de php (que rula nesse aspecto)?

Mesmo que ja tenhas uma bd feita XML podes fazer um programita que meta os dados na BD.

Se esta nao for a solução para ti diz kk koisa.

Cumps

Share this post


Link to post
Share on other sites
AndreLC

Boas,

Como devo proceder para exportar dados de um XML para uma Base de Dados em MySQL e ler em PHP?

Alguém poderia dar umas luzes?

Obrigado.

Cumps.


echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Share this post


Link to post
Share on other sites
AndreLC

Desde já obrigado por responderes..

o XML tem a seguinte estrutura e conteúdo:

<?xml version="1.0" encoding="WINDOWS-1252" standalone="true"?>
<artigos> 
   <referencia>1009</referencia>
   <descricao>GESSO ACABAMENTO ALBI-PLAS FINO BRANCO</descricao> 
   <unidade>SC</unidade> 
   <volume>PAL</volume> 
   <linha_produto>GESSOS</linha_produto> 
   <tipo_produto>GESSOS ACABAMENTO</tipo_produto> 
   <volumes>48.00</volumes> 
   <peso_liquido>25.000</peso_liquido> 
   <ficha_tecnica>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\DH836.PDF</ficha_tecnica> <ficha_tecnica2>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\LISTA_DOC_HOMOLOGACAO_LNEC_20090903.PDF</ficha_tecnica2>                 
   <ce>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\DOC20100412180348AP.PDF</ce>   
   <imagem>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\FOTOS\TGO_ALNOP.JPG</imagem> 
   <folheto_comercial>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\FOLHETOCOMERCIALPROYALBI-PLUS-ALBIPLASFINO.PDF</folheto_comercial> 
   <observacoes>Gesso destinado a ser aplicado manualmente mediante talocha metálica, indicado para o acabamento tipo polido em camada pelicular sobre gessos de regularização, projectados anteriormente em parâmetros horizontais e verticais em interiores. Para a sua correcta aderência deverá ser aplicado antes da presa final da camada de regularização.</observacoes> 
   <icon1/> 
   <icon2/> 
   <icon3/> 
   <icon4/> 
   <icon5/> 
   <categoria1>Interiores</categoria1> 
   <categoria2>Revestimento Interior de Paredes e Tectos</categoria2> 
   <categoria3>Revest. de Alv. b.t.bc</categoria3> 
   <categoria4>Gessos de Acabamento</categoria4>
   <categoria5/> 
</artigos>

Depois construi a Base de Dados em MySQL com os nomes dos campos igual ao nome das etiquetas:

CREATE TABLE IF NOT EXISTS `artigos` (
  `referencia` int(11) NOT NULL,
  `descricao` varchar(255) NOT NULL,
  `unidade` varchar(255) NOT NULL,
  `volume` varchar(255) NOT NULL,
  `linha_produto` varchar(255) NOT NULL,
  `tipo_produto` varchar(255) NOT NULL,
  `volumes` varchar(255) NOT NULL,
  `peso_liquido` varchar(255) NOT NULL,
  `ficha_tecnica` varchar(255) NOT NULL,
  `ficha_tecnica2` varchar(255) NOT NULL,
  `ce` varchar(255) NOT NULL,
  `imagem` varchar(255) NOT NULL,
  `folheto_comercial` varchar(255) NOT NULL,
  `observacoes` varchar(255) NOT NULL,
  `icon1` varchar(255) NOT NULL,
  `icon2` varchar(255) NOT NULL,
  `icon3` varchar(255) NOT NULL,
  `icon4` varchar(255) NOT NULL,
  `icon5` varchar(255) NOT NULL,
  `categoria1` varchar(255) NOT NULL,
  `categoria2` varchar(255) NOT NULL,
  `categoria3` varchar(255) NOT NULL,
  `categoria4` varchar(255) NOT NULL,
  `categoria5` varchar(255) NOT NULL,
  PRIMARY KEY (`referencia`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Mas agora como exporto os dados que estão nas etiquetas do XML para a Base de Dados em MySQL que implementei?

Desde já o meu obrigado.

Cumprimentos.


echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Share this post


Link to post
Share on other sites
laboss

Primeiro atenção aos campos que colocaste na tabela tudo varchar e uma ma pratica tenta arranjar os campos adequados a cada campo :) fiz uma coisa assim pó rápido nem sei se trabalhar mas deve trabalhar

PHP

<?php
mysql_connect('localhost', 'mysql_user', 'mysql_password');
mysql_select_db('db1'); 
if (file_exists ( 'teste.xml' )) {
$xml = simplexml_load_file ( 'teste.xml' );
echo "<pre>";
foreach ( $xml->artigos as $Dados ) {
	mysql_query("INSERT INTO artigos (referencia, descricao, unidade, volume, linha_produto, tipo_produto, volumes,peso_liquido,ficha_tecnica,ficha_tecnica2,ce,imagem,folheto_comercial,observacoes,icon1,icon2,icon3,icon4,icon5,categoria1,categoria2,categoria3,categoria4,categoria5) VALUES ('{$Dados->referencia}','{$Dados->descricao}','{$Dados->unidade}','{$Dados->volume}','{$Dados->linha_produto}','{$Dados->tipo_produto}','{$Dados->volumes}','{$Dados->peso_liquido}','{$Dados->ficha_tecnica}','{$Dados->ficha_tecnica2}','{$Dados->ce}','{$Dados->imagem}','{$Dados->folheto_comercial}','{$Dados->observacoes}','{$Dados->icon1}','{$Dados->icon2}','{$Dados->icon3}','{$Dados->icon4}','{$Dados->categoria1}','{$Dados->categoria2}','{$Dados->categoria3}','{$Dados->categoria4}','{$Dados->categoria5}');");
}
mysql_close();
} else {
exit ( 'Failed to open test.xml.' );
}

?>

E o teu XML com vários registos

<?xml version="1.0" encoding="WINDOWS-1252"?>
<artigoSet>
<artigos> 
   <referencia>1009</referencia>
   <descricao>GESSO ACABAMENTO ALBI-PLAS FINO BRANCO</descricao> 
   <unidade>SC</unidade> 
   <volume>PAL</volume> 
   <linha_produto>GESSOS</linha_produto> 
   <tipo_produto>GESSOS ACABAMENTO</tipo_produto> 
   <volumes>48.00</volumes> 
   <peso_liquido>25.000</peso_liquido> 
   <ficha_tecnica>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\DH836.PDF</ficha_tecnica> <ficha_tecnica2>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\LISTA_DOC_HOMOLOGACAO_LNEC_20090903.PDF</ficha_tecnica2>                 
   <ce>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\DOC20100412180348AP.PDF</ce>   
   <imagem>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\FOTOS\TGO_ALNOP.JPG</imagem> 
   <folheto_comercial>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\FOLHETOCOMERCIALPROYALBI-PLUS-ALBIPLASFINO.PDF</folheto_comercial> 
   <observacoes>Gesso destinado a ser aplicado manualmente mediante talocha metálica, indicado para o acabamento tipo polido em camada pelicular sobre gessos de regularização, projectados anteriormente em parâmetros horizontais e verticais em interiores. Para a sua correcta aderência deverá ser aplicado antes da presa final da camada de regularização.</observacoes> 
   <icon1/> 
   <icon2/> 
   <icon3/> 
   <icon4/> 
   <icon5/> 
   <categoria1>Interiores</categoria1> 
   <categoria2>Revestimento Interior de Paredes e Tectos</categoria2> 
   <categoria3>Revest. de Alv. b.t.bc</categoria3> 
   <categoria4>Gessos de Acabamento</categoria4>
   <categoria5/> 
</artigos>

<artigos> 
   <referencia>1010</referencia>
   <descricao>GESSO ACABAMENTO ALBI-PLAS FINO BRANCO</descricao> 
   <unidade>SC</unidade> 
   <volume>PAL</volume> 
   <linha_produto>GESSOS</linha_produto> 
   <tipo_produto>GESSOS ACABAMENTO</tipo_produto> 
   <volumes>48.00</volumes> 
   <peso_liquido>25.000</peso_liquido> 
   <ficha_tecnica>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\DH836.PDF</ficha_tecnica> <ficha_tecnica2>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\LISTA_DOC_HOMOLOGACAO_LNEC_20090903.PDF</ficha_tecnica2>                 
   <ce>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\DOC20100412180348AP.PDF</ce>   
   <imagem>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\FOTOS\TGO_ALNOP.JPG</imagem> 
   <folheto_comercial>P:\FICHEIROS\CERTIFICADOS - FICHAS TECNICAS\YESOSALBI\DOCPRODUTOS\FOLHETOCOMERCIALPROYALBI-PLUS-ALBIPLASFINO.PDF</folheto_comercial> 
   <observacoes>Gesso destinado a ser aplicado manualmente mediante talocha metálica, indicado para o acabamento tipo polido em camada pelicular sobre gessos de regularização, projectados anteriormente em parâmetros horizontais e verticais em interiores. Para a sua correcta aderência deverá ser aplicado antes da presa final da camada de regularização.</observacoes> 
   <icon1/> 
   <icon2/> 
   <icon3/> 
   <icon4/> 
   <icon5/> 
   <categoria1>Interiores</categoria1> 
   <categoria2>Revestimento Interior de Paredes e Tectos</categoria2> 
   <categoria3>Revest. de Alv. b.t.bc</categoria3> 
   <categoria4>Gessos de Acabamento</categoria4>
   <categoria5/> 
</artigos>

</artigoSet>

Se não tiveres 1 XML, mas tiveres varios ou seja 1 para cada registo podes usar a função com glob algo assim


<?php
mysql_connect ( 'localhost', 'mysql_user', 'mysql_password' );
mysql_select_db ( 'db1' );
foreach ( glob ( "*.xml" ) as $filename ) {
if (file_exists ($filename)) {
	$Dados = simplexml_load_string ( file_get_contents ( $filename ) );
	mysql_query ( "INSERT INTO artigos (referencia, descricao, unidade, volume, linha_produto, tipo_produto, volumes,peso_liquido,ficha_tecnica,ficha_tecnica2,ce,imagem,folheto_comercial,observacoes,icon1,icon2,icon3,icon4,icon5,categoria1,categoria2,categoria3,categoria4,categoria5) VALUES ('{$Dados->referencia}','{$Dados->descricao}','{$Dados->unidade}','{$Dados->volume}','{$Dados->linha_produto}','{$Dados->tipo_produto}','{$Dados->volumes}','{$Dados->peso_liquido}','{$Dados->ficha_tecnica}','{$Dados->ficha_tecnica2}','{$Dados->ce}','{$Dados->imagem}','{$Dados->folheto_comercial}','{$Dados->observacoes}','{$Dados->icon1}','{$Dados->icon2}','{$Dados->icon3}','{$Dados->icon4}','{$Dados->categoria1}','{$Dados->categoria2}','{$Dados->categoria3}','{$Dados->categoria4}','{$Dados->categoria5}');" );
                 echo ( 'Enviado para  BD '. $filename );
	mysql_close ();
} else {
	echo ( 'Failed to open '. $filename );
}
}
?>

Share this post


Link to post
Share on other sites
AndreLC

Pois os tipos de dados ainda irei acertar, mas isso é num instante :)

Percebi a lógica, amanhã irei estudar melhor a tua solução e apresentarei resultados.

Obrigado pela dica da função glob, pois desconhecia e é realmente uma mais-valia :)

Obrigado laboss.

Cumps.


echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Share this post


Link to post
Share on other sites
AndreLC

Bom dia laboss,

Há qualquer coisa que não está certo, pois não está a inserir os dados na Base de Dados...

Em ambas as situações (com a função glob ou não) vai parar ao else, executando o exit do foreach, apresentando o 'Failed to open test.xml'.

Fiz um ficheiro à parte com a ligação para ter a certeza que estava correcta. E alterei o tipo da Base de Dados que estava em MyISAM para InnoDB, mas penso que não irá fazer diferença...

Segundo o que vi, o problema deve estar no foreach.

Alguma ajuda? Obrigado.

Cumps.


echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Share this post


Link to post
Share on other sites
laboss

o ficheiro teste.xml esta no mesmo directório do ficheiro php que estas a correr? se tiveres a usar o foreach faz isto

depois disto foreach ( glob ( "*.xml" ) as $filename ) { mete

echo $filename;

Share this post


Link to post
Share on other sites
AndreLC

Sim o ficheiro está no mesmo directório.

Fiz o echo do $filename e não aparece nada, a página está em branco :S


echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Share this post


Link to post
Share on other sites
AndreLC

O que aparece:

O Internet Explorer não consegue mostrar a página Web!

echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Share this post


Link to post
Share on other sites
laboss

isso e problema do teu codigo ou do teu server aqui funcionou o glob

<?php
foreach ( glob ( "*" ) as $filename ) {
echo $filename;
}
?>

Share this post


Link to post
Share on other sites
AndreLC

Desculpa @laboss, erro meu.

Só assim funciona sim...

Mas agora como coloco a parte do INSERT no foreach a funcionar?


echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Share this post


Link to post
Share on other sites
laboss

Mostra o output disso sff

<?php
mysql_connect ( 'localhost', 'root', '' );
mysql_select_db ( 'teste' );
foreach ( glob ( "*.xml" ) as $filename ) {
$Dados = simplexml_load_string ( file_get_contents ( $filename ) );
$resultado = mysql_query ( "INSERT INTO artigos (referencia, descricao, unidade, volume, linha_produto, tipo_produto, volumes,peso_liquido,ficha_tecnica,ficha_tecnica2,ce,imagem,folheto_comercial,observacoes,icon1,icon2,icon3,icon4,icon5,categoria1,categoria2,categoria3,categoria4,categoria5) VALUES ('{$Dados->referencia}','{$Dados->descricao}','{$Dados->unidade}','{$Dados->volume}','{$Dados->linha_produto}','{$Dados->tipo_produto}','{$Dados->volumes}','{$Dados->peso_liquido}','{$Dados->ficha_tecnica}','{$Dados->ficha_tecnica2}','{$Dados->ce}','{$Dados->imagem}','{$Dados->folheto_comercial}','{$Dados->observacoes}','{$Dados->icon1}','{$Dados->icon2}','{$Dados->icon3}','{$Dados->icon4}','{$Dados->categoria1}','{$Dados->categoria2}','{$Dados->categoria3}','{$Dados->categoria4}','{$Dados->categoria5}');" ); 
if (! $resultado) {
	echo "Erro no ficheiro <b>" . $filename . "</b>  ". mysql_error () . "<br>";
} else {
	echo ('Enviado para  BD ' . $filename);
}
}
mysql_close ();
?>

O meu output

Erro no ficheiro sitemap.xml Table 'teste.artigos' doesn't exist

Erro no ficheiro teste - Cópia - Cópia.xml Table 'teste.artigos' doesn't exist

Erro no ficheiro teste - Cópia.xml Table 'teste.artigos' doesn't exist

Erro no ficheiro teste.xml Table 'teste.artigos' doesn't exist

Share this post


Link to post
Share on other sites
AndreLC

Aparece os ficheiros que tenho na pasta:

7226_Multiflex

XML_28072011.XML

ligacao.php

exporta_xml.php

estava a tentar colocar só a extensão .XML, mas não aparece nada...


echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Share this post


Link to post
Share on other sites
laboss

tens o extensão em maiúscula

<?php
mysql_connect ( 'localhost', 'root', '' );
mysql_select_db ( 'teste' );
foreach ( glob ("{*.xml,*.XML}", GLOB_BRACE) as $filename ) {
$Dados = simplexml_load_string ( file_get_contents ( $filename ) );
$resultado = mysql_query ( "INSERT INTO artigos (referencia, descricao, unidade, volume, linha_produto, tipo_produto, volumes,peso_liquido,ficha_tecnica,ficha_tecnica2,ce,imagem,folheto_comercial,observacoes,icon1,icon2,icon3,icon4,icon5,categoria1,categoria2,categoria3,categoria4,categoria5) VALUES ('{$Dados->referencia}','{$Dados->descricao}','{$Dados->unidade}','{$Dados->volume}','{$Dados->linha_produto}','{$Dados->tipo_produto}','{$Dados->volumes}','{$Dados->peso_liquido}','{$Dados->ficha_tecnica}','{$Dados->ficha_tecnica2}','{$Dados->ce}','{$Dados->imagem}','{$Dados->folheto_comercial}','{$Dados->observacoes}','{$Dados->icon1}','{$Dados->icon2}','{$Dados->icon3}','{$Dados->icon4}','{$Dados->categoria1}','{$Dados->categoria2}','{$Dados->categoria3}','{$Dados->categoria4}','{$Dados->categoria5}');" ); 
if (! $resultado) {
	echo "Erro no ficheiro <b>" . $filename . "</b>  ". mysql_error () . "<br>";
} else {
	echo ('Enviado para  BD ' . $filename);
}
}
mysql_close ();
?>

O meu output

Erro no ficheiro sitemap.xml Table 'teste.artigos' doesn't exist

Erro no ficheiro teste - Cópia - Cópia.xml Table 'teste.artigos' doesn't exist

Erro no ficheiro teste - Cópia.xml Table 'teste.artigos' doesn't exist

Erro no ficheiro teste.xml Table 'teste.artigos' doesn't exist

Share this post


Link to post
Share on other sites
AndreLC

Não percebo o que estou a fazer de errado.

O output que me aparece é o mesmo

O Internet Explorer não consegue mostrar a página Web
  :dontgetit:

echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Share this post


Link to post
Share on other sites
laboss

Qual e o tamanho do XML? Tenta abrir com o chorme ou o firefox, normalmente esse erro da quando o servidor não recebe a requisição do cliente, quando é ficheiros grandes regra geral da timeout, mas tenta com o firefox a ver se da. se der timeout tenta meter isto depois da tag php

set_time_limit (10000000);

ini_set("max_execution_time",155);

ja agora comenta a mysql_query e troca por echo

Share this post


Link to post
Share on other sites
AndreLC

São 70kb, penso que não seja por aí...

No ff também já tinha testado:

A ligação para o servidor foi reposta enquanto a página estava a ser carregada.

Já no safari, por exemplo:

O Safari não consegue abrir a página.

Portanto, aparentemente não parece ser do browser...


echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.