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

参数

link

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的情况下,我一直收到“关键扩展不可用”的错误。我不知道这是否是常识,但知道这一点可以节省我几天的时间。
dublue at gmail dot com
10年前
那么您现在如何对整个结果进行排序呢?看起来您无法使用ldap_sort,因为它使用了循环中的搜索资源。
etienne at lamaisondebarbie dot ch
12年前
如RFC 2696中所述,分页结果不允许超过服务器的sizeLimit。RFC明确指出“如果页面大小大于或等于sizeLimit值,则服务器应忽略该控制,因为请求可以在单个页面中得到满足”。
使用OpenLDAP,您将无法使用分页结果获取超过sizeLimit数量的条目。
To Top