我正在嘗試將一些資料從資料庫匯出到 XML 檔案,然后將檔案發送到瀏覽器(可下載),我現在可以下載檔案,但有些資料丟失了!
這是存在問題的代碼部分:
<?php
include('session.php');
if (isset($_POST['exportxml'])) {
$filename = 'Data_Backup_' . date('m-d-Y_his') . '.xml';
$domtree = new DOMDocument('1.0', 'UTF-8');
$domtree->formatOutput = true;
$xml = new XMLWriter();
header('Content-Disposition: attachment;filename=' . $filename);
header('Content-Type: text/xml');
$xml->openURI("php://output");
$xml->setIndent(true);
$xml->startElement('data');
if (isset($_POST['exportaccounts'])) {
$query = "SELECT * from users";
$result = mysqli_query($conn, $query);
if (mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_assoc($result)) {
$xml->startElement("useraccount");
$xml->writeElement("id", $row['id']);
$xml->writeElement("username", $row['username']);
$xml->writeElement("email", $row['email']);
$xml->writeElement("state", $row['state']);
$xml->endElement();
}
}
}
if (isset($_POST['exporttimzezone'])) {
$query7 = "SELECT * from options where optionname = 'timezone'";
$result7 = mysqli_query($conn, $query7);
if (mysqli_num_rows($result7) > 0) {
while ($row7 = mysqli_fetch_assoc($result7)) {
$xml->startElement("timezone");
$xml->writeElement("id", $row7['id']);
$xml->writeElement("optionname", $row7['optionname']);
$xml->writeElement("value", $row7['value']);
$xml->writeElement("state", $row7['state']);
$xml->endElement();
}
}
}
$xml->startElement("version");
$xml->writeElement("id", "1.0");
$xml->endElement();
$xml->endElement();
echo $domtree->saveXML();
exit;
$xml->flush();
?>
我不知道丟失資料問題的原因是什么,因為我以前從未在 php 中處理過 XML 函式。
PS:與資料庫的所有連接都成功并且所有資料都存在并且從表中提取沒有任何問題
問候
uj5u.com熱心網友回復:
您讓您的 DOMDocument 和 XMLWriter 感到困惑。
如果這樣做,腳本中唯一與 DOMDocument 相關的代碼行...
$domtree = new DOMDocument('1.0', 'UTF-8');
$domtree->formatOutput = true;
echo $domtree->saveXML();
您得到一個有效的 XML 檔案,但其中沒有任何內容,這就是您發送給客戶端的內容,一個空的 xml 檔案,在實際的 XMLWriter 檔案之后,所以事情變得混亂了。
結果
<?xml version="1.0" encoding="UTF-8"?>
這可以解釋您丟失的資料。所以整個 $domtree 的東西是無關緊要的。
因此,您只需要 XMLWriter。
注意 此行
$xml->openUri('php://stdout');
說直接將 xml 輸出寫入客戶端,這可能解釋了您的問題“標頭已發送....”,因為我假設您最初在通話header()后有 2 行。openUri()
將您想要的資料型別寫入 XMLWrites 并因此寫入客戶端的示例代碼。請注意原始代碼中沒有的幾行以使檔案完整
$xml = new XMLWriter();
$xml->openUri('php://stdout');
$xml->startDocument();
$xml->setIndent(true);
$xml->startElement('data');
// User
$xml->startElement("useraccount");
$xml->writeElement("id", 1);
$xml->writeElement("username", 'Fred');
$xml->writeElement("email", '[email protected]');
$xml->writeElement("state", 'NY');
$xml->endElement();
$xml->startElement("useraccount");
$xml->writeElement("id", 2);
$xml->writeElement("username", 'Bill');
$xml->writeElement("email", '[email protected]');
$xml->writeElement("state", 'NY');
$xml->endElement();
// Timezone
$xml->startElement("timezone");
$xml->writeElement("id", 3);
$xml->writeElement("optionname", 'Option 1');
$xml->writeElement("value", '99');
$xml->writeElement("state", 'CA');
$xml->endElement();
$xml->startElement("timezone");
$xml->writeElement("id", 3);
$xml->writeElement("optionname", 'Option 2');
$xml->writeElement("value", '11');
$xml->writeElement("state", 'TX');
$xml->endElement();
$xml->startElement("version");
$xml->writeElement("id", "1.0");
$xml->endElement();
$xml->endElement(); // data element
$xml->endDocument();
結果
<?xml version="1.0"?>
<data>
<useraccount>
<id>1</id>
<username>Fred</username>
<email>[email protected]</email>
<state>NY</state>
</useraccount>
<useraccount>
<id>2</id>
<username>Bill</username>
<email>[email protected]</email>
<state>NY</state>
</useraccount>
<timezone>
<id>3</id>
<optionname>Option 1</optionname>
<value>99</value>
<state>CA</state>
</timezone>
<timezone>
<id>3</id>
<optionname>Option 2</optionname>
<value>11</value>
<state>TX</state>
</timezone>
<version>
<id>1.0</id>
</version>
</data>
現在,當您洗掉 DOMDocument 內容時,您應該發送一個包含所有資料的 XMLDocument,并且僅此而已。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/525000.html
標籤:phpxml
上一篇:淺談PHP設計模式的裝飾器模式
