从MySQL输出XML& PHP(PDO)

时间:2014-05-22 03:02:56

标签: php xml

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

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

此PHP脚本将由另一个(现有的)基于Adobe Flash的项目使用。 (它目前正在使用平面.xml文件加载....我一直在努力升级这个项目的第一步(最终离开Flash)所以它拉动它的data / xml feed来自数据库。

当我直接在浏览器中加载.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个标签是RED而另一个是正常的?我的所有CDATA值都是RED ..但是第一个/开始标记?

这是我用来查询和构建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;

?>

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

谢谢!

1 个答案:

答案 0 :(得分: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;