2016-04-22 10 views
1

Ich bin eine ziemlich große ldap Benutzerdatensatz abfragen. Und ich habe wirklich keinen Weg. Ich habe andere kleinere Abfragen erstellt, die nach Gruppen, Managern und anderen wichtigen Informationen filtern können. Jetzt erfordert diese Abfrage jedoch, dass ich alle Benutzer in der Firma durchschaue (+100.000 Benutzer). Die zurückgegebene Ergebnismenge wird in eine jquery-Autocomplete-Box übernommen. Damit diese Liste nicht komplett verrückt wird, verwende ich den sechsten ldap_search-Parameter, mit dem Sie die Anzahl der zurückgegebenen Ergebnisse begrenzen können. Wenn der Benutzer den Benutzer, den er benötigt, nicht sieht, sollte er mehr Zeichen bereitstellen.PHP ldap_search unterdrückt Warnungen Limit erreicht

$sr=ldap_search($ds, $dn, $search, $filter,0,15); 

Problem ist, dass, wenn die Grenze für die ldap_search erreicht ist, dann ist es eine Warnmeldung mit dem Datensatz liefert Ihnen zu sagen, dass diese zurückgegeben wurden nicht alle Ergebnisse ist. Dies unterbricht die Population der Autocomplete-Box. Ich möchte die Warnungen ignorieren können, wenn mehr Ergebnisse vorhanden sind als das Limit konfiguriert ist.

** Der Fehler ist, dass ich nicht alle Fehlermeldungen aus der ldap_search-Funktion beseitigen will. Die Verwendung der php '@' Suppressionsmethode kommt also nicht in Frage.

Weiß jemand einen anderen Weg, damit umzugehen?

+0

In Bezug auf die Gotcha, in welcher Weise verwenden Sie die anderen Fehlermeldungen? Du könntest mit '@' unterdrücken, aber überprüfe '$ sr' für false und dann' ldap_error() ', um es zu überprüfen. Müssen die Daten in Echtzeit sein? Sie könnten LDAP in regelmäßigen Abständen für alle Ergebnisse abfragen, sie zwischenspeichern und dann die gecachten Ergebnisse nach Bedarf abfragen. Obwohl das ein bisschen mehr Logik erfordern würde. – ChadSikorra

+0

Um Ihre erste Frage zu beantworten: Nur wegen der Art und Weise, wie die Organisation eingerichtet wird, können verschiedene Abteilungen Informationen für ihre eigenen Mitarbeiter an AD senden. Wenn ich das Bild des Mitarbeiters abnehme, stoße ich am häufigsten darauf, dass Dinge wie das Dataset zu groß für den lokalen Cache sind und die gesamte PHP ldap Query einen Fehler auslöst. Das ist nur ein Beispiel, aber das sind die Dinge, die ich anwende. – Alex

+0

Was bringt mich zu dem, was Sie gesagt haben. In den Fällen, die ich bisher getestet habe, kann ich mithilfe von ldap_error() die Ereignisse überwachen, die ich gerade verfolge. Das ist also perfekt! Vielen Dank. Willst du es als Antwort einreichen, damit ich es richtig markieren kann? – Alex

Antwort

1

Je nach dem LDAP-Server, mit dem Sie kommunizieren, unterstützt es möglicherweise die Ergebnisse der Seitensuche und/oder der virtuellen Listenansicht (VLV). Beide können verwendet werden, um durch eine große Suchergebnismenge zu paginieren. Sie können einige Diskussionen über das hier zu sehen (obwohl die Beispiele sind in Java): LDAP: How to return more than 1000 results (java)

Es Unterstützung für die ausgelagerten Ergebniskontrolle in PHP zu sein scheint, finden Sie unter: http://php.net/manual/it/function.ldap-control-paged-result.php

Ich hoffe, das hilft.

1

Per dem Kommentar, den ich gemacht, könnte man mit @ unterdrücken, sondern $sr für falsch überprüfen und dann ldap_error() es zu überprüfen verwenden:

$sr = @ldap_search($ds, $dn, $search, $filter, 0, 15); 

if (!$sr) { 
    $error = ldap_error($ds); 
    $code = ldap_errno($ds); 
    echo "($code) $error"; 
} else { 
    // do something with the results... 
} 

Auf diese Weise kann die Fehler aus den LDAP-Funktionen unterdrücken kann, aber immer noch angezeigt werden/protokollieren Sie die Fehlermeldung/den Code bei Bedarf.

Ein anderer Weg, dies zu tun, indem Sie Paging wäre:

// Force LDAP to return sets of 15 results at a time 
ldap_control_paged_result($ds, 15); 

$sr = ldap_search($ds, $dn, $search, $filter, 0); 
$entries = ldap_get_entries($ds, $sr); 

// Reset the page control so you don't interfere with other searches 
ldap_control_paged_result($ds, 0); 

Die ebenfalls oben vorausgesetzt, dass Sie LDAP v3 verwenden und haben bereits den benötigten ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3); Anruf irgendwo im Code nach den ldap_connect().

Verwandte Themen