处理多个表以将 mysql 数据库数据导出到 xml
Deal with multiple tables to export mysql db data to xml
我需要解释代码的帮助,这样我才能理解如何处理多个 table:
有几个 table 叫
apartments, properties, categories, developers
- 公寓列(id,category_id,developer_id,property_id,
标题,价格)
- 类别列(id、标题)
- 开发者专栏(id,title)
- 属性列(id,标题,category_id)
它们之间的关系如下:
category_id
与 categories
中的 id
列同步 table
developer_id
与 developers
中的 id
列同步 table
property_id
与 properties
中的 id
列同步 table
我需要更新下面的 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);
我需要解释代码的帮助,这样我才能理解如何处理多个 table:
有几个 table 叫
apartments, properties, categories, developers
- 公寓列(id,category_id,developer_id,property_id, 标题,价格)
- 类别列(id、标题)
- 开发者专栏(id,title)
- 属性列(id,标题,category_id)
它们之间的关系如下:
category_id
与categories
中的id
列同步 tabledeveloper_id
与developers
中的id
列同步 tableproperty_id
与properties
中的id
列同步 table
我需要更新下面的 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);