【问题标题】:Using nested while loops for subtags (PHP script generating a dynamic XML file)对子标签使用嵌套的 while 循环(生成动态 XML 文件的 PHP 脚本)
【发布时间】:2015-11-01 18:42:22
【问题描述】:

我刚刚开始学习 PHP 和 XML,请耐心等待! 我需要使用 PHP 脚本从 MYSQL 数据库生成动态 XML 文件。

我希望我的输出如下所示:

<Post>
  <Title>
  <Tags>
    <Tag>
    <Tag>
    <Tag>
  <Date>
  etc.
</Post>

<Post>
</Post>

现在我已经成功地进行了查询并在 While-Loop 中使用了它。但我实际上还有第二个查询需要实现。第一个查询处理所有标签,例如 TitleDate 和所有其他处于同一级别的标签。但是对于标签,我还需要需要第二次查询的子标签。

现在,如何创建一个嵌套的 while 循环将数据插入到 标签 中?问题是每个帖子都有几个标签(或只有一个),我不知道 php 脚本如何“进入”标签,插入第二个定义的标签元素查询,然后返回一级并继续执行第一个查询(此处为 Date)。

也许我不需要第二个 while 循环,我不知道!

【问题讨论】:

  • 您所要求的也称为将(关系)数据库数据序列化为 XML。这是一个非常大的话题,当您开始使用您选择的搜索引擎进行深入研究时,您可以从写得不好、过时的教程、为工作做好的库、数据库供应商关于其产品的文档甚至科学论文中找到很多.如果您展示到目前为止您已经尝试过的内容(即使代码无法按您希望的那样工作),您的问题可以得到很大的改善,因此您实际上在哪一点上卡住了更清楚。否则,你问的一个很大很大很大的话题...... .
  • 感谢您的回答!我现在添加了我的代码。我只是不确定如何继续:/
  • 也许不太确定要问什么。是什么阻碍你一遍又一遍地添加越来越多的循环?另外,您是否考虑过使用 XML 库来创建 XML?

标签: php xml loops while-loop


【解决方案1】:

除了较大的数据集可能带来的性能问题之外,嵌套 while 循环没有问题(因为如果我理解正确,请为每个 &lt;post&gt; 查询 &lt;tags&gt;)。

以某种方式嵌套循环(如果您使用每个标签的查询):

<?php
$result = $mysqli -> query("SELECT * FROM posts");

$xmlBody = '<?xml version="1.0" encoding="ISO-8859-1"?>';
$xmlBody .= "<XML>";

while($post = $result -> fetch_array()) {

   $xmlBody .= "<post>";

   $xmlBody .= "<title>" . $post['title'] . "</title>";

   // ....

   $xmlBody .= "<tags>";

   $tags_result = $mysqli -> query("
       SELECT * 
       FROM tags 
       WHERE id='" . $post['id'] . "'
   ");

   while($tag = $tags_result -> fetch_array()) {
     $xmlBody .= "<tag>" . $tag['tag'] . "</tag>";
   }

   $xmlBody .= "</tags>";

   // More Info (for example date)....

   $xmlBody .= "</post>";

}

这是完全盲目地写的,但我希望它很好地说明了你想要实现的目标。而不是这样做,您可能应该考虑使用预先编写的 XML API,例如SimpleXML。此外,也可以使用 JOIN 在单个 MySQL 查询中执行此操作。

@hakre 这就是我的想法,我只是为他所描述的内容举一个例子。如果可以的话,我会评论说一个例子会有所帮助(没有足够的声誉)。

更新:

我更新了上面的代码示例。很抱歉我在使用这种语法时犯了错误:$post -&gt; title。这仅适用于 $post 是一个对象时,它不是。

为了澄清,我在 MySQL 查询和获取中使用了面向对象的语法。参考this

【讨论】:

  • 谢谢!虽然您的解决方案看起来不错,但我在理解这里的基本语法时遇到了一些麻烦。我只是通过在 xml 正文中写出标签来学习它的。我现在感觉我的代码有点糟糕......
  • 不,你的代码一点也不差。我只是习惯于尽可能紧凑地编写所有内容。我看到您需要将所有 XML 都放在一个变量中,因此我将编辑上面的示例并使语法对您来说更具可读性。
  • 我犯了一个错误(请参阅上面的更新答案)。我基本上在做的是在while 循环内构造$xmlBody 变量。对于第二个 while 循环,(虽然我只能 猜测 这以某种方式代表您的数据库结构)我使用第一个查询中每个条目提供的 ID 来查询数据库中每个带有该 ID 的标签执行外部while 循环的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多