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

この問題を回避する 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']);
    ...
}

もう 1 つの方法は、元の配列をそのまま使用しますが、代わりに挿入プロセスをランダム化します。

$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();

ここで、 encodingsについて暴言を吐きます。

エンコーディングにはもっと注意する必要があります! そのままでは、不正な XML を非常に簡単に生成できます。

  • text/xmlxml が 7 ビット ascii であることを意味します。それはあなたが意図したものではありそうにありません。
  • application/xmlxml が utf-8 であることを意味します。これはデフォルトで何DOMDocumentを出力し、のようなメソッドでは utf-8 値のみを受け入れます! これは、次のことを完全に確認する必要があることを意味します。 SimpleXMLsetAttribute
    1. データベースに入れる文字列が utf-8 であること。
    2. PHPとデータベース間の接続がutf-8であること。( PDO を使用して DSN にSET NAMES utf8orcharsetパラメーターを使用する - の代わりに使用する必要がありますmysql_*)
    3. データベースから引き出す文字列が utf-8 であるか、少なくとも使用前に utf-8 に変換されていること。
于 2012-10-12T15:25:42.510 に答える
-1

あなたは付け加えられます

ORDER BY rand() 

あなたのSQLクエリに

于 2012-10-12T14:27:48.320 に答える