Was ist in meiner Abfrage falsch?

z-coupe

Erfahrenes Mitglied
Meine PHP- Kenntnisse sind nicht die besten. Kann sich jemand den Code ansehen und sagen was da falsch ist? Ich versuche Daten aus der Datenbank zu lesen und in ein XML file zu schreiben. Das Problem ist, dass der gar nicht in die While- Schleife läuft.
Habe der Übersicht halber restlichen Code entfernt und nur den relevanten gelassen.
Das Select- Statement liefert mir jedenfalls ein Ergebnis wenn ich es gegen die DB ausführe und die User- Id ist gefüllt.

PHP:
$datei1 = fopen("/TestDir/dir/test.xml","w");

$userid = 0;

foreach ($this->submitdata as $data)
    switch ($data[_FF_DATA_NAME]) {
        case 'userid'  : $userid   = $data[_FF_DATA_VALUE]; break;
        default        : break;
    } // switch

  echo fwrite($datei1, 'userid');
  echo fwrite($datei1, $userid );



mkdir("/TestDir/dir");
//move_uploaded_file($name1,"/TestDir/dir/$name1");


$db_server 		= 'localhost';
$db_name 		= 'xyz';
$db_user 		= 'xyz';
$db_passwort 	= 'xyz';

$db = @mysql_connect($db_server, $db_user, $db_passwort);

$sql = 'SELECT file
              FROM Bilder
             WHERE status = "1"
              and userid = $userid
             ORDER BY id';

$result = mysql_db_query('xyz', $sql);

$counter = 0;

  echo fwrite($datei1, 'letzter Eintrag vor der Loop');

while($row = mysql_fetch_row($result)){
  echo fwrite($datei1, 'bin jetzt in der loop');
}


  echo fwrite($datei1, 'und schon vorbaei');
fclose($datei1);

Die beiden Einträge ausserhalb der Loop trägt er in die Datei ein.
 
PHP:
$sql = 'SELECT file 
              FROM Bilder 
             WHERE status = "1" 
              and userid = $userid 
             ORDER BY id';
So kannst du das nicht machen, weil die Variable $userid in den Singlequotes als String behandelt wird. Außerdem fehlen ihr die Anführungszeichen und MySQL macht manchmal auch mucken bei Querys mit Zeilenumbrüchen drin. Richtig heißt es daher:
PHP:
$sql = 'SELECT file FROM Bilder WHERE status="1" and userid="'.$userid.'" ORDER BY id';

Ob noch mehr fehler in dienem Script sind, habe ich nicht geschaut.
 
PHP:
$datei1 = fopen("/TestDir/dir/test.xml","w");

$userid = 0;

foreach ($this->submitdata as $data) // muss hier nicht eine " { " hin?
    switch ($data[_FF_DATA_NAME]) {
        case 'userid'  : $userid   = $data[_FF_DATA_VALUE]; break;
        default        : break;
    } // switch

  echo fwrite($datei1, 'userid');
  echo fwrite($datei1, $userid );



mkdir("/TestDir/dir");
//move_uploaded_file($name1,"/TestDir/dir/$name1");


$db_server 		= 'localhost';
$db_name 		= 'xyz';
$db_user 		= 'xyz';
$db_passwort 	= 'xyz';

$db = @mysql_connect($db_server, $db_user, $db_passwort);

$sql = "SELECT file FROM Bilder WHERE status='1' and userid='".$userid."' ORDER BY id";  //So schreib ich den Querry immer

$result = mysql_db_query('xyz', $sql);

$counter = 0;

  echo fwrite($datei1, 'letzter Eintrag vor der Loop');

while($row = mysql_fetch_row($result)){  // und hier doch: while($row = mysql_fetch_assoc($result)){
  echo fwrite($datei1, 'bin jetzt in der loop');
}

// und hier müsste doch auch noch eine " } " hin, oder?


  echo fwrite($datei1, 'und schon vorbaei');
fclose($datei1);
 
Von der Klammerung her ist alles richtig. For- und Foreach-Schleifen die nur eine Schleifenanweisung haben brauchen keine Klammern, weil in dem fall klar ist, dass die nächste Anweisung zur Schleife gehört und die folgenden nicht mehr.
 
Habe jetzt doch noch eine Frage.

Ich brauche jetzt noch eine zweite While- Loop innerhalb der ersten Loop aufgerufen werden soll. Ziel des ganzen ist: Ich möchte für jeden Eintrag in der DB ein eigenes XML- File erstellen. Wie das XML- FIle aussehen soll ist ebenfalls in der DB abgelegt.

So hier noch mal ein Codeschnipsel
PHP:
while($rowBilder = mysql_fetch_row($resultBilder)){
  $name1 = $rowBilder[0];
  echo fwrite($datei1, 'name'.chr(13));
  echo fwrite($datei1, $name1.chr(13));

    $dateiname 	= "/TestDir/dir/photo".$counter.".xml";
    $counter 	= $counter +1;
    $datei 	= fopen($dateiname,"w");
	// innere Loop für XML- Einträge
    while($rowFiles = mysql_fetch_row($resultFiles)){
      echo fwrite($datei1, $counter);
	    $zeile =$rowFiles[0] ;
	    $zeile = str_replace('@DATEINAME', $name1, $zeile);
	    echo fwrite($datei,$zeile.chr(13));
	}
	fclose($datei);
}

es Funktioniert soweit auch ganz gut, allerdings nur für den ersten Datensatz. Schon beim zweiten DS läuft er nicht mehr die die inner Loop. Ich vermute mal ganz stark, dass es daran liegt, dass der Cursor berits auf dem letzten Satz positioniert ist.
Wenn dem so ist, wie kriege ich den Cursor wieder auf den ersten Datensatz positioniert?

Hoffe das mein Problem verständlich geschildert wurde.
 
Habe es jetzt dadurch gelöst, das ich unmittelbar vor der Schleife jedes mal
PHP:
$resultFiles= mysql_db_query('xyz', $sql)
aufrufe.

Führt der dann jedes mal den Select neu aus? Kann ich mir das Ergebnis irgendwie merken, ohne den Select jedes mal neu auszuführen?
 
Zurück