Start · Sprachen · PHP · Referenz · ftp_chdir

ftp_chdir

Funktion

Wechselt das aktuelle Arbeitsverzeichnis auf einem FTP-Server.

seit PHP 4.0.0 Kategorie: io

Signatur

ftp_chdir(FTP\Connection $ftp, string $directory): bool

Beschreibung

ftp_chdir() sendet einen CWD-Befehl (Change Working Directory) an den FTP-Server und wechselt damit das aktuelle Verzeichnis der aktiven FTP-Verbindung. Das gewünschte Zielverzeichnis wird als absoluter oder relativer Pfad übergeben.

Die Funktion wird typischerweise eingesetzt, um vor dem Hoch- oder Herunterladen von Dateien in das richtige Verzeichnis zu navigieren. Sie ist das FTP-Äquivalent zu chdir() für das lokale Dateisystem.

Bei Erfolg gibt die Funktion true zurück. Schlägt der Verzeichniswechsel fehl – beispielsweise weil das Verzeichnis nicht existiert oder keine Berechtigung besteht –, wird false zurückgegeben und eine PHP-Warnung ausgelöst. Das aktuelle Verzeichnis nach einem erfolgreichen Wechsel lässt sich mit ftp_pwd() abfragen.

Für den Wechsel in das übergeordnete Verzeichnis steht alternativ ftp_cdup() bereit, das dem Befehl ftp_chdir($ftp, '..') entspricht.

Parameter

Name Typ Default Beschreibung
$ftp Pflicht FTP\Connection Eine aktive FTP-Verbindung, die mit ftp_connect() oder ftp_ssl_connect() erzeugt wurde.
$directory Pflicht string Der Pfad des Zielverzeichnisses auf dem FTP-Server. Kann absolut (z. B. /var/www/uploads) oder relativ zum aktuellen Verzeichnis sein.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Verzeichniswechsel erfolgreich war. Bei einem Fehler (z. B. Verzeichnis existiert nicht oder fehlende Berechtigung) wird false zurückgegeben und eine PHP-Warnung ausgelöst.

Beispiele

Einfacher Verzeichniswechsel und Abfrage des aktuellen Pfads

<?php
$ftp = ftp_connect('ftp.example.com');
if (!$ftp) {
    die('Verbindung fehlgeschlagen.');
}

if (!ftp_login($ftp, 'benutzername', 'geheimesPasswort')) {
    die('Anmeldung fehlgeschlagen.');
}

if (ftp_chdir($ftp, '/var/www/uploads')) {
    echo 'Aktuelles Verzeichnis: ' . ftp_pwd($ftp) . PHP_EOL;
} else {
    echo 'Verzeichniswechsel fehlgeschlagen.' . PHP_EOL;
}

ftp_close($ftp);
?>
Aktuelles Verzeichnis: /var/www/uploads

Rekursiver Verzeichniswechsel mit Fehlerbehandlung

<?php
$ftp = ftp_connect('ftp.example.com');
ftp_login($ftp, 'benutzername', 'geheimesPasswort');

$pfade = ['backup', '2024', 'januar'];

foreach ($pfade as $verzeichnis) {
    if (!@ftp_chdir($ftp, $verzeichnis)) {
        // Verzeichnis existiert nicht – anlegen und erneut wechseln
        if (ftp_mkdir($ftp, $verzeichnis)) {
            ftp_chdir($ftp, $verzeichnis);
            echo "Verzeichnis '$verzeichnis' erstellt und gewechselt." . PHP_EOL;
        } else {
            echo "Fehler beim Erstellen von '$verzeichnis'." . PHP_EOL;
            break;
        }
    } else {
        echo "In '$verzeichnis' gewechselt." . PHP_EOL;
    }
}

echo 'Endverzeichnis: ' . ftp_pwd($ftp) . PHP_EOL;
ftp_close($ftp);
?>
In 'backup' gewechselt. Verzeichnis '2024' erstellt und gewechselt. Verzeichnis 'januar' erstellt und gewechselt. Endverzeichnis: /backup/2024/januar

// Wichtig · Fallstricke

PHP 8.1: Der Parameter $ftp erwartet seit PHP 8.1 eine Instanz der Klasse FTP\Connection statt einer resource. Älterer Code, der eine Resource übergab, funktioniert nach einer Deprecation in 8.0 ab 8.1 nicht mehr ohne Anpassung.

Sicherheit: Wenn der Verzeichnispfad aus Benutzereingaben stammt, sollte er unbedingt validiert und bereinigt werden, um Path-Traversal-Angriffe (z. B. über ../-Sequenzen) zu verhindern. Verwende basename() oder eine Whitelist erlaubter Pfade.

Das Unterdrücken von Fehlern mit @ (wie im zweiten Beispiel) ist in Produktivumgebungen nur dann empfehlenswert, wenn die Fehlerbehandlung explizit im Code erfolgt. Andernfalls sollte auf den @-Operator verzichtet werden, damit Verbindungsprobleme nicht unbemerkt bleiben.