PHP-Abfrage endet mit Endlosschleife
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
code
datei
datum
endlosschleife
entschuldigen
file
fortlaufende nummer
ftp
gespeichert code
kontrollieren
maximum
numerierung
ordner
problem
schleife
server
string
test
zahl
zeitangabe
-
Hi Leute,
im Moment geht es einfach nur darum, das ich die Textdateien, die ich auf den FTP-Server hochladen möchte, in nummerierter Reihenfolge erstellen will. (test1.txt, test2.txt, test3.txt, usw....).
Ich verwende folgenden Code:
<?php $ftp_server = "ftp.lima-city.de"; $ftp_user_name = "**********"; $ftp_user_pass = "**********"; $ordnerverzeichnis = "./test/"; $dateisyntax = "test"; $dateityp = ".txt"; $conn_id = ftp_connect($ftp_server); $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); ftp_pasv($conn_id, true); $contents = ftp_nlist($conn_id, $ordnerverzeichnis); $i = 0; foreach($contents as $th) { $i = $i + 1; } $zahl = 1; while($zahl <= $i) { foreach($contents as $th) { if($th == $dateisyntax.$zahlstring.$dateityp) { $zahl = $zahl + 1; $zahlstring = (string) $zahl; } } } $file = $_FILES['lokale_datei']['tmp_name']; $remote_file = $ordnerverzeichnis.$dateisyntax.$zahlstring.$dateityp; if (ftp_put($conn_id, $remote_file, $file, FTP_ASCII)) { echo "successfully uploaded"; } else { echo "There was a problem while uploading"; } ftp_close($conn_id); ?>
Nachdem die Verbindung hergestellt ist, wird also erstmal eine Liste aller Dateien abgerufen, die sich im Verzeichnis befinden und in der Variable "$contents" gespeichert.
$contents = ftp_nlist($conn_id, $ordnerverzeichnis);
Danach erstelle ich den integer "$i" und gebe ihm die "0" als Wert, woraufhin eine foreach-Schleife den Wert der Variable bei jeder gefundenen Datei um "1" erhöht....sie zählt also die Dateien am Server.
foreach($contents as $th) { $i = $i + 1; }
Jetzt möchte ich mithilfe einer while-Schleife für jede Datei den Namen prüfen und kontrollieren, ob diese Nummerierung (z. B. "test3.txt") bereits existiert.
Ist dies der Fall, wird der Name um einen Wert erhöht. (z. B. "test4.txt")
Ich erstelle also den Integer "$zahl" mit dem Wert "1", da die erste Datei mit der "1" im Namen benannt werden soll und führe dann die Schleife aus.
$zahl = 1; while($zahl <= $i) { foreach($contents as $th) { if($th == $dateisyntax.$zahlstring.$dateityp) { $zahl = $zahl + 1; $zahlstring = (string) $zahl; } } }
Wenn die Abfrage durchgelaufen und "$i" zu Anfang "0" war (also sich vorher keine Dateien am Server befanden), benennt er die Datei richtig mit "test1.txt" und uploadet sie.
Befindet sich aber die Datei "test1.txt" bereits am Server, wird die while-Schleife ausgeführt un endet in einer Endlosschleife....maximum execution timeout.
Die Schleife müsste doch eigentlich verlassen werden, sobald die Datei gefunden und der Wert für "$zahl" um 1 erhöht wurde, also die Datei nun "test2.txt" heißen müsste.
Weis jemand, was ich falsch mache?
Danke schonmal für die Hilfe.
Beitrag zuletzt geändert: 13.3.2011 20:12:21 von adelwoehrer -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ich muss gestehen, dass ich weder aus deinem Beitrag, noch aus deinem Code richtig schlau werde. Der Code ist absolut wirr und auf den ersten Blick ohne richtigen Sinn geschrieben. Ein Beispiel:
$i = 0; foreach($contents as $th) { $i = $i + 1; }
Was passiert an dieser Stelle mit $th? Wie wäre es alternativ einfach mit
$count = count($contents);
Und anstatt
$i = $i + ;
Solltest du wenn überhaupt, einfach
$i++;
benutzen.
while($zahl <= $i)
Wie wärs alternativ mit
for ($i = 1; $i <= $zahl; $i++)
Nichts desto trotz habe ich keinen blassen Schimmer, was das am Ende werden soll. Woher genau soll das Script wissen, wie viele Dateien er hochladen soll?
Du benutzt
$file = $_FILES['lokale_datei']['tmp_name'];
was darauf schließen lässt, dass die Datei von einem Upload-Formular kommt?
Was ich hierdraus schließe ist folgendes:
Du hast ein Uploadformular. Dort hochgeladene Dateien sollen auf deinem FTP im Ordner test gespeichert werden, wobei jede hochgeladene Datei eine fortlaufende Nummer erhält und im Textformat gespeichert werden soll. Verstehe ich das richtig?
Falls ja...
<?php $ftp_server = "ftp.lima-city.de"; $ftp_user_name = "**********"; $ftp_user_pass = "**********"; $ordnerverzeichnis = "./test/"; $dateisyntax = "test"; $dateityp = ".txt"; $conn_id = ftp_connect($ftp_server); $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); ftp_pasv($conn_id, true); $contents = ftp_nlist($conn_id, $ordnerverzeichnis); $count = count($contents); $file = $_FILES['lokale_datei']['tmp_name']; $next = $count+1; $remote_file = $ordnerverzeichnis.$dateisyntax.$next.$dateityp; if (ftp_put($conn_id, $remote_file, $file, FTP_ASCII)) { echo "successfully uploaded"; } else { echo "There was a problem while uploading"; } ftp_close($conn_id); ?>
-
aber die zeitschleife könntest du mit $forbidden einseitig beenden in dem du $set_timeout setzt in einer zeitangabe von 5 sec. das heißt das die schleife nicht länger als 5 sec dauern darf. mfg
-
Ich glaube, was nske meint ist
ftp_set_option($conn_id, FTP_TIMEOUT_SEC, 5);
bzw.
$conn_id = ftp_connect($ftp_server, 21, 5);
-
Was ich hierdraus schließe ist folgendes:
Du hast ein Uploadformular. Dort hochgeladene Dateien sollen auf deinem FTP im Ordner test gespeichert werden, wobei jede hochgeladene Datei eine fortlaufende Nummer erhält und im Textformat gespeichert werden soll. Verstehe ich das richtig?
Japp, ich hätte vielleicht auch erwähnen müssen, woher die Daten kommen, tschuldigung.
Auch den Code selbst, bitte ich zu entschuldigen, ich weis, dass ich da ein totales Chaos hab. =)
Hab den Code abgeändert und er funktioniert wunderbar, vielen Dank.
Hier kann geclosed werden. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage