我使用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&hl=en_US&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&hl=en_US&rel=0</demoLink>\n";
$xml_output .= "\t</entry>\n";
}
$xml_output .= "</saberFonts>";
echo $xml_output;
?>
此时,我不确定为什么我会得到这些结果?我想在这里发帖,以便从那些有更多经验的人那里得到一些帮助/答案。
谢谢!
答案 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;