Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [php5 OOP] trasformazione db in xml consigli e aiuto

    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->createElementsubstr($this->tabella03) );
                
    //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
    Questa volta, più che un voto.. è favoreggiamento.

  2. #2
    La mia versione
    Codice PHP:
    try {
        
    $db = new PDO('mysql:host=localhost;dbname=mioDb''user''password');
        
    $db->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
        
    $db->setAttribute(PDO::ATTR_CASEPDO::CASE_LOWER);
        
    $db->query("SET NAMES 'utf8' COLLATE 'utf8_general_ci'");
    } catch (
    PDOException $e) {
        echo 
    'Connection failed: ' $e->getMessage();
    }
    class 
    buildXml 
        private 
    $db
        private 
    $tabella
        private 
    $dom
        public function 
    __construct(PDO $db$tabella '',$versione '1.0'$charset 'UTF-8') { 
            
    $this->db $db
            if (
    $tabella == '') { 
                throw new 
    Exception('Devi indicare quale tabella vuoi aggiornare!!'); 
            } 
            
    $this->tabella $tabella
            
    $this->dom = new DOMDocument($versione$charset);
            
    $this->creaXml();
        } 
        
        private function 
    __eseguiQuery() { 
            
    $rows= array();
               foreach(
    $this->db->query("SELECT * FROM ".$this->tabella) as $row){
                
    $rows[]= $row;
            }
            return 
    $rows;
        } 
        private function 
    creaXml() { 
              
    $rows$this->__eseguiQuery();
            
    $domRoot$this->dom->createElement($this->tabella); 
               
    $this->dom->appendChild($domRoot);
               foreach (
    $rows as $row) { 
                
    $item$this->dom->createElement('item');
                foreach (
    $row as $key => $value){
                    if(
    is_string($key)){ 
                        
    $node$this->dom->createElement($key);
                        
    $text$this->dom->createTextNode($value);
                        
    $node->appendChild($text); 
                        
    $item->appendChild($node);
                    }
                } 
                
    $domRoot->appendChild($item);
            } 
           } 
        public function 
    showXml(){
            
    header('Content-Type: text/xml'); 
            
    //ritorno il documento xml corretto 
            
    echo $this->dom->saveXML();
        }
        public function 
    save($fileName){
            
    $this->dom->save($fileName);
        }
    }
    $o= new buildXml($db,'posts');
    $o->showXml();
    $o->save('pippo.xml'); 
    Scusa ma nella tua mi sono perso
    (imho devi separare i vari passaggi)
    e allora ho preferito postare una mia versione (visto che tra le altre cose dovrò farne una per un progetto)


    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  3. #3
    Dovremmo lavorare insieme io te..


    Per chi ha voglia di studiarsela, un pò di mio e un pò di whisher circa mezzagiornata di lavoro (almeno per me), una classe che recupera tutti i dati presenti in una tabella e li trasforma in un documento xml valido.. Se trovate dei bug o se magari vorreste che fosse in grado di fare altre cose postate pure e ci pensiamo.. la versione è ancora giovane quindi non è perfetta di sicuro.. ma insoma qualcosa fà..
    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->__creaXml();
        }

        
    /***
        ** @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!!');
            }
            
    $righe = array();
            while (
    $righe $risultato->__fetchArray()) {
                    
    $elementi[] = $righe;
            }
            return 
    $elementi;    
        }
        
        private function 
    __creaXml() {
            
    $elementi $this->__eseguiQuery();
            
    //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 ($elementi AS $v) {
                
    $contenitore $this->dom->createElementsubstr($this->tabella03) );
                
    $domRoot->appendChild($contenitore);
            
                
    //attacco gli elementi/campi della tabella
                
    foreach ($v AS $key=>$value) {
                    
    $nodo$this->dom->createElement($key);
                    
    $testo$this->dom->createTextNode($value);
                    
    $nodo->appendChild($testo);
                    
    $contenitore->appendChild($nodo); 
                }
            }
        }

        public function 
    __mostraXml() {
            
    header('Content-Type: text/xml');
            
    //ritorno il documento xml corretto
            
    echo $this->dom->saveXML();
        }

        public function 
    salvaXml($nomeFile) {
            
    $this->dom->saveXml($nomeFile);
        }
    }

    /***********************test di funzionamento***/
    require_once('database.php');
    $datiAccessoDb = array('host'=>''
                        
    'user'=>''
                        
    'password'=>''
                        
    'database'=>''
                        
    );

    $db = new database($datiAccessoDb);

    $xml = new buildXml($db'artisti');
    $xml->__mostraXml(); 
    buon divertimento
    Questa volta, più che un voto.. è favoreggiamento.

  4. #4
    Codice PHP:
    public function __creaHeader($versione '1.0'$charset 'UTF-8') { 
            
    //nuovo oggetto DOMDocument e relativa intestazione del documento xml 
            
    $this->dom = new DOMDocument($versione$charset); 
        } 
    L'istanza di DOMDocument lo metterei nel costruttore.
    Nel tuo modo se vuoi cambiare il charset devi chiamare due volte lo stesso metodo

    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  5. #5
    Una piccola domanda.. se provo a cambiare il $charset in "iso-8859-1" il documento xml mi ritorna un'errore.. :master: il che mi pare molto strano..
    Questa volta, più che un voto.. è favoreggiamento.

  6. #6
    Originariamente inviato da Al_katraz984
    Una piccola domanda.. se provo a cambiare il $charset in "iso-8859-1" il documento xml mi ritorna un'errore.. :master: il che mi pare molto strano..
    I dati del Db in che formato sono ?
    (a parte che un errore mi sembra un po troppo
    capirei di + qualche segno strano)





    [EDIT]

    Ho provato e errori non ne vedo.
    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  7. #7
    Ho appena provato,

    Errore interpretazione XML: contenuto illegale dopo l'elemento
    Indirizzo: http://www.******.com/class/buildxml.php
    Linea numero 2, colonna 1:
    Devo controllare come sono salvati i dati nella tabella.. :master:
    Questa volta, più che un voto.. è favoreggiamento.

  8. #8
    tutti utf-8-general-ci

    forse può essere utile un metodo che mi controlla la collation della tabella e in base a quello ritorna il documento xml corretto.. Poi pensavo anche al fatto che una tabella può essere agganciata anche ad altre tabelle, il che sarebbe bello seguire tutti i punti di join e ritornare un'xml completo..

    Nel mio caso un'artista può avere una sua foto, diventa intricata la cosa xò.. ci penso intanto..
    Questa volta, più che un voto.. è favoreggiamento.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.