horachorus: Selbstdefinierte Funktion wird nicht erkannt!

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

  1. 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

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. 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

  2. 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

    1. 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
      
      1. 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

  3. 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

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de