Selbstdefinierte Funktion wird nicht erkannt!
horachorus
- php
0 ChrisB0 Peter Nack0 Beat
0 Tom
Hallo liebe Gemeinde,
ich habe hier eine selbstdefinierte Funktion, um zu testen, ob eine datei existiert und falls nicht, ein anderer Name als der Wunschname ausgegeben wird (nach dem schema bla.txt gibt es schon, also bla (1).txt)
function dateiname($wunschname) {
$i = 0;
$check = 0;
while (!$check) {
if (file_exists("irgendeinVerzeichnis/" . $wunschname . ".txt")) {
$check = 1;
break;
} else {
$i++;
}
if ($i == 0) { $i = ""; } else { $i = " (" . $i . ")"; }
return $wunschname . $i . ".txt";
}
}
}
echo dateiname("bla");
Leider gibt php jetzt aus
Fatal error: Call to undefined function: dateiname()...
Warum? ich habe die Funktion doch gerade definiert?!
Schon mal danke im Vorraus für Antworten ;-)
lg horachorus
Hi,
Leider gibt php jetzt aus
Fatal error: Call to undefined function: dateiname()...
Warum?
Was zuerst auffällt: Dein gezeigter Code enthält sechs öffnende geschweifte Klammern und sieben schliessende.
(Da muss also wohl vermutlich noch woanders eine öffnende sein, denn sonst sollte das so ziemlich das erste sein, was den Parser stört. Dass deshalb deine Funktion nicht bekannt ist, ist aber wahrscheinlich.)
MfG ChrisB
Hi Chris!
Dein gezeigter Code enthält sechs öffnende geschweifte Klammern und sieben schliessende.
(Da muss also wohl vermutlich noch woanders eine öffnende sein, denn sonst sollte das so ziemlich das erste sein, was den Parser stört. Dass deshalb deine Funktion nicht bekannt ist, ist aber wahrscheinlich.)
Ja, richtig!
Vien Dank, sorry, is schon spät!^^
lg horachorus
Hallo,
wie Chris schon bemaengelt hat liegen Syntaxfehler vor.
Des weiteren kannst du deine Funktion auch noch von unnoetigen Balast befreien. zB
function getFilename( $name )
{
$i = 0;
$folder = "/AnyDirectory/";
$filename = $folder . $name . ".txt";
while( file_exists( $filename ) )
{
$i++;
$filename = $folder . $name . "(".$i.").txt";
}
return $filename;
}
echo getFilename("bla");
MfG
Peter
Des weiteren kannst du deine Funktion auch noch von unnoetigen Balast befreien. zB
Nur solltest du deshalb nicht unnötiges einbauen.
function getFilename( $name )
{
$i = 0;
$folder = "/AnyDirectory/";
$filename = $folder . $name . ".txt";
Achte auf den filenamen ...
while( file_exists( $filename ) )
{
$i++;
$filename = $folder . $name . "(".$i.").txt";
}
... der hier /AnyDirectory/bla.txt lauten kann.
return $filename;
}echo getFilename("bla");
mfg Beat
--
><o(((°> ><o(((°>
<°)))o>< ><o(((°>o
Der Valigator leibt diese Fische
Hi Beat,
Achte auf den filenamen ...
... der hier /AnyDirectory/bla.txt lauten kann.return $filename;
Ah oh, da haste natuerlich recht ;-)
Wobei der Aufbau der Funktion an sich auch schon recht murks ist. Denn durch die feste Verdrahtung des Verzeichnisses laesst sich der Code nicht wiederverwenden.
MfG
Peter
Hello,
die Funktion ist generell recht nutzlos, denn was nützt Dir die Ermittlung eines neuen Dateinamens, wenn Du nicht gleich auch eine Datei unter diesem Namen anlegst? In der Zeitlücke zwischen der Abfrage "Ist die Datei schon vorhanden" und dem späteren Anlegen der Datei unter dem ermittelten Namen kann diese bereits unter demselben Namen von einem anderen Prozess angelegt worden sein.
Das nennt man dann TOCTOU-Fehler http://en.wikipedia.org/wiki/Time-of-check-to-time-of-use
Die meisten Filesysteme bieten daher die Möglichkeit, Dateien unter einem (neuen) Namen nur dann erstellen zu lassen, wenn diese NOCH NICHT VORHANDEN sind. Diese Arbeitsschrrtte sind dann schon vom Filesystem (als Bestandteil des Betriebssystemes) als atomistischer Prozess gekapselt und daher sicher.
PHP bietet diese Möglichkeit durch Verwendung des 'X'-File-Modus .
http://de2.php.net/manual/en/function.fopen.php
Die einzig richtige Lösung für diese Aufgabenstellung ist daher die sofortige Erzeugung eines neuen Handles auf den neuen Filenamen und die sofortige exclusive Sperre der Datei mit LOCK_EX.
Dabei müssen dann auch diverse Fehlermöglichkeiten berücksichtigt werden:
Das Verzeichnis, in dem die Datei erstellt werden soll, ich nicht vorhanden
Das Verzeichnis, in dem die Datei erstellt werden soll, lässt sich nicht anlegen
In dem Verzeichnis, in dem die Datei erstellt soll, darf nicht geschrieben werden
Datei lässt sich problemlos anlegen (kein Fehler, aber es geht ja noch weiter...)
Die gerade angelegte Datei lässt sich nicht exclusiv sperren
(unwahrscheinlich, aber nicht unmöglich)
Wenn alles geklappt hat, kann das erzeugte Handle sofort benutzt werden. Trat ein Fehler auf, muss das Programm entsprechend sinnvoll darauf reagieren.
Es sollten also das neue Handle und ein Fehlercode zurückgegeben werden.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg