while schleife in Variable speichern

Andre267

Erfahrenes Mitglied
Schönen guten Tag,

ich versuche gerade eine while schleife mit etwas xml in eine Variable zu packen und dann via fopen in eine xml Datei zu schreiben.
Das sieht bei mir gerade leider so aus:

PHP:
<?php
include("mysql.class.php");
$sql = new MySql("localhost","test","abcd","spieler");
$res = $sql->query("SELECT * FROM  `players` ORDER BY  `players`.`bankacc` DESC LIMIT 10");

$somecontent = '
<?xml version="1.0"?>
<rankingMenu>'
while($row = $sql->array_result($res)) {  '
    <playinfo>
        <player>
            'echo $row["name"]'
        </player>
        <money>
            'echo $row["bankacc"]'
        </money>
    </playinfo>
} 
</rankingMenu>
';
$sql->free_result();
$sql->close_connect(); 


$filename = 'ranking.xml';

if (is_writable($filename)) {

	if (!$handle = fopen($filename, "r+")) {
		
		print "Kann die Datei $filename nicht öffnen";
		exit;
		
	}
	
	if (!fwrite($handle, $somecontent)) {
		
		print "Kann in die Datei $filename nicht schreiben";
		exit;
		
	}
	
	print "Fertig, in Datei $filename wurde $somecontent geschrieben";
	fclose($handle);
	
} else {
	
	print "Die Datei $filename ist nicht schreibbar";
	
}

?>

Ich komme gerade leider überhaupt nicht weiter...

Weiß jemand wie ich das machen könnte und kann es mir erklären? :)
 
Du machst da ein riesiges Chaos von Strings und Code
Du kannst nicht einfach innerhalb eines Strings eine Schleife einführen.

Etwa so
PHP:
<?php
$somecontent = '
<?xml version="1.0"?>
<rankingMenu>';		//; hinzugefügt
while($row = $sql->array_result($res)) {  
	//$somecontent .= hinzufügen
	//Zudem von ' auf " wechseln, damit der Inhalt geparst werden kann
	//Die Variablen nicht mit echo ausgeben, sondern in den Text einfügen
	//Vor Den Text mit " und ; abschliessen
	$somecontent .="
    <playinfo>
        <player>
            {$row["name"]}
        </player>
        <money>
            {$row["bankacc"]}
        </money>
    </playinfo>";
} 
//$somecontent .= hinzufügen
$somecontent .= '
</rankingMenu>
'; 
?>

Aber strukturell kann man sowas auch sauberer lösen. Ein Beispiel zum Trennen von Format und Programm
PHP:
<?php
//XML-Pattern definieren
$xmlPattern = <<<TXT
<?xml version="1.0"?>
<rankingMenu>
	%s
</rankingMenu>
TXT;
//sich wiederholender playinfo-Pattern definieren
$playinfoPatter = <<<TXT
    <playinfo>
        <player>
            %s
        </player>
        <money>
            %s
        </money>
    </playinfo>
TXT;

$playinfos = array();
while($row = $sql->array_result($res)) {  
	$playinfos[] = sprintf($playinfoPatter, $row['name'], $row['bankacc'])
}
$content = sprintf($xmlPattern, implode($playinfos));
?>
 
Und hier ein Beispiel komplett ohne String-Manipulation, statt dessen mit dem Mittel der Wahl - DOMDocument. Denn da kommt auf jeden Fall auch noch valides XML raus:

PHP:
<?php
// Der Einfachheit halber die Player-Daten als Array, kann auch durch SQL-Abfrage gelöst werden
$players = array();
$players[] = array('name' => 'saftmeister', 'bankacc' => '1234');
$players[] = array('name' => 'Andre267', 'bankacc' => '5678');
$players[] = array('name' => 'yaslaw', 'bankacc' => '9012');

// XML-Document erzeugen
$dom = new DOMDocument('1.0', 'utf-8');

// Root-Node definieren
$root = $dom->appendChild( $dom->createElement('rankingMenu') );

// Über die Player (aus dem SQL-Ergebnis) loopen
foreach($players as $player)
{
  // Player-Info-Node hinzufügen
  $playInfo = $root->appendChild( $dom->createElement('playinfo') );
  // An die Player-Info-Node die Unter-Elemente name und money anhängen
  $playInfo->appendChild( $dom->createElement('name', $player['name']));
  $playInfo->appendChild( $dom->createElement('money', $player['bankacc']));
}

// Pretty-Print
$dom->formatOutput = true;
// Ausgeben
echo $dom->saveXML();
 
Zurück