Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将一个父级和多个相同的子级转换为xml_Php_Mysql_Xml - Fatal编程技术网

Php 将一个父级和多个相同的子级转换为xml

Php 将一个父级和多个相同的子级转换为xml,php,mysql,xml,Php,Mysql,Xml,大家好,我有一种情况,我想使用php从mysql中的一些表创建一个xml,到目前为止还没有问题,但是当我有多个相同的命名子级时,我的问题就出现了 我的表格如下: 自行车 独特的功能 +-----+------------------+---------+ | Uid | Feature | Bike_id | +-----+------------------+---------+ | 1 | Micron exhaust | 27 | | 2 | Sin

大家好,我有一种情况,我想使用php从mysql中的一些表创建一个xml,到目前为止还没有问题,但是当我有多个相同的命名子级时,我的问题就出现了

我的表格如下:

自行车

独特的功能

+-----+------------------+---------+
| Uid |     Feature      | Bike_id |
+-----+------------------+---------+
|   1 | Micron exhaust   |      27 |
|   2 | Single seat      |      27 |
|   3 | Scorpion exhaust |      53 |
|   4 | Custom paint     |      53 |
|   5 | L.E.D lights     |      53 |
|   6 | Induction kit    |      53 |
+-----+------------------+---------+
事实

+-----+-----------------+-----------+--------+---------+
| Uid | nought_to_sixty | Top_speed | weight | Bike_id |
+-----+-----------------+-----------+--------+---------+
|   1 |             3.2 |       160 |    120 |      27 |
|   2 |               4 |       160 |    150 |      33 |
|   3 |             3.5 |       150 |    100 |      53 |
+-----+-----------------+-----------+--------+---------+
我想要的输出如下所示:

<Bikes>
  <Bike>
    <Bike_id>53</Bike_id>
    <Bike_name>CBR600</Bike_name>
    <Bike_year>2001</Bike_year>
    <Bike_facts>
        <nought_to_sixty>3.5</nought_to_sixty>
        <Top_speed>150</Top_speed>
        <Weight>100</Weight>
    </Bike_facts>
    <Unique_features>
        <feature>Scorpion exhaust</feature>
        <feature>Custom paint</feature>
        <feature>L.E.D lights</feature>
        <feature>Induction kit</feature>
    </Unique_features>
  </Bike>
  <Bike>
    <Bike_id>27</Bike_id>
    <Bike_name>ZXR750</Bike_name>
    <Bike_year>1995</Bike_year>
    <Bike_facts>
        <nought_to_sixty>3.2</nought_to_sixty>
        <Top_speed>160</Top_speed>
        <Weight>120</Weight>
    </Bike_facts>
    <Unique_features>
        <feature>Micron exhaust</feature>
        <feature>Single seat</feature>
    </Unique_features>
  </Bike>
  <Bike>
    <Bike_id>33</Bike_id>
    <Bike_name>FZR1000</Bike_name>
    <Bike_year>1992</Bike_year>
    <Bike_facts>
        <nought_to_sixty>4</nought_to_sixty>
        <Top_speed>160</Top_speed>
        <Weight>150</Weight>
    </Bike_facts>
  </Bike>
</Bikes>

53
CBR600
2001
3.5
150
100
蝎子排气
定制油漆
LED灯
诱导套件
27
ZXR750
1995
3.2
160
120
微米排气
单座
33
FZR1000
1992
4.
160
150
我可以制作:

<bikes>
  <bike bike_id="27">
    <bike_name>ZXR750</bike_name>
    <bike_year>1995</bike_year>
    <bike_facts>
      <nought_to_sixty>3.2</nought_to_sixty>
      <top_speed>160</top_speed>
      <weight>120</weight>
    </bike_facts>
  </bike>
  <bike bike_id="33">
    <bike_name>FZR1000</bike_name>
    <bike_year>1992</bike_year>
    <bike_facts>
      <nought_to_sixty>4</nought_to_sixty>
      <top_speed>160</top_speed>
      <weight>150</weight>
    </bike_facts>
  </bike>
  <bike bike_id="53">
    <bike_name>CBR600</bike_name>
    <bike_year>2001</bike_year>
    <bike_facts>
      <nought_to_sixty>3.5</nought_to_sixty>
      <top_speed>150</top_speed>
      <weight>100</weight>
    </bike_facts>
  </bike>
</bikes>

ZXR750
1995
3.2
160
120
FZR1000
1992
4.
160
150
CBR600
2001
3.5
150
100
使用此代码:

$mysqli = new mysqli("localhost", "root", "", "Bikes");

if ($mysqli->connect_errno) 
{
  echo "Connect failed ".$mysqli->connect_error;
  exit();
}

$query = "SELECT  
b.bike_name,
b.bike_year,
b.bike_id,
f.nought_to_sixty,
f.top_speed,
f.weight
FROM Bike b
LEFT JOIN Bike_facts f on b.bike_id = f.bike_id";

$bikesArray = array();

if ($result = $mysqli->query($query)) 
{
  while ($row = $result->fetch_assoc()) 
    {
      array_push($bikesArray, $row);
    }
  if(count($bikesArray))
  {
     createXMLfile($bikesArray);
  }
  $result->free();
}
$mysqli->close();


function createXMLfile($bikesArray)
{
  $filePath = 'bike.xml';
  $dom     = new DOMDocument('1.0', 'utf-8'); 
  $root      = $dom->createElement('bikes'); 
  for($i=0; $i<count($bikesArray); $i++)
  {
    $bikeid            =  $bikesArray[$i]['bike_id'];  
    $bike_name         =  $bikesArray[$i]['bike_name']; 
    $bike_year         =  $bikesArray[$i]['bike_year']; 
    $nought_to_sixty   =  $bikesArray[$i]['nought_to_sixty']; 
    $top_speed         =  $bikesArray[$i]['top_speed']; 
    $weight            =  $bikesArray[$i]['weight'];

    $bike             = $dom->createElement('bike');
    $bike->setAttribute('bike_id', $bikeid);
    $bike_name        = $dom->createElement('bike_name', $bike_name); 
    $bike->appendChild($bike_name); 
    $bike_year        = $dom->createElement('bike_year', $bike_year); 
    $bike->appendChild($bike_year); 
    $bike_facts       = $dom->createElement('bike_facts');   
    $nought_to_sixty  = $dom->createElement('nought_to_sixty', 
$nought_to_sixty); 
    $bike_facts->appendChild($nought_to_sixty); 
    $top_speed        = $dom->createElement('top_speed', $top_speed); 
    $bike_facts->appendChild($top_speed); 
    $weight           = $dom->createElement('weight', $weight); 
    $bike_facts->appendChild($weight);
    $bike->appendChild($bike_facts);
    $root->appendChild($bike);
  }
  $dom->appendChild($root); 
  $dom->save($filePath); 
} 
$mysqli=newmysqli(“localhost”、“root”、“Bikes”);
如果($mysqli->connect\u errno)
{
回显“连接失败”。$mysqli->Connect\u错误;
退出();
}
$query=“选择
b、 你的名字,
b、 自行车年,
b、 自行车号码,
f、 零到六十,
f、 最高速度,
f、 重量
从自行车b
在b.Bike_id=f.Bike_id上左连接Bike_事实f”;
$bikesArray=array();
如果($result=$mysqli->query($query))
{
而($row=$result->fetch_assoc())
{
阵列推送($bikesArray,$row);
}
如果(计算($bikesArray))
{
createXMLfile($bikesArray);
}
$result->free();
}
$mysqli->close();
函数createXMLfile($bikesArray)
{
$filePath='bike.xml';
$dom=新的DOMDocument('1.0','utf-8');
$root=$dom->createElement('bikes');
对于($i=0;$icreateElement('bike');
$bike->setAttribute('bike_id',$bikeid);
$bike\u name=$dom->createElement($bike\u name',$bike\u name);
$bike->appendChild($bike\u name);
$bike\u year=$dom->createElement($bike\u year',$bike\u year);
$bike->appendChild($bike\u year);
$bike_facts=$dom->createElement('bike_facts');
$nought_to_sexten=$dom->createElement('nought_to_sexten',
零至六十美元);
$bike\u facts->appendChild(零到六十美元);
$top\u speed=$dom->createElement($top\u speed',$top\u speed);
$bike\u facts->appendChild($top\u speed);
$weight=$dom->createElement('weight',$weight);
$bike_facts->appendChild($weight);
$bike->appendChild($bike\u facts);
$root->appendChild($bike);
}
$dom->appendChild($root);
$dom->save($filePath);
} 

但是我不确定如何获得unique_features部分,这可以通过sql完成吗?我所有的尝试都为每个unique_features创建了一个新行,这显然是我不想要的。我唯一能想到的另一种方法是使用单独的xml并合并这两个部分,我也不想这样做。

首先,更改查询以将数据包含在unique_features中

$query = "SELECT  
    b.`bike_name`,
    b.`bike_year`,
    b.`bike_id`,
    f.`nought_to_sixty`,
    f.`top_speed`,
    f.`weight`,
    GROUP_CONCAT(u.`feature`) as `features`
FROM Bike b
LEFT JOIN `Bike_facts` f 
    ON b.`bike_id` = f.`bike_id`
LEFT JOIN `unique_features` u
    ON u.`bike_id` = b.`bike_id`
GROUP BY b.`bike_id`
";
在构建XML的循环中,分解列特征(将以逗号分隔),并将其添加到XML中,就像处理bike_事实一样


要了解SQL查询中数据的外观,请在phpAdmin(或类似程序)中运行它。您将看到一列,其中的功能用逗号分隔。如果您的数据可能包含逗号,您可以更改GROUP_CONCAT函数中的分隔符。您还可以指定数据的顺序。

一些合理的代码缩进将是一个好主意。它可以帮助我们阅读代码,更重要的是,它将帮助您为自己的b调试代码enefit。您可能会在几周/几个月后被要求修改此代码,最终您会感谢我。您的问题中的表格是否标记错误?在您当前的结果中,您似乎缺少标记为独特功能的表格中的信息,包括来自自行车事实的信息,但代码显示了相反的结果。是的,很抱歉,我尝试了一场噩梦发布上述代码(长时间lisetner…等等)因此,它可能没有惊人的意义,但我认为它会给出一个想法。我现在会再看一遍,并根据需要进行更新。好的,我想我已经整理好了一点,@sloan,对不起,我不确定你是否明白我的意思,第一个xml是我想要它的外观,我缺少独特功能部分,因为我不确定如何获得它,我希望它可以用一个直截了当的SQL查询来完成,而不必有第二个查询或某种函数。希望把它清理出来,得到一个你想要的,哪一个是期望的输出。不同之处似乎是你想要UngQuy特性,但是这不是你当前的输出。XML的t部分似乎来自您标记为bike_facts的数据,而标记为bike_facts的XML部分来自标记为Unique_features的数据。这就是我所说的。我在上面的评论中应该更清楚。谢谢,这看起来是可能的,但是我可能会遇到一些在Unique features descr中有逗号的数据iption。今晚我将查看一下选项,看看是否可以使用(可能会转义它们等)。再次感谢。一个更简单的解决方案是将组_CONCAT中的分隔符更改为竖线“|”或其他未出现在数据中的字符。查找GROUP_CONCAT的语法。您甚至可以指定函数返回数据的顺序。
$query = "SELECT  
    b.`bike_name`,
    b.`bike_year`,
    b.`bike_id`,
    f.`nought_to_sixty`,
    f.`top_speed`,
    f.`weight`,
    GROUP_CONCAT(u.`feature`) as `features`
FROM Bike b
LEFT JOIN `Bike_facts` f 
    ON b.`bike_id` = f.`bike_id`
LEFT JOIN `unique_features` u
    ON u.`bike_id` = b.`bike_id`
GROUP BY b.`bike_id`
";