使用Mysqli从SQL生成XML

I'm trying to pull all the data from my users table and display it in XML format. The connection works fine and everything as I have a login and registration set up fine, but I can't seem to get this to display anything other than a white screen.

I've found lots of different tutorials on how to do it with mysql but not mysqli. what am i missing?

generatexml.php

 <?php
include 'connection.php';
$xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
$root_element = $config['users']; 
$xml .= "<$root_element>";

if ($result = $mysqli->query("SELECT * FROM users", MYSQLI_USE_RESULT)) {
                 while($row = $result->fetch_assoc())
                 { 
                 $xml .= "<".$config['users'].">";
                //loop through each key,value pair in row
                 foreach($result_array as $key => $value)
                  {
                   //$key holds the table column name
                   $xml .= "<$key>";
                  //embed the SQL data in a CDATA element to avoid XML entity issues
                  $xml .= "<![CDATA[$value]]>";
                  //and close the element
                  $xml .= "</$key>";
          }
      $xml.="</".$config['users'].">";
    echo $xml;
   }

}

?>

One possible issue could be this line:

if ($result = $mysqli->query("SELECT * FROM users", MYSQLI_USE_RESULT)) {

Try the procedural approach instead of the object oriented approach. I do not know if $mysqli is defined in connection.php, but it is possible that you mixed it up.

if ($result = mysqli_query('SELECT * FROM users', MYSQLI_USE_RESULT)) {

This could resolve the white screen error.

I noticed two other things:

(1) One tiny effectiveness issue:

$xml = '<?xml version="1.0" encoding="UTF-8"?>';

So you do not need to escape every single quotation mark.

(2) One serious XML issue: The root element needs to be closed before you echo your $xml.

$xml .= "</$root_element>";
echo $xml;

Generally, for your purpose, it would be safer to use PHP's XMLWriter extension, as already proposed.

I struggle a lot to find out this solution in mysqli format but nowhere i found the solution. Below is the solution i figured. Run this demo and map it your requirement, surely it will help.

<?php
//Create file name to save
$filename = "export_xml_".date("Y-m-d_H-i",time()).".xml";

$mysql = new Mysqli('server', 'user', 'pass', 'database');
if ($mysql->connect_errno) {
    throw new Exception(sprintf("Mysqli: (%d): %s", $mysql->connect_errno, $mysql->connect_error));
}

//Extract data to export to XML
$sqlQuery = 'SELECT * FROM t1';
if (!$result = $mysql->query($sqlQuery)) {
    throw new Exception(sprintf('Mysqli: (%d): %s', $mysql->errno, $mysql->error));
}

//Create new document 
$dom = new DOMDocument;
$dom->preserveWhiteSpace = FALSE;

//add table in document 
$table = $dom->appendChild($dom->createElement('table'));

//add row in document 
foreach($result as $row) {
    $data = $dom->createElement('row');
    $table->appendChild($data);

    //add column in document 
    foreach($row as $name => $value) {

        $col = $dom->createElement('column', $value);
        $data->appendChild($col);
        $colattribute = $dom->createAttribute('name');
        // Value for the created attribute
        $colattribute->value = $name;
        $col->appendChild($colattribute);           
    }
}

/*
** insert more nodes
*/

$dom->formatOutput = true; // set the formatOutput attribute of domDocument to true 
// save XML as string or file 
$test1 = $dom->saveXML(); // put string in test1
$dom->save($filename); // save as file
$dom->save('xml/'.$filename);   
?>

Here is a solution using php only. You where close to getting it right. This was the key part of the code that I changed "$row as $key => $data" used $row instead of $result_array, ie. iterate through row not the result_array (this contains the entire dataset). Hope this helps someone.

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        $value .="<record>
";
                //loop through each key,value pair in row
                 foreach($row as $key => $data)
                  {
                   //$key holds the table column name
                   $vals = "\t" . "<". $key . ">" . "<![CDATA[" . $data . "]]>" . "</" . $key . ">" . "
";
                   $value = $value . $vals;
                   //echo $value;
                  }
        $value .="</record>
";
        $count++;
    }
} else {
    // echo "0 results";
}
$conn->close();