2017-04-23 48 views
-1

我需要帮助与代码解释,所以我能理解如何处理多个表:处理多个表到MySQL数据库的数据导出到XML

也有几个表名为

公寓,性质,类别,开发商

  1. 公寓列(ID,CATEGORY_ID,developer_id,PROPERTY_ID, 标题,价格)
  2. 类别列(ID,标题)
  3. 开发商列(ID,标题)
  4. 性质列(ID,标题,CATEGORY_ID)

如下两者之间的关系:

  • category_idid同步categories列表
  • developer_id与同步列developers
  • property_idproperties

同步与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> 

输出我使用此代码检索使来自一个表的数据

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(); 
+0

,而不是做在公寓的每一行查询,只需使用一个SQL连接到其他表,做一个查询。 –

回答

1

正如在comm ents,你想使用连接来获得你想要的值。左连接确保包含来自公寓表的所有记录,而来自其他表(如果有)的缺失值将作为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); 

通知我的表设置别名(使SQL清洁剂),也为列,构建XML时使用。您可以循环播放结果,而不是分别为每列调用createElement。这是可能的,因为我已经将获取类型指定为关联数组,而不是默认的获取类型,该类型既是关联数字型的,也是数字型的。最后一个注意事项是,如果没有参数,则不需要prepare()和​​声明。只需运行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);