Start · Sprachen · PHP · Referenz · ldap_control_paged_result_response

ldap_control_paged_result_response

Funktion

Liest das Paginierungs-Cookie und die geschätzte Ergebnisanzahl aus einer LDAP-Antwort aus, um durch seitenweise Suchergebnisse zu blättern.

seit PHP 5.4.0 Kategorie: misc

Signatur

ldap_control_paged_result_response(LDAP\Connection $ldap, LDAP\Result $result, string &$cookie = null, int &$estimated = null): bool

Beschreibung

Diese Funktion wird in Verbindung mit ldap_control_paged_result() eingesetzt, um seitenweise LDAP-Suchergebnisse abzurufen. Nachdem eine LDAP-Suche mit aktiviertem Paginierungs-Control durchgeführt wurde, liest ldap_control_paged_result_response() das vom Server zurückgegebene Cookie aus, das für die nächste Seitenanforderung benötigt wird.

Solange das zurückgegebene $cookie nicht leer ist, gibt es weitere Ergebnisseiten. Das Cookie muss in der nächsten Iteration via ldap_control_paged_result() übergeben werden, damit der Server die Paginierung fortsetzt. Ist das Cookie ein leerer String, wurde die letzte Seite erreicht.

Der optionale Parameter $estimated gibt die vom LDAP-Server geschätzte Gesamtanzahl der Einträge zurück – dieser Wert ist jedoch nicht zuverlässig und sollte nur als Richtwert behandelt werden.

Wichtig: Diese Funktion ist seit PHP 7.4 als veraltet markiert und wurde in PHP 8.0 entfernt. Für PHP 8.x ist stattdessen ldap_search() mit dem controls-Parameter und LDAP_CONTROL_PAGEDRESULTS zu verwenden.

Parameter

Name Typ Default Beschreibung
$ldap Pflicht LDAP\Connection Eine gültige LDAP-Verbindungsressource, die durch ldap_connect() erzeugt wurde.
$result Pflicht LDAP\Result Das LDAP-Ergebnisobjekt, das von ldap_search(), ldap_list() oder ldap_read() zurückgegeben wurde.
$cookie string Wird als Referenz übergeben und enthält nach dem Aufruf das Paginierungs-Cookie des Servers. Ein leerer String bedeutet, dass keine weiteren Seiten vorhanden sind.
$estimated int Wird als Referenz übergeben und enthält nach dem Aufruf die vom Server geschätzte Gesamtanzahl der Einträge. Dieser Wert ist nicht garantiert korrekt.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Paginierungs-Antwort erfolgreich aus dem Ergebnis gelesen werden konnte, andernfalls false.

Beispiele

Alle LDAP-Einträge seitenweise abrufen (PHP 7.x)

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

$pageSize = 100;
$cookie   = '';
$allEntries = [];

do {
    // Paginierungs-Control für diese Seite setzen
    ldap_control_paged_result($ldap, $pageSize, true, $cookie);

    $result = ldap_search(
        $ldap,
        'dc=example,dc=com',
        '(objectClass=inetOrgPerson)',
        ['cn', 'mail']
    );

    if (!$result) {
        break;
    }

    $entries = ldap_get_entries($ldap, $result);
    for ($i = 0; $i < $entries['count']; $i++) {
        $allEntries[] = $entries[$i]['cn'][0] ?? '';
    }

    // Cookie und geschätzte Gesamtanzahl auslesen
    ldap_control_paged_result_response($ldap, $result, $cookie, $estimated);
    echo "Seite abgerufen. Geschätzte Gesamtanzahl: {$estimated}\n";

} while (!empty($cookie)); // Solange Cookie vorhanden, weitere Seiten abrufen

echo 'Gesamt abgerufene Einträge: ' . count($allEntries) . PHP_EOL;

ldap_unbind($ldap);
Seite abgerufen. Geschätzte Gesamtanzahl: 350 Seite abgerufen. Geschätzte Gesamtanzahl: 350 Seite abgerufen. Geschätzte Gesamtanzahl: 350 Seite abgerufen. Geschätzte Gesamtanzahl: 350 Gesamt abgerufene Einträge: 350

Moderner Ersatz in PHP 8.x mit ldap_search und Controls

<?php
// PHP 8.0+ Ersatz für ldap_control_paged_result / ldap_control_paged_result_response
$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');

$pageSize   = 100;
$cookie     = '';
$allEntries = [];

do {
    $controls = [
        [
            'oid'        => LDAP_CONTROL_PAGEDRESULTS,
            'iscritical' => true,
            'value'      => [
                'size'   => $pageSize,
                'cookie' => $cookie,
            ],
        ],
    ];

    $result = ldap_search(
        $ldap,
        'dc=example,dc=com',
        '(objectClass=inetOrgPerson)',
        ['cn', 'mail'],
        0, 0, -1, LDAP_DEREF_NEVER,
        $controls
    );

    ldap_parse_result($ldap, $result, $errcode, $matcheddn, $errmsg, $referrals, $responseControls);

    $entries = ldap_get_entries($ldap, $result);
    for ($i = 0; $i < $entries['count']; $i++) {
        $allEntries[] = $entries[$i]['cn'][0] ?? '';
    }

    $cookie = $responseControls[LDAP_CONTROL_PAGEDRESULTS]['value']['cookie'] ?? '';

} while (!empty($cookie));

echo 'Gesamt: ' . count($allEntries) . PHP_EOL;
ldap_unbind($ldap);
Gesamt: 350

// Wichtig · Fallstricke

Deprecation: ldap_control_paged_result_response() wurde in PHP 7.4 als veraltet markiert (deprecated) und in PHP 8.0 vollständig entfernt. Für neue Projekte und bei der Migration auf PHP 8 sollte statt dessen ldap_search() mit dem $controls-Parameter und ldap_parse_result() zur Auswertung verwendet werden.

Das Cookie enthält serverseitig sensible Sitzungsdaten und sollte niemals direkt an Endbenutzer weitergegeben oder in unsicheren Speichern abgelegt werden.

Nicht alle LDAP-Server unterstützen das Paginierungs-Control (RFC 2696). Wenn der Server das Control als kritisch ablehnt, schlägt die Suche fehl. In diesem Fall sollte LDAP_OPT_SERVER_CONTROLS entsprechend geprüft werden.