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 分页。

参数

link

ldap_connect() 返回的 LDAP 资源。

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'] . ' entries returned' . 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 个注释

5
Blizzz
10 年前
如果您执行了分页搜索操作,并且想要对 LDAP 执行任何其他读取操作,则需要重置它,否则您将遇到 LDAP 错误(例如代码 12)。

<?php

ldap_control_paged_result
($link, 0);

?>
3
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,那么在同一个请求中的后续查询只会返回一个结果。
4
James
12 年前
我能够成功地使用这些函数与 Active Directory 进行交互。当我第一次尝试时,ldap_search 一直从服务器返回“不支持”的回复。最后我发现需要在代码中添加

ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);

这样 AD 才会让我分页显示结果。确保你使用的协议是兼容的。

希望这篇笔记能帮助到其他人。
1
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,我就会一直收到错误“关键扩展不可用”。我不确定这是否是常识,但知道这一点可以让我省去数日的沮丧。
1
dublue at gmail dot com
10 年前
那么如何对整个结果进行排序呢?似乎无法使用 ldap_sort,因为它使用的是循环中的搜索资源。
0
etienne at lamaisondebarbie dot ch
12 年前
RFC 2696 中指定的分页结果不允许超过服务器的 sizeLimit。RFC 明确指出“如果页面大小大于或等于 sizeLimit 值,服务器应该忽略控制,因为请求可以在单个页面中满足”。
使用 OpenLDAP,你将无法使用分页结果获取超过 sizeLimit 的条目数量。
To Top