mmofacts.com

XMLExport von SQL Tabellen

gepostet vor 17 Jahre von raufaser
Hi Leute,
ich hab gestern mal einen kleinen XML Export bestimmter Daten für die Community von meinem Spiel angeleiert.
Die kleine Hilfsfunktion möchte ich euch nicht vorenthalten... vielleicht kann's ja mal jemand brauchen.
Quick n dirty, aber erfüllt seinen Zweck...

/*
* XML Writer
*/
function write_xml( $db, $table, $type, $entry, $exclude_keys = array(), $version = "1.0" )
{
$xml = "\n";
$xml .= "<$type version=\"$version\">\n";
$dbresult = $db -> db_query( "SELECT * FROM $table WHERE 1;" );
while( $item = mysql_fetch_object( $dbresult ) )
{
$item = (array)$item;
$xml .= "<$entry>\n";
foreach( $item AS $key => $val )
{
if( !in_array( $key, $exclude_keys ) )
$xml .= "<$key>" . str_replace( "&", "&", htmlentities( $val ) ) . "\n";
}
$xml .= "\n";
}
$xml .= "\n";
file_put_contents( $table . ".xml", $xml );
}
write_xml( $db, "item", "itemlist", "item" );
write_xml( $db, "pet", "petlist", "pet" );
write_xml( $db, "recipe", "recipelist", "recipe" );
write_xml( $db, "knowledge", "knowledgelist", "knowledge" );
write_xml( $db, "spell", "spelllist", "spell" );
write_xml( $db, "player", "playerlist", "player", array( "x", "y", "face", "map_id", "dungeon_id", "pass", "email", "online", "nextstep", "userlevel", "learnpoints", "status", "health", "mana", "screams", "merch_player_uid", "extended_status", "use_sound", "friend_username", "use_groups" ) );
write_xml( $db, "guild", "guildlist", "guild", array( "motd" ) );
write_xml( $db, "knowledge", "knowledgelist", "knowledge" );
write_xml( $db, "fractions", "fractionlist", "fraction", array( "races", "show_at_register" ) );
?>
(Datenbankabfragen müssen natürlich angepasst werden, und: Ja das fetch_object ist Absicht weil fetch_array integer keys UND sprechende keys zurückliefert...)
Gruß,
Marc
gepostet vor 17 Jahre von Nightflyer

Ja das fetch_object ist Absicht weil fetch_array integer keys UND sprechende keys zurückliefert

fetch_assoc täte es aber auch...
gepostet vor 17 Jahre von knalli
Sowas ähnliches hab ich letzte Woche auch gebaut.. aber um die Struktur (Fremdschlüssel nach Namen, da meist MyISAM Tabellen) der Datenbank zu analysieren.
Da ich mal mysqli nutzen wollte (was ich aber unter der Tatsache, dass das ja eh wieder wegfallen soll, sonst nie einsetze..), liegt dem mal ausnahmweise mysqli zugrunde.. prinzipiell ist das aber ja piepegal.
Ich nutze SHOW FIELDS, denn das gibt einem zusätzlich noch strukturelle Daten - wenn Bedarf besteht, pack ich den Kram auch mal zusammen..

...
private function getTablenames() {
$rows = array();
if ($resultSet = $this->connection->query("SHOW TABLES;")) {
while ($row = $resultSet->fetch_row()) {
$rows[] = $row[0];
}
$resultSet->close();
}
$this->tableNames = $rows;
}

private function loadTableData($tableName = '') {
if($tableName == '') {
return null;
}

$rows = array();
if ($resultSet = $this->connection->query(sprintf("SHOW FIELDS FROM %s;", $tableName))) {
while ($row = $resultSet->fetch_assoc()) {
$rows[] = $row;
}
$resultSet->close();
}

$this->tableData[$tableName] = $rows;
}
Ist sehr flexibel, da man nur die Verbindung angeben muss, Tabellennamen zieht er sich automatisch.
gepostet vor 17 Jahre von Drezil
Ich würd mal sagen:
Ab damit in die snippet-sammlung (falls sich noch wer dunkel dran erinnern kann.. :p)
gepostet vor 17 Jahre von raufaser
Original von Nightflyer

Ja das fetch_object ist Absicht weil fetch_array integer keys UND sprechende keys zurückliefert

fetch_assoc täte es aber auch...
Jetzt wo du's sagst. Ich stimme dir Recht.
Ich schau mal gerade wo das mit den Snippets nochmal war... und wenn ich's finde poste ich mal das Script dort rein.
EDIT:
Ach und falls mal jemand ein Script braucht, dass komplette Datenbank von MySQL 4 auf 4.? oder 5 exportiert (halt da, wo sie das mit dem TIMESTAMP Feld geändert habe), der kann sich melden. Hab für die Arbeit ein Exporter geschrieben, der die TIMESTAMPs beibehält und als Trigger anlegt beim Export...
Gruß,
Marc
gepostet vor 17 Jahre von KoMtuR
Original von raufaser
(Datenbankabfragen müssen natürlich angepasst werden, und: Ja das fetch_object ist Absicht weil fetch_array integer keys UND sprechende keys zurückliefert...)

Dafür gibts bei mysql_fetch_array den 2. optionalen Parameter.
mysql_fetch_array($result, MYSQL_NUM) liefert nur numerische Indizes zurück und mysql_fetch_array($result, MYSQL_ASSOC) ein assoziatives Array. Standardeinstellung ist MYSQL_BOTH, wo der Name schon aussagt, was dies macht
gepostet vor 17 Jahre von raufaser
Oder eben gleich mysql_fetch_assoc wie oben schon erwähnt. ;-)
Hab's nun auch mal in das Script Wiki eingetragen...
Gruß,
Marc

Auf diese Diskussion antworten