如果您执行了分页搜索操作,并且想要对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 分页。
link
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的情况下,我一直收到“关键扩展不可用”的错误。我不知道这是否是常识,但知道这一点可以节省我几天的时间。
如RFC 2696中所述,分页结果不允许超过服务器的sizeLimit。RFC明确指出“如果页面大小大于或等于sizeLimit值,则服务器应忽略该控制,因为请求可以在单个页面中得到满足”。
使用OpenLDAP,您将无法使用分页结果获取超过sizeLimit数量的条目。