1

我有一个脚本,它可以获取由 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 行时都以不同的顺序排列。谢谢你的帮助。

4

3 回答 3

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']);
    ...
}
于 2012-10-12T14:27:43.767 回答
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只接受像!这样的方法的 utf-8 值 这意味着您需要绝对确定SimpleXMLsetAttribute
    1. 您放入数据库的字符串是 utf-8。
    2. php和数据库之间的连接是utf-8。(使用SET NAMES utf8charset参数到带有 PDO 的 DSN——你应该使用它来代替mysql_*
    3. 您从数据库中提取的字符串是 utf-8,或者至少在使用前转换为 utf-8。
于 2012-10-12T15:25:42.510 回答
-1

你可以加

ORDER BY rand() 

到您的 SQL 查询

于 2012-10-12T14:27:48.320 回答