Start · Sprachen · PHP · Referenz · ldap_read

ldap_read

Funktion

Führt eine LDAP-Suche mit dem Scope <code>LDAP_SCOPE_BASE</code> durch und liest genau einen Eintrag anhand seiner DN.

seit PHP 4.0.0 Kategorie: misc

Signatur

ldap_read(LDAP\Connection|array $ldap, array|string $base, array|string $filter, array $attributes = [], int $attributes_only = 0, int $sizelimit = -1, int $timelimit = -1, int $deref = LDAP_DEREF_NEVER, ?array $controls = null): LDAP\Result|array|false

Beschreibung

ldap_read() ist die PHP-Funktion für LDAP-Suchen mit dem Scope LDAP_SCOPE_BASE. Das bedeutet, dass nur der direkt angegebene Basis-DN (Base-DN) ausgelesen wird – weder untergeordnete noch übergeordnete Einträge werden in die Suche einbezogen. Damit eignet sich die Funktion ideal, um einen einzelnen, bereits bekannten LDAP-Eintrag gezielt abzurufen.

Im Gegensatz zu ldap_search() (Scope: subtree) und ldap_list() (Scope: one) durchsucht ldap_read() ausschließlich den angegebenen Knoten selbst. Das macht sie effizienter, wenn lediglich die Attribute eines bekannten Objekts – z. B. eines Benutzers oder einer Gruppe – gelesen werden sollen.

Das zurückgegebene Result-Handle kann anschließend mit ldap_get_entries(), ldap_first_entry() oder ldap_get_attributes() weiterverarbeitet werden. Wird ein Array von LDAP-Verbindungen übergeben, arbeitet die Funktion parallel auf mehreren Verzeichnissen und gibt ein Array von Ergebnis-Handles zurück.

Ab PHP 8.1.0 werden LDAP-Verbindungen als Objekte vom Typ LDAP\Connection repräsentiert; zuvor waren es Ressourcen vom Typ resource.

Parameter

Name Typ Default Beschreibung
$ldap Pflicht LDAP\Connection|array Eine gültige LDAP-Verbindung, die mit ldap_connect() erstellt und mit ldap_bind() authentifiziert wurde. Alternativ ein Array solcher Verbindungen für parallele Abfragen.
$base Pflicht array|string Der Distinguished Name (DN) des Eintrags, der gelesen werden soll, z. B. "uid=max,ou=users,dc=example,dc=com". Bei einem Array von Verbindungen muss hier ebenfalls ein Array mit den entsprechenden Base-DNs angegeben werden.
$filter Pflicht array|string LDAP-Suchfilter gemäß RFC 4515, z. B. "(objectClass=*)". Da nur ein Eintrag gelesen wird, reicht oft der Catch-all-Filter. Bei mehreren Verbindungen kann ein Array von Filtern übergeben werden.
$attributes array [] Array der zurückzugebenden Attributnamen, z. B. ["cn", "mail", "telephoneNumber"]. Ein leeres Array bedeutet, dass alle Attribute zurückgegeben werden.
$attributes_only int 0 Wird auf 1 gesetzt, werden nur die Attributnamen ohne deren Werte zurückgegeben. Standard ist 0 (Attribute mit Werten).
$sizelimit int -1 Maximale Anzahl zurückzugebender Einträge. -1 bedeutet, dass das serverseitige Limit gilt. Da ldap_read() ohnehin nur einen Eintrag liest, ist dieser Parameter hier meist irrelevant.
$timelimit int -1 Maximale Ausführungszeit der Suche in Sekunden. -1 verwendet das serverseitige Limit.
$deref int LDAP_DEREF_NEVER Legt fest, wie Aliase behandelt werden. Mögliche Werte: LDAP_DEREF_NEVER, LDAP_DEREF_SEARCHING, LDAP_DEREF_FINDING, LDAP_DEREF_ALWAYS.
$controls array|null null Array von LDAP-Steuerelementen (Server Controls), die mit der Anfrage gesendet werden sollen. null sendet keine zusätzlichen Controls.

Rückgabewert

Typ
LDAP\Result|array|false
Beschreibung
Bei Erfolg ein LDAP\Result-Objekt (vor PHP 8.1 eine Ressource), das mit den LDAP-Ergebnis-Funktionen weiterverarbeitet werden kann. Bei mehreren Verbindungen (Array) wird ein Array von Ergebnis-Objekten zurückgegeben. Im Fehlerfall wird false zurückgegeben.

Beispiele

Einzelnen LDAP-Benutzer anhand bekannter DN lesen

<?php
$ldap = ldap_connect('ldap://ldap.example.com');
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);

if (!ldap_bind($ldap, 'cn=admin,dc=example,dc=com', 'geheimesPasswort')) {
    die('Bind fehlgeschlagen');
}

$dn     = 'uid=max.mustermann,ou=users,dc=example,dc=com';
$filter = '(objectClass=*)';
$attrs  = ['cn', 'mail', 'telephoneNumber'];

$result = ldap_read($ldap, $dn, $filter, $attrs);

if ($result === false) {
    die('Lesen fehlgeschlagen: ' . ldap_error($ldap));
}

$entries = ldap_get_entries($ldap, $result);

if ($entries['count'] > 0) {
    $user = $entries[0];
    echo 'Name:     ' . ($user['cn'][0]            ?? '-') . PHP_EOL;
    echo 'E-Mail:   ' . ($user['mail'][0]           ?? '-') . PHP_EOL;
    echo 'Telefon:  ' . ($user['telephonenumber'][0] ?? '-') . PHP_EOL;
}

ldap_unbind($ldap);
Name: Max Mustermann E-Mail: max.mustermann@example.com Telefon: +49 89 123456

Nur Attributnamen eines Eintrags ermitteln (ohne Werte)

<?php
$ldap = ldap_connect('ldap://ldap.example.com');
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_bind($ldap, 'cn=admin,dc=example,dc=com', 'geheimesPasswort');

$dn     = 'uid=max.mustermann,ou=users,dc=example,dc=com';
$result = ldap_read($ldap, $dn, '(objectClass=*)', [], 1); // attributes_only = 1

if ($result !== false) {
    $entry = ldap_first_entry($ldap, $result);
    $attrs = ldap_get_attributes($ldap, $entry);

    echo 'Vorhandene Attribute:' . PHP_EOL;
    for ($i = 0; $i < $attrs['count']; $i++) {
        echo '  - ' . $attrs[$i] . PHP_EOL;
    }
}

ldap_unbind($ldap);
Vorhandene Attribute: - objectClass - uid - cn - sn - mail - telephoneNumber

// Wichtig · Fallstricke

Sicherheitshinweis: LDAP-DNs und Filterwerte, die aus Benutzereingaben stammen, müssen vor der Verwendung mit ldap_escape() bereinigt werden, um LDAP-Injection-Angriffe zu verhindern. Für DNs ist der Flag LDAP_ESCAPE_DN, für Filterwerte LDAP_ESCAPE_FILTER zu verwenden.

Scope-Unterschied: ldap_read() durchsucht ausschließlich den angegebenen DN selbst (Scope base). Für die Suche in einer Ebene unterhalb des Base-DN ist ldap_list() (Scope one), für die rekursive Suche ldap_search() (Scope subtree) zu verwenden.

PHP 8.1+: LDAP-Verbindungen und -Ergebnisse sind nun echte Objekte der Klassen LDAP\Connection und LDAP\Result. Alte is_resource()-Prüfungen funktionieren nicht mehr; stattdessen instanceof oder direkte Vergleiche mit false verwenden.