【问题标题】:Converting MySQL rows to XML with PHP使用 PHP 将 MySQL 行转换为 XML
【发布时间】:2014-03-10 21:18:30
【问题描述】:

我正在编写我的 php 脚本以从 mysql 数据库中输出信息。我想在我的 php 页面中将这些回显结果作为 xml 文件输出,因为我想让它看起来像这样:

<?xml version="1.0" encoding="UTF-8" ?>
<tv generator-info-name="www.mysite.com/xmltv">
<channel id="">
   <display-name></display-name>
   <programme channel="" start="" stop="">
      <title lang="en"></title>
      <sub-title lang="en"></sub-title>
      <desc lang="en"></desc>
      <category lang="en"></category>
   </programme>
</channel>

这是我的 PHP:

<?php

function db_connect()
{
  define('DB_HOST', 'localhost');
  define('DB_USER', 'myusername');
  define('DB_PASSWORD', 'mypasword');
  define('DB_DATABASE', 'mydbname');

  $errmsg_arr = array();
  $errflag = false;
  $link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);

  if(!$link) 
  {
    die('Failed to connect to server: ' . mysql_error());
  }

  $db = mysql_select_db(DB_DATABASE);
  if(!$db) 
  {
    die("Unable to select database");
  }
}
db_connect();


function clean($var)
  {
    return mysql_real_escape_string(strip_tags($var));
  } 
  $channels = clean($_GET['channels']);
  $id = clean($_GET['id']);

  if($errflag) 
  {
    $_SESSION['ERRMSG_ARR'] = $errmsg_arr;
    echo implode('<br />',$errmsg_arr);
  }
  else 
  {
    $insert = array();

    if(isset($_GET['channels'])) 
    {
      $insert[] = 'channels = \'' . clean($_GET['channels']) .'\'';
    }
    if(isset($_GET['id'])) 
    {
      $insert[] = 'id = \'' . clean($_GET['id']) . '\'';
    }


    if($channels && $id) 
    {
      $qrytable1="SELECT id, channels, links FROM tvguide WHERE channels='$channels' && id='$id'";
      $result1=mysql_query($qrytable1) or die('Error:<br />' . $qry . '<br />' . mysql_error());

      while ($row = mysql_fetch_array($result1))
      {
        zap2it($row);
      }
      mysql_close();
    }
    else if(!$channels && ! $id)
    {
      $qrytable1="SELECT id, channels, links, streams FROM tvguide";
      $result1=mysql_query($qrytable1) or die('Error:<br />' . $qry . '<br />' . mysql_error());
      echo '<?xml version=""1.0"" encoding="UTF-8" ?>';
      echo '<tv generator-info-name="www.mysite.com/xmltv">';
      echo '<channel id="">';
      echo '<display-name></display-name>';
      echo '<programme channel="" start="" stop="">';
      echo '<title lang="en"></title>';
      echo '<sub-title lang="en"></sub-title>';
      echo '<desc lang="en"></desc>';
      echo '<category lang="en"></category>';
      echo '</programme>';
      echo '</channel>';


      while ($row = mysql_fetch_array($result1)) 
      {
        echo "<p id='channels'>".$row["id"]. " " . $row["channels"]. "</p>";

        echo "<p id='links'>";
        echo "http://www.mysite.com/get-listing.php?channels=" . $row["channels"] . "&id=" . $row["id"] .'</p>';
      }
    }
  }
?>

这是我的 php 输出的样子:

<?xml version="1.0" encoding="UTF-8" ?><tv generator-info-name="www.mysite.com/xmltv"><channel id=""><display-name></display-name><programme channel="" start="" stop=""><title lang="en"></title><sub-title lang="en"></sub-title><desc lang="en"></desc><category lang="en"></category></programme></channel>

编辑:我遇到了回声问题。我无法回显数据库中的频道。

if(!$channels && ! $id) 
    {
      $qrytable1="SELECT id, channels, links, streams FROM tvguide";
      $result1=mysql_query($qrytable1) or die('Error:<br />' . $qry . '<br />' . mysql_error());




  while ($row = mysql_fetch_array($result1)) 
  {

  }
  mysql_close();
}

这是我得到的错误:第 12 行第 11 列的错误:XML 声明只允许在文档的开头

当我在while语句下使用这个时会报错:

while ($row = mysql_fetch_array($result1)) 
      {
        echo '<?xml version="1.0" encoding="UTF-8" ?>
<tv generator-info-name="www.mysite.com/xmltv">
<channel id="">
   <display-name></display-name>
   <programme channel="" start="" stop="">
      <title lang="en"></title>
      <sub-title lang="en"></sub-title>
      <desc lang="en"></desc>
      <category lang="en"></category>
   </programme>
</channel>
</tv>';
      }

我的 php 的输出显示为空白页。你如何使用代码让我在我的 php 中打印这些 xml 输出?

【问题讨论】:

  • 标题具有误导性
  • 在回显之前尝试添加:header('Content-type: application/xml');
  • @NateC-K 感谢您的建议,我应该在哪一行添加header('Content-type: application/xml');
  • 可能就在第一个 echo 语句之前。
  • 我不知道zap2it($row); 是否也产生XML。如果是这样,您需要更早地添加内容类型标头,以便在输出之前发送它。

标签: php mysql xml


【解决方案1】:

如果 channel = 0 和 id = 0 你的输出是正确的。它可能没有标签,但它符合您的逻辑。

根据浏览器的不同,XML 可能会显示一个空白页面……请务必查看代码!

您需要重新考虑您的逻辑,尽管 $channel && $id 然后执行 !$channel && !id 非常奇怪。

【讨论】:

    【解决方案2】:

    看起来您已经成功地生成了 XML。您的问题是它显示为空白页。这是意料之中的,因为您的网络浏览器会将 XML 解释为一堆 HTML 标签,而标签不会显示。

    您可能想要做的是将内容类型设置为 XML,以便 Web 浏览器知道它是 XML 而不是 HTML。您可以通过在发送任何其他输出之前添加标题来做到这一点(即在任何 echo 语句之前):

    header('Content-type: application/xml');
    

    这是必要的,因为如果您没有明确指定内容类型,服务器将自动发送一个内容类型标头,告诉浏览器内容是 HTML。

    您可以使用浏览器的调试控制台(在大多数现代浏览器中按 F12 将其打开)来检查您的脚本发送的 HTTP 标头并验证它是否声明了正确的内容类型。


    另一种选择是将 XML 格式化为 HTML。这可能不是真正可取的,因为 XML 的目的是由其他客户端处理并将其转换为 HTML 使其无用。但是,如果您真的想这样做,可以通过将所有 XML 放在一个字符串中,然后调用 htmlspecialchars 函数将其格式化为 HTML 来完成。 (这会将&lt;&gt; 转换为HTML 实体,从而使它们显示在您的浏览器中。)

    【讨论】:

    • 感谢您,但该页面包含以下错误:“第 1 行第 16 列的错误:预期版本的错误声明以下是页面的呈现直到第一个错误。”你知道我为什么会出错吗?
    • 这可能意味着您正在编写无效的 XML。 XML 必须遵循严格的规则,如果不这样做,它就无法解析。我建议您使用浏览器的调试器,或者像curl 这样的工具来检查您的脚本的结果,并准确地确认正在发送的 XML。
    • 您能否发布一个我应该使用的示例源,以便我修改我的脚本以正确设置它?
    • 我想,但我不确定问题是什么。我没有看到任何会导致您提到的错误消息的东西。但是,我确实注意到您生成的内容不正确,因为它最后需要 &lt;/tv&gt; 才能关闭 &lt;tv&gt; 部分。
    • 糟糕,我确实看到了您的错误原因。您正在打印:version=""1.0"" 引号加倍。你只想要这个:version="1.0"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2011-05-18
    • 2013-06-10
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多