• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

welcher Typ von Pfad ?

syuam

Neues Mitglied
hey Leute folgendes,
Zuerst die Funktion "is_dir()" :
PHP:
$folder = "Verzeichnis";
if(is_dir("$folder")) {
Wenn sich der Ordner "Verzeichnis" im gleichen Verzeichnis, wie dieses Script befindet, kann ich das doch so schreiben oder?
Darf die Angabe eine Variable sein, oder muss sie eine Url/relativer bzw absolute Pfadangabe sein?
weil im manual kann es auch ruhig ein Dateiname sein, darf ich den dann als Variable schreiben?

Nun die Funktion "mkdir()" :
PHP:
$subfolder = "Unterordner";
$n = 1;
mkdir("/srv/disk8/1391019/www/example.eu.pn/Ordner/$subfolder.$n", 0700);
Mit mkdir() soll in diesem Beispiel ein "Unterordner.1" in dem Ordner "Verzeichnis" erstellt werden.
Das Script mit der Funktion mkdir() und der Ordner "Verzeichnis" liegen hierbei im gleichen Verzeichnis.
Ich habe bei mkdir() einen absoluten Serverpfad angegeben.
Ist das richtig? sollte ich es anders machen?
ist ansosnten alles richtig gecodet?
lg!
 
Werbung:
ok soweit funktioniert es auch, ABER...
nun möchte ich, dass jedes mal wenn im Ordner "Verzeichnis" ein Ordner erstellt wird, dieser am Ende immer +1 hat.
Also, beim ersten mal wird der Ordner "Unterordner.1" erstellt,
beim zweiten mal wird der Ordner "Unterordner.2" erstellt usw..daür habe ich diese Schleife benutzt:
PHP:
$folder = "Verzeichnis";
$subfolder = "Unterordner";
$n = 1;
$maxDirectories = 1000;
if(is_dir("$folder")) {
        // Pruefe ob das Unterverzeichnis bereits existiert ; Erstelle Unterverzeichnis (n+1)
        clearstatcache ();
        for (; $n < $maxDirectories ; $n++) {
            if (is_dir("$folder/$subfolder.$n")) {
                mkdir ("/srv/disk8/1391019/www/example.eu.pn/$folder/$subfolder.$n", 0700);
                echo "Unterordner erstellt";
                break;
            }
            else {
                echo "Error: Kann den Unterordner $subfolder.$n nicht erstellen!";
            }
        }
    }
Nun wird nachdem der Ordner "Unterordner.1" erstellt worden ist, bei weieteren Aufruf kein "Unterordner.2" erstellt.
Meldung:
Warning: mkdir() [function.mkdir]: File exists in /srv/disk8/1391019/www/example.eu.pn/phpfile.php on line 22
Unterverzeichnis http://www.example.eu.pn/Verzeichnis/Unterordner.1 erstellt
Diese Meldung kommt jedes mal, nach dem "Unterordner.1" schon erstellt worden ist.
Was ist falsch an meiner Schleife?
lg
 
Werbung:
Also wirklich, erst die (meiner Meinung nach überflüssige) Frage, ob der Scriptschnipsel ok ist und jetzt erkennst du einen simplen Fehler im eigenen Script nicht!

PHP:
if (is_dir("$folder/$subfolder.$n")) 
{
    mkdir ("/srv/disk8/1391019/www/example.eu.pn/$folder/$subfolder.$n", 0700);
    echo "Unterordner erstellt";
    break;

}
Was steht da genau??!!?? Erkläre es mit deinen Wortn und du wirst erkennen, wo der Fehler liegt.
 
Wenn der $subfolder(der sich in $folder befindet) existiert, dann erstelle haargenau das gleiche^^, es wird überschrieben ups...daher auch die "korrekte" echo-Ausgabe...
Die For-Schleife muss in die if-Bedingung oder?
lg
 
PHP:
if (is_dir("$folder/$subfolder.$n"))
Negieren!!
PHP:
if (!  is_dir("$folder/$subfolder.$n"))
Lerne bitte die Grundlagen!!
 
Werbung:
ok hab es umgeändert:
PHP:
$folder = "Verzeichnis";
$subfolder = "Unterordner";
$n = 1;
$maxDirectories = 1000;
if(is_dir("$folder")) {
        // Pruefe ob das Unterverzeichnis bereits existiert ; Erstelle Unterverzeichnis (n+1)
        clearstatcache ();
        for (; $n < $maxDirectories ; $n++) {
            if (!is_dir("$folder/$subfolder.$n")) {
                mkdir ("/srv/disk8/1391019/www/example.eu.pn/$folder/$subfolder.$n", 0700);
                echo "Unterordner erstellt";
                break;
            }
            else {
                echo "Error: Kann den Unterordner $subfolder.$n nicht erstellen!";
            }
        }
    }
Danke! :) total übersehen...
Nun wird auch schlussendlich immer "n+1" gemacht, aber.. was etwas komisch ist:
Error: Kann den Unterordner Unterordner.1 nicht erstellen!Unterordner erstellt
Es wird zuerst die echo Ausgabe ausgegeben, die ich sehen sollte, wenn es nicht geklappt hat, daher steht es ja im else.
Und direkt danach bekomme ich die echo-Meldung aus dem if-Teil, dass es geklappt hat.
Wie ist das möglich?
würde es gerne wissen, auch wenn datenbanktechnisch schlussendlich alles so abläuft, wie ich es mir gedacht hatte.
lg
 
Erkläre nochmal mit deinen Worten, was da steht:
PHP:
if (!is_dir("$folder/$subfolder.$n")) 
{
    mkdir ("/srv/disk8/1391019/www/example.eu.pn/$folder/$subfolder.$n", 0700);
    echo "Unterordner erstellt";
    break;
}
else 
{
   echo "Error: Kann den Unterordner $subfolder.$n nicht erstellen!";
}
 
Wenn $subfolder.$n nicht existiert, dann erstelle $subfolder.$n(wobei $n++), anschließend gebe aus: echo"";
Wenn $subfolder.$n existiert(else), dann gebe aus: echo"";

das ist es eigentlich..
Nun, wenn die Bedingung im if-Teil TRUE ist, dann darf else doch gar nicht mehr gelesen werden?
Wo ist mein Fehler??
edit: ach ich habe die $n++ ganz vergessen, dass es jedes mal bei 1 startet und sich dann hocharbeitet, bis es was gefunden hat...Stellt das eine Sicherheitslücke dar? wie kann ich das umändern?
lg
 
Werbung:
Da steht:
Wenn es kein Verzeichnis mit dem angebenen Namen gibt, erstelle es.
Wenn nicht, gebe eine Fehlermeldung aus!
 
könntest du mir da vielleicht helfen?
damit $n nicht jedes mal von 1 startet...
weiß da nicht weiter...lg
 
Werbung:
PHP:
<?php
if (!is_dir("$folder/$subfolder.$n")) 
{
    if (mkdir ("/srv/disk8/1391019/www/example.eu.pn/$folder/$subfolder.$n", 0700))
    {
       echo "Unterordner erstellt";
       break;
    }
    else
       echo "/srv/disk8/1391019/www/example.eu.pn/$folder/$subfolder.$n konnte nicht erzeugt werden"
}
?>
 
Werbung:
Um das mit den Pfaden vielleicht noch mal kurz zu erklären:

PHP beziehungsweise das Betriebssystem braucht letztlich immer einen absoluten Pfad. Das ist unter Windows einfach gesagt einer, der mit einem Laufwerksbuchstaben beginnt (c:/whatever/), unter unixartigen Systemen ein Pfad, der ab dem Systemroot ("/") aufgebaut ist, also der mit einem Slash beginnt.

Bei mkdir('foo'); ist diese Bedingung erst mal noch nicht erfüllt. Das bedeutet, dass PHP/das Betriebssystem hier intern noch was tun muss, um daraus einen absoluten Pfad zu machen (das passiert aber automatisch).

Der „Trick“ ist das Konzept eines Arbeitsverzeichnisses. Aus OS-Sicht wird „jeder Prozess“ aus einem Verzeichnis heraus gestartet. Dieses Verzeichnis ist das Arbeitsverzeichnis des Prozesses. Pfadangaben, die nicht bereits absolut sind, werden an dieses Arbeitsverzeichnis „angehängt“ (relativ dazu ausgewertet), sodass sich ein absoluter Pfad ergibt.

In PHP kann dieses Verzeichnis mit getcwd() ausgelesen werden:

PHP:
<?php

echo getcwd(); // Get current working directory
    // Liefert zum Beispiel: /home/public_html/marc/fiddle

Bei Ausführung über den Webserver ist das Arbeitsverzeichnis in der Regel das Verzeichnis, in dem sich die ursprünglich aufgerufene PHP-Datei befindet. Soll heißen: Für PHP-Dateien, die inkludiert werden, ändert sich das Arbeitsverzeichnis nicht, es bleibt das der inkludierenden Datei.

Ein mkdir('foo'); würde an dieser Stelle so ausgewertet wie ein mkdir('/home/public_html/marc/fiddle/foo');.

Ein Problem damit: Das Arbeitsverzeichnis ändert sich üblicherweise, wenn die PHP-Datei nicht über den Webserver (sondern etwa als cronjob) aufgerufen wird. Der Aufruf erfolgt dann aus einem anderen Verzeichnis heraus.

Ich habe in etwa dazu mal einen Text geschrieben: PHP-Includes: Niemals ohne __DIR__

Darin beziehe ich mich in erster Linie auf Includes, aber die Aussagen zu den verschiedenen Arten von Pfadangaben und das Fazit, nach Möglichkeit Pfade mit __DIR__ absolut zu verankern, sind auch für Funktionen wie mkdir, fopen usw. sinnvoll. __DIR__ liefert immer denselben Wert, ohne vom Arbeitsverzeichnis abhängig zu sein.
 
Zurück
Oben