我有一个脚本抓取我生成的php数据库的xml,我想在php脚本回显xml之前对行进行随机播放,这样每次访问数据库xml文件时,我都会收到数据库不同的顺序。
这是我输出xml的php脚本的一部分:
$dom = new DOMDocument("1.0");
$node = $dom->createElement("database");
$parnode = $dom->appendChild($node);
$query = "SELECT * FROM database WHERE 1";
$result = mysql_query($query);
header("Content-type: text/xml");
while ($row = @mysql_fetch_assoc($result)){
// ADD TO XML DOCUMENT NODE
$node = dom->createElement("data");
$newnode = $parnode->appendChild($node);
$newnode->setAttribute("id", $row['id']);
$newnode->setAttribute("name", $row['name']);
$newnode->setAttribute("date", $row['date']);
$newnode->setAttribute("latitude", $row['latitude']);
$newnode->setattribute("longitude", $row['longitude']);
}
这是我想在可能的情况下随机化xml输出的地方。这似乎是最合乎逻辑的地方,但如果有一个更好的地方,那对我来说没问题。
echo $dom->saveXML();
以下是我的xml示例:
<database>
<data id="1" name="blah" date="2012-10-10" latitude="0" longitude="0"/>
<data id="3" name="blah" date="2012-10-10" latitude="0" longitude="0"/>
<data id="4" name="blah" date="2012-10-10" latitude="0" longitude="0"/>
</database>
简单地说,我希望每次访问时xml行的顺序都不同。谢谢你的帮助。
答案 0 :(得分:1)
解决此问题的一种方法是使用临时数组来存储从DB获取的行,然后将此数组洗牌,然后遍历它:
$records = array();
while ($row = @mysql_fetch_assoc($result)){
$records[] = $row;
}
shuffle($records);
foreach ($records as $row) {
$node = dom->createElement("data");
$newnode = $parnode->appendChild($node);
$newnode->setAttribute("id", $row['id']);
...
}
另一种方法是原样使用原始数组,而是随机化插入过程:
$prevnode = null;
while ($row = @mysql_fetch_assoc($result)){
$node = dom->createElement("data");
if ($prevnode && rand(0, 1) === 0) {
$newnode = $prevnode->insertBefore($node);
} else {
$newnode = $parnode->appendChild($node);
}
$prevnode = $newnode;
$newnode->setAttribute("id", $row['id']);
...
}
答案 1 :(得分:0)
如果您的结果集不是很大并且您的数据库支持它,您可以让数据库随机为您调整结果。例如,MySQL可以这样做:
SELECT * FROM database ORDER BY rand();
您的数据库可能有所不同。
您还可以将XML生成与结果集合分开。随机播放中间阵列:
function get_database_results($dbconn=null) {
$rows = false;
$query = 'SELECT * FROM database';
$res = mysql_query($query, $dbconn);
if ($res) {
$rows = array();
while ($row = mysql_fetch_assoc($res)) {
$rows[] = $row;
}
}
return $rows;
}
function array_to_sxe($rows) {
$sxe = simplexml_load_string('<database></database>');
foreach ($rows as $row) {
$data = $sxe->addChild('data');
foreach ($row as $key => $value) {
$data->addAttribute($key, $value);
}
}
return $sxe;
}
$rows = get_database_results();
shuffle($rows);
$sxe = array_to_sxe($rows);
header('Content-Type: application/xml'); // NOT text/xml!
echo $sxe->asXML();
我现在会咆哮编码。
你必须对你的编码更加小心!实际上,您可以非常轻松地生成格式错误的XML。
text/xml
表示xml在7位ascii中。你的意思是不太可能。application/xml
表示xml是utf-8。这是DOMDocument
和SimpleXML
默认输出的内容,仅接受setAttribute
等方法的utf-8值!这意味着您需要绝对确定:
SET NAMES utf8
或charset
参数添加到带有PDO的DSN - 您应该使用的代替mysql_*
)答案 2 :(得分:-1)
您可以添加
ORDER BY rand()
到您的SQL查询