For Schleife - Funktioniert nicht?

Konstantin Gross

Erfahrenes Mitglied
Hallo,
ich arbeite gerade an einem Script, das Daten in eine Datenbank einträgt und und den Eintrag mit einem Feld namens "status" auf X setzt, das X bedeutet das der Eintrag neu ist das ist für das andere Script notwendig. Mein anderes Script speichert die Daten die ein X haben in eine TXT Datei, was auch wunderbar funktioniert, nun aber sollen diese Xe nach dem eintragen wieder aus dem Feld "status" entfernt werden, damit sie nicht nocheinmal gespeichert werden.

PHP:
<?
$dbconn = mysql_connect("localhost","user","pass");
$result = mysql_select_db("datenbank", $dbconn);

$abfrage = "SELECT id, datum, uhr, auftragsnr, posnr, materialnr, menge, persnr, status FROM hbMenge";
$ergebnis = mysql_query($abfrage);
while ($ar = mysql_fetch_array($ergebnis))  
{  
$fp = fopen ("datenbank.txt","a");
$id = $ar["id"];  
$datum = $ar["datum"];  
$uhr = $ar["uhr"];
$auftragsnr = $ar["auftragsnr"];
$posnr = $ar["posnr"];
$materialnr = $ar["materialnr"];
$menge = $ar["menge"];
$persnr = $ar["persnr"];
$status = $ar["status"];

echo "ID = $id, Datum = $datum, Uhr = $uhr, Auftragsnummer = $auftragsnr, Positionsnummer = $posnr, Materialnummer = $materialnr, Menge = $menge, Personalnummer = $persnr<br>";

if($status == "X")
{
$text = "$id - $datum - $uhr - $auftragsnr - $posnr - $materialnr - $menge - $persnr\n";
fputs($fp,$text);
}
else
{
echo "";
}

for($i = 0; $i<=count($ar); $i++) 
{
$aendern .= "UPDATE hbMenge Set status = '' WHERE id = $i";
$ergebnis2 = mysql_query($abfrage);
}

fclose($fp);
}
?>

Nun klappt aber das entfernen des Xes nicht. Was mache ich falsch? Hat jemand einen Vorschlag? Weil für mich sieht das 100%ig richtig aus.

Vielen Dank.
 
Hallo!

Erstmal würde ich dir empfehlen, das Script etwas effizienter zu gestalten!
Was machst du denn zum Beispiel, wenn du 100 Einträge in der Datenbank mit Xen hast?!
Dann muss die UPDATE-Abfrage 100 mal ausgeführt werden!
Das ist genauso wie mit dem fopen(), fput(), usw.
Das dauert doch ewig!
Und während der gesamten Zeit ist ein fopen() offen!
Das kostet doch unnötig ressourcen!

Dein Fehler war allerdings folgender:
Du hast bei der Query

PHP:
mysql_query($abfrage);

$abfrage als Parameter übergeben. Hättest aber $aendern nehmen müssen!

Ich hab' das Script mal so umgeschreiben, dass es funktioniert und auch WESENTLICH schneller laufen sollte (du siehst ja, was alles geändert wurde, das will ich hier nicht alles aufzählen :rolleyes: ):

PHP:
<? 
$dbconn = mysql_connect("localhost","user","pass"); 
$result = mysql_select_db("datenbank", $dbconn); 

$abfrage = "SELECT id, datum, uhr, auftragsnr, posnr, materialnr, menge, persnr, status FROM hbMenge WHERE status='X'"; 
$ergebnis = mysql_query($abfrage); 
if (mysql_fetch_lengths($ergebnis) > 0)
{
	$text = "";

	while ($ar = mysql_fetch_array($ergebnis))   
	{
		echo "ID = $ar[id], Datum = $ar[datum], Uhr = $ar[uhr], Auftragsnummer = $ar[auftragsnr], Positionsnummer = $ar[posnr], Materialnummer = $ar[materialnr], Menge = $ar[menge], Personalnummer = $ar[persnr]<br />";

		$text .= "$ar[id] - $ar[datum] - $ar[uhr] - $ar[auftragsnr] - $ar[posnr] - $ar[materialnr] - $ar[menge] - $ar[persnr]\n";
		}
	}

	$fp = fopen ("datenbank.txt","a");
	fputs($fp,$text);
	fclose($fp);
	$ergebnis2 = mysql_query("UPDATE hbMenge SET status='' WHERE status='x'");
}
?>

PS:

Du solltest dich auch noch mit einer passenden Fehlerbehandlung beschäftigen!
 
WOW Klasse Danke! Ich werde später es mal probieren aber was ich lese, gefällt mir :) Und das ist viel einfacher als mein Script :)

Danke!

Edit:
"Du solltest dich auch noch mit einer passenden Fehlerbehandlung beschäftigen!" Mhh was meinst du damit genau?
 
Zuletzt bearbeitet:
Frage:
$ergebnis2 = mysql_query("UPDATE hbMenge SET status='' WHERE status='X");

werden damit alle Xen weggemacht die in der Datenbank sind? Oder nur was gerade in dem Array ist? Weil was passiert wenn jemand genau zu dem Zeitpunkt einen neuen Eintrag einträgt? Dann wird das X ja gelöscht ohne das es in der TXT Datei gespeichert wurde. Weil ich will nur die Xen wegmachen die auch gerade in dem Array durchgelaufen sind. Als Schutz sozusagen, damit das nicht passiert was ich gerade beschrieben habe. Fragen über Fragen :rolleyes:

EDIT:
Ich habe das Script grad mal getestet, aber es wird nix ausgegeben oder gespeichert :(
 
Zuletzt bearbeitet:
1.

"Du solltest dich auch noch mit einer passenden Fehlerbehandlung beschäftigen!" Mhh was meinst du damit genau?

Na, was machst du zum Beispiel wenn die Textdatei, die Datenbankverbindung oder aber eine der Querys scheitern?
Das aktuelle Script ist in der Hinsicht ein wenig schutzlos!

2.

Genau das Problem würde auftreten!

Hier also das veränderte Script:

PHP:
<? 
$dbconn = mysql_connect("localhost","user","pass"); 
$result = mysql_select_db("datenbank", $dbconn); 

$abfrage = "SELECT id, datum, uhr, auftragsnr, posnr, materialnr, menge, persnr, status FROM hbMenge WHERE status='X'"; 
$ergebnis = mysql_query($abfrage); 
if (mysql_fetch_lengths($ergebnis) > 0) 
{ 
    $text = ""; $qid = ""; $f = true;

    while ($ar = mysql_fetch_array($ergebnis))    
    { 
        echo "ID = $ar[id], Datum = $ar[datum], Uhr = $ar[uhr], Auftragsnummer = $ar[auftragsnr], Positionsnummer = $ar[posnr], Materialnummer = $ar[materialnr], Menge = $ar[menge], Personalnummer = $ar[persnr]<br />"; 

        $text .= "$ar[id] - $ar[datum] - $ar[uhr] - $ar[auftragsnr] - $ar[posnr] - $ar[materialnr] - $ar[menge] - $ar[persnr]\n"; 
        
        $qid .= ($f ? "'$id'" : ",'$id'");
        if ($f) $f = false;
        } 
    } 

    $fp = fopen ("datenbank.txt","a"); 
    fputs($fp,$text); 
    fclose($fp); 
    $ergebnis2 = mysql_query("UPDATE hbMenge SET status='' WHERE id IN ($qid)"); 
}

Nun sollten nur die Datensätze gelöscht (oder besser gesagt gewegixt ;) ) werden, die auch wirklich in die Datei geschrieben wurden.
 
Zuletzt bearbeitet:
Original geschrieben von rootssw
Na, was machst du zum Beispiel wenn die Textdatei, die Datenbankverbindung oder aber eine der Querys scheitern? Das aktuelle Script ist in der Hinsicht ein wenig schutzlos!

Hallo wofür ist die Klammer am Ende?
if ($f) $f = false;
}

Und warum wird nix ausgegeben oder gespeichert?
 
Naja wenn ich das so einfüge das Script kommen keine Fehler aber es wird auch nix angezeigt, sprich einfach weißes Fenster und gespeichert wird auch nix :confused:
 
Tja, jetzt stehst du auf dem Schlauch!:p

Dein Pech! :eek: :mad:


















Das könnte man zumindest sagen! ;)
Genau das meinte ich nämlich mit Fehlerbehandlung!
Du bist doch jetzt völlig ratlos!

PHP:
<?php
$dbconn = mysql_connect("localhost","user","pass") OR die(mysql_error()); 
$result = mysql_select_db("datenbank", $dbconn);) OR die(mysql_error()); 


$abfrage = "SELECT id, datum, uhr, auftragsnr, posnr, materialnr, menge, persnr, status FROM hbMenge WHERE status='X'"; 
$ergebnis = mysql_query($abfrage) OR die(mysql_error()); 
if (mysql_fetch_lengths($ergebnis) > 0) 
{ 
    $text = ""; $qid = ""; $f = true; 

    while ($ar = mysql_fetch_array($ergebnis))     
    { 
        echo "ID = $ar[id], Datum = $ar[datum], Uhr = $ar[uhr], Auftragsnummer = $ar[auftragsnr], Positionsnummer = $ar[posnr], Materialnummer = $ar[materialnr], Menge = $ar[menge], Personalnummer = $ar[persnr]<br />"; 

        $text .= "$ar[id] - $ar[datum] - $ar[uhr] - $ar[auftragsnr] - $ar[posnr] - $ar[materialnr] - $ar[menge] - $ar[persnr]\n"; 
         
        $qid .= ($f ? "'$id'" : ",'$id'"); 
        if ($f) $f = false; 
        } 
    } 

    $fp = fopen ("datenbank.txt","a") OR die("Konnte die Textdatei nicht öffnen"); 
    fputs($fp,$text) OR die("Konnte die Werte nicht in die Textdatei schreiben"); 
    fclose($fp) OR die("Konnte die Textdatei nicht schliessen"); 
    mysql_query("UPDATE hbMenge SET status='' WHERE id IN ($qid)") OR die ("Update der Tabelle ist gescheitert");; 
} else echo "Keine Xe vorhanden!";
?>

So, jetzt hab' ich da mal eine primitive Fehlerbehandlung eingebaut.
Gibt das Script jetzt etwas aus?
 
Boah verdammt ;) Das habe ich vergessen einzufügen die Fehlerabfrage, zum mindest gibt er das als Fehler an:
Keine Xe vorhanden!

Das kann aber nicht sein da die Xe im status stehen.
 
Zurück