Intanto vediamo il codice:
Codice PHP:
error_reporting(E_ALL);
/****************************************************
*** BuildXml class copyright: Mindexperiment
*** write mail to: [email]andrewloyd@libero.it[/email]
*** version: 0.01 alpha
*** this class let you build a correct xml document from a database table
*****************************************************/
class buildXml {
private $db;
private $tabella;
private $dom;
/***
** @db = collegamento al database per poter eseguire le query di selezione
** @dom = collegamento alla classe DOMDocument
** @tabella = la tabella da selezionare, questo sarà anche il nome del successivo file xml che si crea
***/
public function __construct($db, $tabella = '') {
$this->db = $db;
if ($tabella == '') {
throw new Exception('Devi indicare quale tabella vuoi aggiornare!!');
}
$this->tabella = $tabella;
$this->__creaHeader();
$this->__eseguiQuery();
}
/***
** @versione = imposto la versione del documento xml da creare
** @cahrset = imposto il charset del documento xml da creare
***/
public function __creaHeader($versione = '1.0', $charset = 'UTF-8') {
//nuovo oggetto DOMDocument e relativa intestazione del documento xml
$this->dom = new DOMDocument($versione, $charset);
}
//eseguo la query di selezione
private function __eseguiQuery() {
//query di selezione dei campi della tabella
$this->db->__query("SELECT * FROM %s", $this->tabella);
if (!$risultato = $this->db->__risultato()) {
throw new Exception('La tabella che stai cercando di recuperare potrebbe non esistere!!');
}
//array di elementi che equivale ai campi della tabella che vogliamo riprodurre come file xml
$elementi = array();
//array contenente un tag creato al volo per suddividere ogni riga della tabella
$contenitore = array();
while ($righe = $risultato->__fetchArray()) {
//il tag fittizio viene creato con le prime 3 lettere del nome della tabella
$contenitore[] = $this->dom->createElement( substr($this->tabella, 0, 3) );
//creo un'elemento xml per ogni campo della tabella
foreach ($righe AS $k=>$v) {
$elementi[] = $this->dom->createElement($k, $v);
}
}
//creo il file xml con gli array appena creati
$this->__creaXml($contenitore, $elementi);
}
public function __creaXml($contenitore = array(), $elementi = array()) {
//la radice del documento si chiama come la tabella che vogliamo esportare
$domRoot = $this->dom->createElement($this->tabella, '');
//atacco la root all'intestazione del documento
$this->dom->appendChild($domRoot);
//per ogni contenitore
foreach ($contenitore AS $cont) {
$domRoot->appendChild($cont);
//attacco gli elementi/campi della tabella
foreach ($elementi AS $v) {
$cont->appendChild($v);
}
}
header('Content-Type: text/xml');
//ritorno il documento xml corretto
echo $this->dom->saveXML();
}
}
Diciamo che la classe funziona quasi bene, l'unico problema stà nel metodo __CreaXml() vi spiego con un'esempio:
Tabella: artisti
Campi: nome - cognome - indirizzo
riga 1: valore1 - valore1 - valore1
riga 2: valore2 - valore2 - valore2
Il risultato è:
Codice PHP:
<?xml ......?>
<artisti>
<art />
<art>
<nome>valore1</nome>
<cognome>valore1</cognome>
<indirizzo>valore1</indirizzo>
<nome>valore2</nome>
<cognome>valore2</cognome>
<indirizzo>valore2</indirizzo>
</art>
</artisti>
Come si nota il primo <art/> che risulta essere un tag vuoto, dovrebbe essere il contenitore dei "valore1".. Da questo deduco che sia un problema nei due foreach sul metodo __creaXml() sicuramente è una ca***ta ma sono troppo fuso per risolvere, cosi chiedo a voi..
Se avete anche altri consigli da dare, al momento la classe è basilare, successivamente dovrò fare in modo di salvare il tutto in file.xml per poi lavorare solo su quelli.. aggiorno il db, si aggiorna l'xml e presento il tutto con xslt javascript e via dicendo.. risparmiando il server..
Ringrazio quanti avranno la pazienza di darci un'occhiata, magari copiatela e provate cosi vedete con i vostri occhi il risultato.. e mi dite cosa va e cosa è da migliorare..
Thanks