【问题标题】:Outputting XML from MySQL & PHP (PDO)从 MySQL 和 PHP (PDO) 输出 XML
【发布时间】:2014-05-22 03:02:56
【问题描述】:

我正在使用 PHP/PDO 查询我的 MySQL 表并将所有记录作为格式化的 XML 返回。

我 - 正在获得我的输出.. 但它并不完全符合我的预期,所以我在这里询问这是否正常?或者(更有可能)我做错了什么。

此 PHP 脚本将被另一个(现有)基于 Adob​​e Flash 的项目使用。 (它目前正在使用一个平面 .xml 文件来加载......我一直在努力升级这个项目的第一步(最终远离 Flash),所以它会提取它的数据/xml 提要来自数据库。

当我直接在浏览器中加载 .php 脚本时......我看到屏幕上打印了所有“值”(没有 XML 标记)。但是,如果我查看页面源代码,则会发现 XML 标记存在/存在。 (我正在使用 FireFox)..但是应用了语法突出显示(默认我猜 FireFox 对源代码有彩色突出显示?)..

无论如何.. 我提到它是因为我有一个红色标签,并且它的匹配(关闭)标签是正常颜色的?让我相信我发生了某种错误?

XML 源示例:

<?xml version="1.0" encoding="UTF-8"?>
<saberFonts>
<entry submissionDate="2013-02-18 00:00:00">
    <fontName>Episode I QGJ </fontName>
    <fontCreator>Novastar</fontCreator>
    <fontFormat>.wav</fontFormat>
    <optimized>Plecter</optimized>
    <fontPrice>6.50</fontPrice>
    <fontImage>wav_cf.png</fontImage>
    <fontURL><![CDATA[https://www.e-junkie.com/ecom/gb.php?c=cart&i=NS-EPIQGJ_PLECTER-.wav&cl=174914&ejc=2]]></fontURL>
    <description><![CDATA[An EPI QGJ font]]></description>
    <piracyVid></piracyVid>
    <demoLink height="315" width="420" title="">http://www.youtube.com/v/3IbzyyHo0o4?version=3&amp;hl=en_US&amp;rel=0</demoLink>
    </entry>

etc..etc..etc (more entry nodes, same structure)..

</saberFonts>

源中的第一个标签/节点名称是 RED,而结尾是正常的黑色/紫色??

问题1:这正常吗?看到屏幕上打印的值?没有任何 XML 标签/结构? (并且 XML 结构仅在源代码中?)

问题 2:突出“问题”的语法?为什么1个标签是红色的,另一个是正常的?我所有的 CDATA 值都是红色的。但是第一个/开始标签?

这是我用来查询和构建 XML“字符串”输出的代码。

<?php
session_start();

$host_name = 'localhost';
$db_name = 'test';
$user_name = 'root';
$password = '';

$table = 'fontentries';

try {
    $conn=new PDO("mysql:host=$host_name; dbname=$db_name", $user_name , $password);
    //$conn->exec("SET CHARACTER SET utf8");
} catch (PDOException $e) {
    echo 'Connection -not- made<br/>';
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

$getAll_query = "SELECT * FROM `fontentries` WHERE active != 0;";
$xml_statement = $conn->prepare($getAll_query);
$xml_statement->execute();

$xml_output = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
$xml_output .= "<saberFonts>\n"; 

foreach ($xml_statement->fetchAll(PDO::FETCH_ASSOC) as $row) {
    //get/set $row data
    $fontID=$row['id'];
    $date_entered=$row["date_entered"];
    $font_name=$row["font_name"];
    $font_maker=$row["font_maker"];
    $font_format = $row["font_format"];
    $optimized_for= $row["optimized_for"];  
    $font_price=$row["font_price"];
    $font_image = $row["font_image"];
    $font_url=$row["font_url"];
    $description=$row["description"];
    $youtube_id=$row["youtube_id"];
    $ip_address = $_SERVER["REMOTE_ADDR"];
    $active = $row["active"];
    $custom_config = $row['custom_config'];
    $led_txt = $row['led_txt']; 

    $xml_output .= "\t<entry submissionDate=\"".$date_entered."\">\n";
    $xml_output .= "\t\t<fontName>" . $font_name . "</fontName>\n";
    $xml_output .= "\t\t<fontCreator>" . $font_maker . "</fontCreator>\n";
    $xml_output .= "\t\t<fontFormat>" . $font_format . "</fontFormat>\n";
    $xml_output .= "\t\t<optimized>" . $optimized_for . "</optimized>\n";
    $xml_output .= "\t\t<fontPrice>" . $font_price . "</fontPrice>\n";
    $xml_output .= "\t\t<fontImage>" . $font_image . "</fontImage>\n";
    $xml_output .= "\t\t<fontURL><![CDATA[https://www.e-junkie.com/ecom/gb.php?c=cart&i=" . $font_url . "&cl=174914&ejc=2]]></fontURL>\n";
    $xml_output .= "\t\t<description><![CDATA[" . $description . "]]></description>\n";
    $xml_output .= "\t\t<piracyVid></piracyVid>\n";
    $xml_output .= "\t\t<demoLink height=\"315\" width=\"420\" title=\"\">http://www.youtube.com/v/" . $youtube_id . "?version=3&amp;hl=en_US&amp;rel=0</demoLink>\n";

    $xml_output .= "\t</entry>\n";  
}

$xml_output .= "</saberFonts>";  
echo $xml_output;

?>

此时,我不确定为什么会得到这些结果?想我会在这里发帖以从那些有更多经验的人那里获得一些帮助/答案。

谢谢!

【问题讨论】:

  • 我强烈建议您使用实际的 XML 库(如 DOM 或 SimpleXML)构建您的 XML 文档。
  • 谢谢!但是,如果我知道如何,.. 我不会发布。 ;) 不过,我很欣赏“评论”。

标签: php xml


【解决方案1】:

通过字符串连接手动构建 XML 文档只会导致困难。我建议你使用像 DOM 这样的 XML 库。

我会这样做。

$stmt = $conn->query('SELECT * FROM fontentries WHERE active <> 0');
$stmt->setFetchMode(PDO::FETCH_ASSOC);

$doc = new DOMDocument('1.0', 'UTF-8');
$fonts = $doc->createElement('sabreFonts');

foreach ($stmt as $row) {
    $entry = $doc->createElement('entry');
    $entry->setAttribute('submissionDate', $row['date_entered']);

    $entry->appendChild($doc->createElement('fontName', $row['font_name']));
    $entry->appendChild($doc->createElement('fontCreator', $row['font_maker']));

    // and so on

    // CDATA sections are slightly different
    $description = $doc->createElement('description');
    $description->appendChild($doc->createCDATASection($row['description']));
    $entry->appendChild($description);

    $fonts->appendChild($entry);
}

$doc->appendChild($fonts);

// Set the appropriate content-type header and output the XML
header('Content-type: application/xml');
echo $doc->saveXML();
exit;

【讨论】:

  • 感谢您的回复。我没有收到电子邮件通知(否则我会尽快回复)..从您之前的评论中,我开始搜索 simpleXML,..并找到了一个非常简单的修复程序,它应该很适合我已经建立的代码。我试过了,但我现在遇到了另一个错误(解析数据错误)......我相信这源于数据库中某些字段中的特殊字符。 (例如 & 和撇号......以及其他任何东西)我相信当我在 for() 循环中声明变量/记录数据时我需要“处理好这个”......但是我应该使用什么?
  • 我使用了:htmlspecialchars() 并且它通过了解析错误。这是我遵循的线程:stackoverflow.com/questions/14458603/… 但最后它让我在同一个地方,只是值(没有 XML 标记)显示在屏幕上。源代码确实显示了 XML 格式的数据。您的 DOM 示例很棒! (顺便说一句)非常容易理解/遵循(即使对我来说!)哈哈我将寻找一种简单的XML方法来(正确地)构建一个 XML 对象......如果我不喜欢或弄清楚它,我'将使用您的 DOM 示例!谢谢
  • @whispers 为什么您希望浏览器以不同的方式显示 XML 文档?您应该只关心您的客户端(闪存应用程序)如何使用数据。
  • @Phil- 我只记得看到“XML 提要”是 PHP 脚本,当我直接将它们加载到浏览器中时......子节点/元素..等)我只使用这种 sctring 方法创建了一个 XML 提要,我很想尝试它(阅读其他线程,我认为它会导致这种情况,并且是对我已经存在的代码的“快速修复”。就 Flash 而言.. 据我回忆,我相信它会按原样工作。我很长时间没有打开应用程序..(或有一段时间做过任何 Flash 开发)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 2012-07-09
  • 2017-12-18
  • 2014-08-11
  • 2015-09-01
  • 2015-09-02
  • 1970-01-01
相关资源
最近更新 更多