PHP Conference Japan 2024

ldap_control_paged_result

(PHP 5 >= 5.4.0, PHP 7)

ldap_control_paged_result傳送 LDAP 分頁控制

警告

此函式已於 PHP 7.4.0 中_棄用_,並於 PHP 8.0.0 中_移除_。 應改用 ldap_search()controls 參數。 詳情請參閱 LDAP 控制

說明

ldap_control_paged_result(
    資源 $link,
    整數 $pagesize,
    布林值 $iscritical = false,
    字串 $cookie = ""
): 布林值

透過傳送分頁控制(頁面大小、cookie 等)來啟用 LDAP 分頁。

參數

連結

一個 LDAP 資源,由 ldap_connect() 返回。

pagesize

每頁的項目數。

iscritical

指示分頁是否為關鍵。如果為 true 且伺服器不支持分頁,則搜尋將不會返回結果。

cookie

伺服器發送的不透明結構 (ldap_control_paged_result_response())。

返回值

成功時返回 true,失敗時返回 false

更新日誌

版本 說明
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 協定的功能。

新增筆記

使用者貢獻的筆記 6 則筆記

Blizzz
11 年前
如果您執行了分頁搜尋操作,並且想在 LDAP 上執行任何其他讀取操作,您需要重設它,否則您將會遇到 LDAP 錯誤(例如,代碼 12)。

<?php

ldap_control_paged_result
($link, 0);

?>
steven_bauman at outlook dot com
8 年前
雖然另一則筆記建議透過傳入 `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`,则在同一请求期间的任何进一步查询都只会收到**一个**结果。
James
12 年前
我能夠成功地讓這些函數與 Active Directory 一起使用。 當我第一次嘗試時,ldap_search 一直從伺服器返回「不支援」的回覆。 我終於發現我需要包含

ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);

在我的程式碼中,以便 AD 允許我分頁結果。 請確保您使用的是相容的協定。

希望這則筆記能幫助其他人。
jestertrance at hotmail dot com
11 年前
您可能需要在執行 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」的錯誤訊息。我不知道這是否是常識,但如果早知道這一點,就可以省下我好幾天的時間。
dublue at gmail dot com
10 年前
那麼,現在要如何排序整個結果呢?看起來無法使用 ldap_sort,因為它使用的是迴圈內的搜尋資源。
etienne at lamaisondebarbie dot ch
12 年前
如 RFC 2696 中所述,分頁結果不允許超過伺服器的 sizeLimit。RFC 明確指出:「如果頁面大小大於或等於 sizeLimit 值,伺服器應忽略該控制項,因為請求可以在單頁中滿足。」
使用 OpenLDAP 時,透過分頁結果取得的項目數量不會超過 sizeLimit。
To Top