2016-03-29 15 views
0

LDAPベースのすべてのエントリを反復処理する必要があります。実際、LDAPサーバーは検索ごとに500エントリに制限されています。私はPHP 5.6で作業しています。PHPを使用してページベースのLDAPベースを検索する

(...) 
498 - NAME SUPRESSED 
499 - NAME SUPRESSED 
500 - NAME SUPRESSED 
WARNING: ldap_control_paged_result_response(): Result is: Size limit exceeded (4) 
WARNING: ldap_control_paged_result_response(): Result is: Size limit exceeded (4) 
WARNING: ldap_control_paged_result_response(): Result is: Size limit exceeded (4) 
(...) 

(...) 
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3); 

$pageSize = 100; 
$cookie = ''; 
$count = 0; 
do { 
    ldap_control_paged_result($conn, $pageSize, true, $cookie); 

    $result = ldap_search($conn, 'ou=people,dc=ufsf,dc=br', 'uid=*', ['uid', 'name']); 
    $entries = ldap_get_entries($conn, $result); 

    foreach ($entries as $entry) { 
     $count++; 
     echo $count . ' - ' . $entry['name'][0] . PHP_EOL; 
    } 

    ldap_control_paged_result_response($conn, $result, $cookie); 

} while($cookie !== null && $cookie != ''); 

しかし、私はまだ500個の以上のエントリを取得することはできませんが、これが出力されます。

は私が ldap_control_paged_resultldap_control_paged_result_responseだけ実装1、簡単なテストスクリプトを使用して可能な解決策を見つけました

何か不足していますか?

+0

[PHPでLDAPのすべてのユーザーを列挙する](http://stackoverflow.com/questions/1473075/enumerate-all-users-in-ldap-with-php) – rkosegi

+1

これは 'ldap_set_option($ conn 、LDAP_OPT_PROTOCOL_VERSION、3); '本当に検索の直前に呼び出されますか?その場合は、 'ldap_connect()'の後で 'ldap_bind()'の前に呼び出す必要があります。これはページングがLDAP v3の機能であり、正しいバージョンでプロトコルバージョンを設定していないと効果がない可能性があるため、説明できるかもしれません。 – ChadSikorra

+0

@rkosegiこれは、IMOをはるかに簡単にすることができる、非常に完全で何とか複雑な解決策でした。最後に、サーバーの限界を広げる問題が解決されました。最高の解決策ではありませんが、今のところ働いています。 – marcellorvalle

答えて

-2

ここでは、500以上のエントリを取得する方法の回答が見つかります。 How can I send whole array from php cycle?ページネーションの場合は、たとえばDataTablesを使用できます。

+0

これはOPの問題には適用されません。問題は、LDAPサーバーサイズの結果の制限です。 – rkosegi

+0

私も同じ問題を抱えており、この回答は私に役立ちます。もちろんあなたのために最善の答えです:**あなたのLDAPサーバーの上限を500以上に設定**。だからこそ、関連するフィードバックなしでdownvotingするだけです。 _Btw。それは正しい方法ではありません。何度も同じ問題が繰り返されるからです._ – Mardzis

+0

できれば私はもう一度downvoteします。サーバーのサイズ制限を設定することは解決策ではありません。答えは正しいです。ページングされた結果を取得するために正しいAPIを使用する必要があります。 RFC 2696準拠のAPIを使用するだけです。結果を1つの配列にマージすることについての答えを参照しています。 – rkosegi