Gerando XML com PHP e MySQL

Gerando XML com PHP e MySQL

Olá, escrevi alguns posts sobre gerar XML com PHP mas nenhum com banco de dados, hoje consegui tempo para criar um post sobre o assunto.
No exemplo proposto utilizei:
* PHP5
* MySQL
* XMLWriter (PHP)

Neste exemplo a idéia será gerar um XML com informações de músicas, geralmente os players em flash utilizam um xml para carregar os sons e todas as informações da música, tais como: albúm, artista, nome da faixa, duração da faixa, imagem da capa, etc…

Para isso precisaremos de:
* Classe de conexão com MySQL (utilizarei uma classe bem simples viu)
* 2 Tabelas (albuns e songs)
* 2 arquivos PHP (mysqlcon.class.php e o xml.php)

Então mãos nas teclas…

O arquivo mysqlcon.class.php

<?php
Class MySqlCon
{
	protected $host = "localhost";
	protected $user = "root";
	protected $pass = "root";
	protected $dbname = "music";
	protected $con = "";

	public function __construct()
	{
		$this->con = mysql_connect("$this->host" , "$this->user" , "$this->pass") or die ('Error');
		mysql_select_db("$this->dbname");
	}

	public function close()
	{
		mysql_close($this->con);
	}
}
?>

É só isso mesmo!

O script para criar as tabelas (no banco especificado na classe de conexao, neste exemplo o banco music)

/* Tables */
CREATE TABLE albuns (
  album_id  int AUTO_INCREMENT NOT NULL,
  name      varchar(30),
  author    varchar(30),
  imageurl  varchar(200),
  link      varchar(200),
  PRIMARY KEY (album_id)
) ENGINE = InnoDB;

CREATE TABLE songs (
  song_id        int AUTO_INCREMENT NOT NULL,
  name           varchar(200),
  duration       varchar(5),
  buylink        varchar(200),
  songurl        varchar(200),
  song_album_id  int,
  PRIMARY KEY (song_id)
) ENGINE = InnoDB;

/* Foreign Keys */
ALTER TABLE songs
  ADD CONSTRAINT fk_album_song
  FOREIGN KEY (song_album_id)
    REFERENCES albuns(album_id)
    ON DELETE RESTRICT
    ON UPDATE RESTRICT;

/* Data for table "albuns" */
INSERT INTO albuns (album_id, name, author, imageurl, link) VALUES
  (1, 'Funeral', 'The Arcade Fire', 'images/taf/image.jpg', 'http://www.arcadefire.com/');

/* Data for table "songs" */
INSERT INTO songs (song_id, name, duration, buylink, songurl, song_album_id) VALUES
  (1, 'Neighborhood #1', '3:26', 'http://www.arcadefirestore.com/', 'songs/taf/neighborhood_1.mp3', 1);

E por último, o arquivo xml.php que é o que nos interessa neste post

<?php
# Incluindo a classe de conexao
require_once 'mysqlcon.class.php';
# Instanciando a conexao MySql
$con = new MySqlCon;
# Instanciando o XMLWriter
$xml = new XMLWriter;
$xml->openMemory();
# Definindo o encoding do XML
$xml->startDocument( '1.0' , 'utf-8' );
# Primeiro elemento do XML
$xml->startElement("featureset");
	# Query na tabela albuns
	$rs_album = mysql_query("select * from albuns");
	while($album = mysql_fetch_array($rs_album))
	{
		# Transformando array em objeto
		$album = (object)$album;
		# Criando elemento album
		$xml->startElement("album");
		# Setando os atributos
		$xml->writeAttribute("name", "$album->name");
		$xml->writeAttribute("author", "$album->author");
		$xml->writeAttribute("imageUrl", "$album->imageurl");
		$xml->writeAttribute("link", "$album->link");

		# Query na tabela songs
		$rs_song = mysql_query("select * from songs where song_album_id = $album->album_id");
		while($song = mysql_fetch_array($rs_song))
		{
			$song = (object)$song;
			# Criando elemento song dentro do album
			$xml->startElement("song");
			# Setando os atributos
			$xml->writeAttribute("name", "$song->name");
			$xml->writeAttribute("duration", "$song->duration");
			$xml->writeAttribute("buyLink", "$song->buylink");
			$xml->text("$song->songurl");
			# Fechando o elemento song
			$xml->endElement();
		}
	}
	# Fechando o elemento album
	$xml->endElement();
# Fechando o elemento featureset
$xml->endElement();

# Encerrando a conexao
$con->close();

# Definindo cabecalho de saida
header( 'Content-type: text/xml' );
# Imprimindo a saida do XML
print $xml->outputMemory(true);

# Salva arquivo em disco
//$file = fopen('songs.xml','w+');
//@fwrite($file,$xml->outputMemory(true));
//fclose($file);

?>

Saída:

É isso, acho que os comentários no código já o explica, no entanto irei fazer breves comentários.

Existem 2 whiles porque são 2 tabelas, o primeiro while busca a tabela albuns e a cada registro encontrado pega o id do album e faz uma seleção na tabela songs, isso porque as tabelas são relacionadas, a tabela songs possui para cada registro o ID do album, então a cada albúm é realizada a busca por songs.

Para ver melhor o resultado em XML, populem as tabelas.

Outra coisa que poupa algumas linhas de código é o (object), se não tivéssemos utilizado esse cara ficaria algo como:

 while($song = mysql_fetch_array($rs_song))
 {
   $name = $song['name'];
   $duration = $song['duration'];
   $buylink = $song['buylink'];
   $xml->startElement("song");
   $xml->writeAttribute("name", "$name");
   $xml->writeAttribute("duration", "$duration");
   $xml->writeAttribute("buyLink", "$buylink");
 }

# Utilizando o (object)
while($song = mysql_fetch_array($rs_song))
{
   $song = (object)$song;
   $xml->startElement("song");
   $xml->writeAttribute("name", "$song->name");
   $xml->writeAttribute("duration", "$song->duration");
   $xml->writeAttribute("buyLink", "$song->buylink");
}

Referências:
XMLWriter: http://br3.php.net/XMLWriter
mysql_query: http://br3.php.net/mysql_query
(object):  http://br3.php.net/manual/en/language.types.object.php

Abraços,

Rafael Clares

Comments

    • By hugão

  1. By Rafaela Sacconi

  2. By KARLOS

  3. By Gabriel da Vitória

      • By chebaca

  4. By Mozart

  5. By newber

  6. By LeoChaves

  7. By Charles Mousinho

%d blogueiros gostam disto: