sql >> Database teknologi >  >> RDS >> Mysql

PHP-kodningsfejl ved fremstilling af XML fra database

Dit spørgsmål er virkelig bredt, det bedste svar, jeg kan give, er, at du skal bruge et eksisterende bibliotek til at kode XML'en i stedet for at skrive dit eget (da du åbenbart mislykkes med jobbet, derfor XML-kodningsfejlen rapporteret af XML-forbrugeren).

Brug af et eksisterende bibliotek vil også give dig mulighed for at påpege problemer tidligere. For eksempel. for følgende kode skal du sikre dig, at alt du får tilbage fra din database er UTF-8-kodede strenge.

Også brug af en mere moderne databaseklientklasse vil også hjælpe dig til i høj grad bare at skrive koden ned. Her er et eksempel med PDO og DOMDocument :

### configuration values

$config = array(
    'Database'     => array(
        'dsn'  => 'mysql:dbname=test;host=localhost;charset=utf8',
        'user' => 'testuser',
        'pass' => 'test',
    ),
    'table_name'   => 'config',
    'table_fields' => '*',
);

### implement database access

class Database extends PDO
{
    public function __construct(array $config = null)
    {
        $config = $config ? : $GLOBALS['config'][__CLASS__];
        parent::__construct($config['dsn'], $config['user'], $config['pass']);
        $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
        $this->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    }
}

### setup the datasource ($rows)

$db   = new Database();
$rows = $db->query("SELECT $config[table_fields] FROM $config[table_name]");

### setup the XML encoder ($doc)

$doc               = new DOMDocument();
$doc->formatOutput = true;
$doc->loadXML("<$config[table_name]s/>");
$doc->encoding = 'utf-8';

### fetch data from the datasource and encode the XML

foreach ($rows as $row) {
    $child = $doc->createElement($config['table_name']);
    $child = $doc->documentElement->appendChild($child);
    foreach ($row as $key => $value) {
        $child->appendChild($doc->createElement($key, $value));
    }
}

### output XML

header("Content-Type:text/xml");
echo $doc->saveXML();

Se det DomDocument sørger her for korrekt indkodning af UTF-8-strengene, der returneres fra databasen. Der er (normalt) ikke behov for her længere. Som du kan forestille dig, har du sandsynligvis lagt noget derinde, der brød din XML-kodning.

Også for databaseinteraktionen er det meste af din kode heller ikke nødvendig, du kan bare iterere over rækkerne, hvis der ikke er nogen rækker, ville der ikke være nogen iteration. Dette udtrykkes normalt bedst med en Iterator foreach sprogkonstruktion kan fungere på som leveres af moderne databasegrænseflader. Teknisk set kan du erstatte $rows her med mange andre ting, som en iterator, der går over flere tabeller efter hinanden.

Brug af undtagelsesfejltilstanden sparer dig desuden for at placere checks og død s over hele din kodebase.

Et eksempel på output er:

<?xml version="1.0" encoding="utf-8"?>
<configs>
  <config>
    <id>1</id>
    <option>value for option with ID1</option>
  </config>
  <config>
    <id>2</id>
    <option>value for option with ID2</option>
  </config>
  ...
</configs>

Hvis du så stadig skal oprette CDATA-elementer, fungerer det på samme måde (jeg viser kun en del af scriptet her, som kun indeholder en lille ændring, der tilføjer CDATA-sektioner i stedet for en underordnet værdi):

### fetch data from the datasource and encode the XML

foreach ($rows as $row) {
    $child = $doc->createElement($config['table_name']);
    $child = $doc->documentElement->appendChild($child);
    foreach ($row as $key => $value) {
        $child->appendChild($doc->createElement($key))
              ->appendChild($doc->createCDATASection($value))
        ;
    }
}

Også her DOMDocument sørger for korrekt indkodning af CDATA-sektionen. Noget du sandsynligvis ikke gjorde.

Potentielle problemer, du stadig kan støde på, er med tabel- eller rækkenavne, der er ugyldige XML-navne . Men så DOMDocument vil faktisk fortælle dig, så du ved det, mens du genererer XML, ikke kun bagefter med en kodningsfejl.



  1. Top ti MySQL GUI-værktøjer

  2. hvordan man synkroniserer sqlite til Mysql

  3. Fatal fejl:Kald til udefineret funktion mysqli_connect() i... mens PHP 5.4.22 og MySQL 5.5 forbindes med Apache 2.4.7

  4. Indre join med 3 borde i mysql