Start · Sprachen · PHP · Referenz · ldap_mod_del

ldap_mod_del

Funktion

Löscht bestimmte Attributwerte eines vorhandenen LDAP-Eintrags, ohne den gesamten Eintrag oder das Attribut zu entfernen.

seit PHP 4.0.0 Kategorie: misc

Signatur

ldap_mod_del(LDAP\Connection $ldap, string $dn, array $entry, array $controls = []): bool

Beschreibung

ldap_mod_del führt eine LDAP-Modify-Delete-Operation durch: Es werden gezielt einzelne Werte eines oder mehrerer Attribute aus einem bestehenden Verzeichniseintrag entfernt. Der Eintrag selbst sowie das Attribut bleiben dabei erhalten, sofern noch weitere Werte vorhanden sind.

Im Unterschied zu ldap_delete, das einen ganzen Eintrag löscht, oder ldap_mod_replace, das Attributwerte vollständig ersetzt, entfernt ldap_mod_del nur die explizit angegebenen Werte. Wird ein Attribut mit einem leeren Array übergeben, werden alle Werte dieses Attributs gelöscht.

Typische Anwendungsfälle sind das Entfernen einer einzelnen E-Mail-Adresse aus einem mail-Attribut mit mehreren Werten, das Abmelden eines Benutzers aus einer Gruppe (member/uniqueMember) oder das Bereinigen veralteter Telefonnummern in einem Verzeichniseintrag.

Die Funktion benötigt eine aktive, authentifizierte LDAP-Verbindung mit ausreichenden Schreibrechten auf den betreffenden Eintrag. Seit PHP 8.1 wird als erster Parameter ein LDAP\Connection-Objekt erwartet (zuvor war es eine Ressource).

Parameter

Name Typ Default Beschreibung
$ldap Pflicht LDAP\Connection Eine aktive LDAP-Verbindung, die zuvor mit ldap_connect und ldap_bind aufgebaut wurde.
$dn Pflicht string Der Distinguished Name (DN) des Eintrags, dessen Attributwerte gelöscht werden sollen, z. B. uid=jsmith,ou=users,dc=example,dc=com.
$entry Pflicht array Assoziatives Array, das die zu löschenden Attributwerte enthält. Der Schlüssel ist der Attributname (z. B. 'mail'), der Wert ist ein Array mit den zu entfernenden Werten. Ein leeres Array als Wert löscht alle Werte des Attributs.
$controls array [] Optionales Array mit LDAP-Server-Controls, die mit der Operation gesendet werden sollen (z. B. für Pre-/Post-Read-Controls). Wurde in PHP 7.3 hinzugefügt.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Operation erfolgreich war. Bei einem Fehler (z. B. fehlende Rechte, nicht vorhandener Eintrag, nicht existenter Attributwert) wird false zurückgegeben. Detaillierte Fehlerinformationen liefern ldap_error und ldap_errno.

Beispiele

Einzelne E-Mail-Adresse aus einem Benutzer-Eintrag entfernen

<?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', 'geheim')) {
    die('Bind fehlgeschlagen: ' . ldap_error($ldap));
}

$dn = 'uid=jsmith,ou=users,dc=example,dc=com';

// Nur diesen einen Mail-Wert entfernen
$entry = [
    'mail' => ['jsmith@old.example.com'],
];

if (ldap_mod_del($ldap, $dn, $entry)) {
    echo "E-Mail-Adresse erfolgreich entfernt.\n";
} else {
    echo 'Fehler: ' . ldap_error($ldap) . "\n";
}

ldap_unbind($ldap);
E-Mail-Adresse erfolgreich entfernt.

Benutzer aus einer LDAP-Gruppe austragen

<?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', 'geheim');

$groupDn = 'cn=developers,ou=groups,dc=example,dc=com';
$userDn  = 'uid=jsmith,ou=users,dc=example,dc=com';

// Mitglied aus der Gruppe entfernen
$entry = [
    'member' => [$userDn],
];

if (ldap_mod_del($ldap, $groupDn, $entry)) {
    echo "Benutzer erfolgreich aus der Gruppe entfernt.\n";
} else {
    echo 'Fehler: ' . ldap_error($ldap) . "\n";
}

ldap_unbind($ldap);
Benutzer erfolgreich aus der Gruppe entfernt.

// Wichtig · Fallstricke

Wichtig: Der angegebene Attributwert muss exakt so im Verzeichnis vorhanden sein — auch Groß-/Kleinschreibung kann je nach Attributtyp und Server-Konfiguration eine Rolle spielen. Existiert der angegebene Wert nicht, schlägt die Operation mit einem LDAP-Fehler fehl (LDAP_NO_SUCH_ATTRIBUTE).

Sollen alle Werte eines Attributs entfernt werden, kann alternativ ldap_mod_replace mit einem leeren Array als Wert verwendet werden, was in manchen Verzeichnissen besser unterstützt wird.

Vor PHP 8.1 wurde die Verbindung als resource übergeben. Bei der Migration auf PHP 8.1+ muss sichergestellt werden, dass der Rückgabewert von ldap_connect korrekt als LDAP\Connection-Objekt behandelt wird.

Aus Sicherheitsgründen sollte der $dn-Parameter niemals ungeprüft aus Benutzereingaben übernommen werden, um LDAP-Injection-Angriffe zu verhindern. Verwende ldap_escape mit dem Flag LDAP_ESCAPE_DN zur Absicherung.