PHPRO.ORG

This class provides a simple yet powerful method for creating an XML string from a PDO result stmt. The PDO::statement object is used as it implements the SPL traversable object, thus allowing the use of iterators to traverse the result set which makes for effecient conversions, partiularly on large result sets.

When the XML string has been aquired, it is most common to write it to a file for caching, rather than re-creating the string dynamically on each occassion it is required.


<?php

class pdo2xml {

/*
 * @The root node
 */
private $rootNode;

/*
 * @The DOM object
 */
private $dom;

/*** The constructor, duh! ***/
public function __construct ()
{
    
/*** create a new dom object ***/
    
$this->dom = new DOMDocument();
}


/**
 *
 * @setter
 *
 * @access public
 *
 */
public function __set($name$value)
{
    switch (
$name)
    {
        case 
'rootNode':
        if(!
is_string($value))
        {
            throw new 
Exception$name$value'string' );
        }
        
$this->$name $value;
        break;

        default;
        throw new 
Exception ('Invalid Setter');
    }
}


/*
 *
 * @getter
 *
 * @access public
 *
 */
public function __get$name )
{
    switch ( 
$name )
    {
        case 
'rootNode':
        return 
$this->rootNode;
        break;
    }
    
/*** if we are here, throw an excepton ***/
    
throw new Exception"$name is invalid");
}


/*
 *
 * @isset
 *
 * @access public
 *
 */
public function __isset$name )
{
    switch ( 
$name )
    {
        case 
'rootNode':
        
$this->rootNode $name;
        break;
    }
}


/*
 * @ convert query results to xml
 *
 * @ must be a resource from pdo statement
 *
 * @access public
 *
 * @param resource
 *
 * @returm string
 *
 */
public function makeXML($stmt)
{
    
/*** create the root element ***/
    
$root $this->dom->createElement($this->rootNode);
    
$root $this->dom->appendChild($root);

    
/*** iterate over each result set ***/
    
foreach(new IteratorIterator($stmt)as $row)
    {
        
/*** add a new child element to the rootNode ***/
        /*** we could use PDO::ATTR_FETCH_TABLE_NAMES
        but it is not supported by all PDO drivers ***/
        
$occ $this->dom->createElement('item');
        
$occ $root->appendChild($occ);

        
/*** create the array object ***/
        
$arrayObj = new ArrayObject($row);
        
/*** iterate over the objects and add a child for each field ***/
        
for($iterator $arrayObj->getIterator();
        
/*** check if valid ***/
        
$iterator->valid();
        
/*** move to the next array member ***/
        
$iterator->next())
        {
            
/*** create a new element for the field as a child of $occ ***/
            
$child $this->dom->createElement($iterator->key());
            
$child $occ->appendChild($child);

            
/*** add the field value as a textNode child element to the current $child node ***/
            
$value $this->dom->createTextNode($iterator->current());
            
$value $child->appendChild($value);
        }
    }

    
// save the whales
    
return $this->dom->saveXML();
}

/*** end class sql2xml ***/

?>

Example Usage


<?php
    
/*** new pdo2xml object ***/
    
$obj = new pdo2xml;

    
/*** a new database object ***/
    
include 'db.php';
    
$db db::getInstance();

    
/*** get some results ***/
    
$sql "SELECT * FROM elements";

    
/*** prepare the query ***/
    
$stmt $db->prepare($sql);

    
/*** execute ***/
    
$stmt->execute();

    
/*** the stmt MUST be an associative array ***/
    
$stmt->setFetchMode(PDO::FETCH_ASSOC);

    
/*** set the XML root node ***/
    
$obj->rootNode 'results';

    
/*** make the xml ***/
    
$xml $obj->makeXML($stmt);

    echo 
$xml;
?>