如果您執行了分頁搜尋操作,並且想在 LDAP 上執行任何其他讀取操作,您需要重設它,否則您將會遇到 LDAP 錯誤(例如,代碼 12)。
<?php
…
ldap_control_paged_result($link, 0);
…
?>
(PHP 5 >= 5.4.0, PHP 7)
ldap_control_paged_result — 傳送 LDAP 分頁控制
此函式已於 PHP 7.4.0 中_棄用_,並於 PHP 8.0.0 中_移除_。 應改用 ldap_search() 的 controls
參數。 詳情請參閱 LDAP 控制。
透過傳送分頁控制(頁面大小、cookie 等)來啟用 LDAP 分頁。
連結
一個 LDAP 資源,由 ldap_connect() 返回。
pagesize
每頁的項目數。
iscritical
指示分頁是否為關鍵。如果為 true 且伺服器不支持分頁,則搜尋將不會返回結果。
cookie
伺服器發送的不透明結構 (ldap_control_paged_result_response())。
版本 | 說明 |
---|---|
8.0.0 | 此函式已被移除。 |
7.4.0 | 此函式已被棄用。 |
以下範例顯示如何擷取每頁一個項目的分頁搜尋的第一頁。
範例 #1 LDAP 分頁
<?php
// $ds 是一個有效的連結識別碼 (參見 ldap_connect)
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
$dn = 'ou=example,dc=org';
$filter = '(|(sn=Doe*)(givenname=John*))';
$justthese = array('ou', 'sn', 'givenname', 'mail');
// 啟用分頁,每頁大小為 1。
ldap_control_paged_result($ds, 1);
$sr = ldap_search($ds, $dn, $filter, $justthese);
$info = ldap_get_entries($ds, $sr);
echo $info['count'] . ' 個項目被返回' . PHP_EOL;
以下範例顯示如何擷取每頁 100 個項目的所有分頁結果。
範例 #2 LDAP 分頁
<?php
// $ds 是一個有效的連結識別符 (參見 ldap_connect)
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
$dn = 'ou=example,dc=org';
$filter = '(|(sn=Doe*)(givenname=John*))';
$justthese = array('ou', 'sn', 'givenname', 'mail');
// 啟用分頁,每頁 100 筆資料。
$pageSize = 100;
$cookie = '';
do {
ldap_control_paged_result($ds, $pageSize, true, $cookie);
$result = ldap_search($ds, $dn, $filter, $justthese);
$entries = ldap_get_entries($ds, $result);
foreach ($entries as $e) {
echo $e['dn'] . PHP_EOL;
}
ldap_control_paged_result_response($ds, $result, $cookie);
} while($cookie !== null && $cookie != '');
備註:
分頁控制是 LDAPv3 協定的功能。
如果您執行了分頁搜尋操作,並且想在 LDAP 上執行任何其他讀取操作,您需要重設它,否則您將會遇到 LDAP 錯誤(例如,代碼 12)。
<?php
…
ldap_control_paged_result($link, 0);
…
?>
雖然另一則筆記建議透過傳入 `0`(零)來重設分頁結果控制,但它實際上仍然會阻止在同一個請求期間執行任何進一步的查詢。
您實際上需要將其設定為一個較大的數字才能執行進一步的查詢。例如
<?php
ldap_control_paged_result($connection, 100, true, $cookie);
// 執行搜尋
...
// 理論上可行的做法(重設)
ldap_control_paged_result($connection, 0, false, $cookie);
// 實際可行的做法
ldap_control_paged_result($connection, 1000, false, $cookie);
?>
在上述方法中,1000 只是一個佔位符,但这似乎实际上会**限制**进一步的查询结果数量,因此如果您将其设置为 `1`,则在同一请求期间的任何进一步查询都只会收到**一个**结果。
我能夠成功地讓這些函數與 Active Directory 一起使用。 當我第一次嘗試時,ldap_search 一直從伺服器返回「不支援」的回覆。 我終於發現我需要包含
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
在我的程式碼中,以便 AD 允許我分頁結果。 請確保您使用的是相容的協定。
希望這則筆記能幫助其他人。
您可能需要在執行 ldap_control_paged_result 之前執行 ldap_bind 才能使其正常運作
$conn = ldap_connect("you_ip");
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_bind("your_connection_info");
ldap_control_paged_result($conn, $pageSize, true, $cookie)
在沒有執行 ldap_bind 的情況下,我一直收到「Critical extension is unavailable」的錯誤訊息。我不知道這是否是常識,但如果早知道這一點,就可以省下我好幾天的時間。
如 RFC 2696 中所述,分頁結果不允許超過伺服器的 sizeLimit。RFC 明確指出:「如果頁面大小大於或等於 sizeLimit 值,伺服器應忽略該控制項,因為請求可以在單頁中滿足。」
使用 OpenLDAP 時,透過分頁結果取得的項目數量不會超過 sizeLimit。