处理多个表以将 mysql 数据库数据导出到 xml

Deal with multiple tables to export mysql db data to xml

我需要解释代码的帮助,这样我才能理解如何处理多个 table:

有几个 table 叫

apartments, properties, categories, developers

  1. 公寓列(id,category_id,developer_id,property_id, 标题,价格)
  2. 类别列(id、标题)
  3. 开发者专栏(id,title)
  4. 属性列(id,标题,category_id)

它们之间的关系如下:

我需要更新下面的 php 代码来使输出像那样

<?xml version="1.0" ?>
<list>  
    <property>
        <title>apartments_title</title >
        <price>apartments_price</price >
        <type>properties_title</type>
        <categoty>categories_title</categoty>
        <developer>developer_title</developer>
   </property>

</list>

我使用此代码从一个 table

中检索数据
header('Content-type: text/xml');

// INITIALIZE DOM OBJECT
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true;            
$dom->preserveWhiteSpace = false;

// CREATE ROOT AND APPEND TO DOCUMENT
$xmlRoot = $dom->createElement("list");
$xmlRoot = $dom->appendChild($xmlRoot);

// QUERY DATABASE
$db = new PDO('mysql:host=hostname;dbname=dbname','dbusername','password');
$stmt = $db->prepare("select * from apartments");
$stmt->execute();

// FETCH ROWS ITERATIVELY
while($row = $stmt->fetch()){
     // APPEND property AS CHILD OF ROOT
     $propertyNode = $xmlRoot->appendChild($dom->createElement('property'));

     // APPEND CHILDREN TO Property         
     $propertyNode->appendChild($dom->createElement('title', $row['title']));
     $propertyNode->appendChild($dom->createElement('price', $row['price']));
}
$stmt = null; 
$db = null;

// OUTPUT TO SCREEN
echo $dom->saveXML();

如评论中所述,您想使用联接来获取所需的值。左连接确保包含公寓 table 中的所有记录,而其他 table 中的缺失值(如果有)将作为 NULL 返回。

SELECT a.title AS title, a.price AS price, p.title AS type,
    c.title AS category, d.title AS developer
FROM apartments a
LEFT JOIN properties p ON (a.property_id = p.id)
LEFT JOIN categories c ON (a.category_id = c.id)
LEFT JOIN developers d ON (a.developer_id = d.id);

请注意,我已经为 table 设置了别名(以使 SQL 更清晰),还为列设置了别名,以便在构建 XML 时使用。您可以只遍历结果,而不是为每一列分别调用 createElement。这是可能的,因为我已将提取类型指定为关联数组,而不是默认的提取类型,后者既是关联数组又是数字数组。最后一点,如果没有参数,则不需要 prepare()execute() 语句。简单地 运行 query() 会给你相同的结果。

<?php
header('Content-type: text/xml');

// INITIALIZE DOM OBJECT
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true;            
$dom->preserveWhiteSpace = false;

// CREATE ROOT AND APPEND TO DOCUMENT
$xmlRoot = $dom->createElement("list");
$xmlRoot = $dom->appendChild($xmlRoot);

// QUERY DATABASE
$db = new PDO('mysql:host=hostname;dbname=dbname','dbusername','password');
$stmt = $db->query("SELECT a.title AS title, a.price AS price, p.title AS type, c.title AS category, d.title AS developer FROM apartments a LEFT JOIN properties p ON (a.property_id = p.id) LEFT JOIN categories c ON (a.category_id = c.id) LEFT JOIN developers d ON (a.developer_id = d.id);");

// FETCH ROWS ITERATIVELY
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
    // APPEND property AS CHILD OF ROOT
    $propertyNode = $xmlRoot->appendChild($dom->createElement('property'));
    foreach ($row as $element=>$value) {
        // APPEND CHILDREN TO Property         
        $propertyNode->appendChild($dom->createElement($element, $value));
    }
}

// OUTPUT TO SCREEN
echo $dom->saveXML();

如果您将此数据提供给您自己的服务,您可能需要考虑 JSON 而不是 XML。 JSON 更简单的数据结构和 PHP 非常简洁的内置函数将使这个程序小得多:

<?php
header('Content-type: application/json');    

// QUERY DATABASE
$db = new PDO('mysql:host=hostname;dbname=dbname','dbusername','password');
$stmt = $db->query("SELECT a.title AS title, a.price AS price, p.title AS type, c.title AS category, d.title AS developer FROM apartments a LEFT JOIN properties p ON (a.property_id = p.id) LEFT JOIN categories c ON (a.category_id = c.id) LEFT JOIN developers d ON (a.developer_id = d.id);");

// FETCH ROWS
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC));

// OUTPUT TO SCREEN
echo json_encode($rows);