Ultimamente he tenido que realizar algunas pruebas de importación de datos provenientes de un fichero XML a tablas de una base de datos en mySQL. Y bueno con PHP 5 me resultó bastante sencillo, ya que incorpora (por defecto) la extensión simpleXML que facilita mucho las cosas.
Para este ejemplo necesitaremos crear 2 ficheros en php, uno con la configuración y conexión a la base de datos, y otro con el script de importación en si. Además del fichero XML que vamos a importar. Y evidentemente necesitaremos tener creada las tablas a la que vamos a importar.
Empecemos mostrando la estructura del fichero XML a importar.
Partiendo de esta estructura de nuestro fichero XML a importar deberemos crear nuestro script para que sea capaz de importar estos datos directamente en una tabla mysql que tendremos que haber creado anteriormente. Además dicha base de datos deberá incorporar al menos dos tablas para que sea capaz de incorporar eficientemente esta estructura en la que un libro tiene asociada una serie de imágenes, aunque podríamos hacerlo con una sola en la que tener triplicados los campos url de la imagen y su descripción, me ha parecido más didáctico e interesante hacerlo en dos tablas. Dando así solución a un problema bastante común como la división en distintas tablas de un único fichero XML.
Ahora veremos el código php necesario para realizar la importación. En primer lugar tendremos un fichero de configuración con los datos de conexión y los comandos necesarios para realizar dicha conexión a la base de datos mySql.
/***************************************************************
* Conection Params Page - config.php
* Author: J. Manuel Navarro ( http://www.manuelnavarro.com )
*
* Parametros de conexión a la base de datos.
***************************************************************/
<?php
$dbhost='localhost';
$dbusername='nombre_usuario';
$dbuserpass='clave_usuario';
$dbname = 'nombre_bd';
// Ahora conectamos a la base de datos.
mysql_connect ($dbhost, $dbusername, $dbuserpass);
// y la seleccionamos para poder trabajar con ella.
mysql_select_db($dbname) or die('Cannot select database');
?>
A este fichero pocos comentarios, así que pasaremos al script de importación no si antes comentar que las tablas tienen un campo ID de tipo entero, definida como clave primaria y con auto-incremento. Así que al añadir el libro a la tabla necesitaremos recuperar dicho ID (generado automaticamente) para relacionar el último libro añadido con las imagenes.
/***************************************************************
* Conection Params Page - importxml.php
* Author: J. Manuel Navarro ( http://www.manuelnavarro.com )
*
* Script ejemplo de importación de XML a mySql con PHP 5
***************************************************************/
// Variable con el nombre del fichero a importar
$xml_file = 'libros.xml';
if (file_exists($xml_file)) {
$xml = simplexml_load_file($xml_file);
} else {
exit('Error al intentar abrir el fichero '.$xml_file);
}
// Todo bien asi que abrimos BD para importar
require 'config.php';
/* Recorremos el XML */
$count=0;
foreach ($xml->libro as $libro) {
// Inserta el libro en la tabla
$qry = "INSERT INTO libros ".
"(codigo, titulo, editorial, autor, descripcion,precio)".
" VALUES ('$libro->ref', ".
"'$libro->titulo', ".
"'$libro->editorial', ".
"'$libro->autor', ".
"'$libro->desc', ".
$libro->precio.")";
// Ahora ejecutamos el INSERT en la BD
$result = mysql_query($qry) or die(mysql_error());
// Y necesitamos recuperar el ultimo ID para relacionar sus imagenes
$libro_id = mysql_insert_id ();
// Y ahora sus imágenes (en este caso tiene 3)
for ($i=1;$i<=3;$i++) {
$img_url = $libro->images->image[$i]->url;
$img_des = $libro->images->image[$i]->titulo;
$qry = "INSERT INTO img_libros (libro_id, url, descripcion) ".
"VALUES ($libro_id, '$img_url', '$img_des')";
$result = mysql_query($qry) or die(mysql_error());
}
// Incrementamos contado para ver cuantos libros se importan.
$count++;
}
echo "<br/>";
echo "-------------------------------------------<br/>";
echo "Total de libros importados: $count properties<br/>";
echo "-------------------------------------------<br/>";
?>
Las funciones claves para la importacion son simplexml_load_file que
carga el fichero XML interpretandolo como un objeto, lo cual simplifica
mucho su manipulación, permitiendonos recorrer todo el fichero con la
función en PHP "foreach ($xml->libro as $libro)" teniendo así para
cada registro de un libro en el XML la oportunidad de obtener sus
valores a través de la variable $libro la cual es un objeto con todas
las propiedades definidas en el XML. El resto del código se encarga de
inserta el registro en la base de datos y luego recorremos las imágenes
del libro para igualmente insertarlas en la correspodiente tabla.
Destacando aquí el uso de la función mysql_insert_id() para obtener el
valor del ID del último registro insertado en la tabla libros.
CREATE TABLE `libros` (
`id` int(4) unsigned NOT NULL auto_increment,
`codigo` varchar(15) default NULL,
`titulo` varchar(30) default NULL,
`editorial` varchar(25) NOT NULL,
`autor` varchar(30) default NULL,
`descripcion` varchar(500) default NULL,
`precio` decimal(10,0) default NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `img_libros` (
`id` int(4) NOT NULL auto_increment,
`libro_id` int(4) NOT NULL,
`url` varchar(250) NOT NULL,
`descripcion` varchar(30) default NULL,
PRIMARY KEY (`id`)
);
Bueno espero que les haya sido de utilidad este rápido vistazo a la
importación de XML y dejen sus comentarios al respecto. Hasta el
próximo post!