嗨,这已经有点了,但希望我可以对这个问题有所了解。基本上我想使用ldap在我的活动目录中进行搜索并对结果进行分页。
我见过这样的代码,但对我没有任何意义
// $ds is a valid link identifier (see 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');
// enable pagination with a page size of 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 != '');
这实际上是做什么的?什么是cookie?
我可以替换
$result = ldap_search($ds, $dn, $filter, $justthese);
与
$result = ldap_search($ds, $dn, $filter, $justthese,0,100);
哪个可以使用过滤器并获取前100行。
手头的问题是如何成功控制ldap分页。即给出要返回的结果数和我想要的页面。
更新
对于上面的代码,我给它一个运行,它做的是运行搜索,几次 - 在每次迭代中返回一个新页面直到结束。因此,似乎cookie可以控制它。
答案 0 :(得分:2)
cookie包含一个内部指针(一个ressource)到结果集的当前返回部分。因此,要让服务器知道在哪里继续,您必须将指针作为参数提供。 ThaT至少目前是这种情况,但有想改变这种情况。我不得不做一些挖掘来找到当前的状态。
将返回项目数设置为100的第二个想法将一遍又一遍地返回相同的结果,因为它设置了服务器为每个请求返回的最大值数。
你必须小心排序!目前只有ldap_sort(从PHP 7开始不推荐使用),它在客户端上对结果集进行排序。但是由于分页是在服务器端进行的,并且目前无法进行服务器分类(我们正在研究),结果将不是您所期望的。
答案 1 :(得分:1)
是的,我认为答案就是这样。
a)$cookie
参数是搜索和分页的内部事情,您无法编辑/控制(或者至少我无法找到)。
b)使用上述代码的原因是您的服务器对ldap可以返回的用户数量有一些限制。
c)如果你使用上面的代码,你可能想要搜索,你就不能使用ldap_sort
,因为这只是对每一页进行排序。
d)因此,这会引导您创建一个数组,然后使用php函数(例如asort
)对数组进行排序,然后使用array_splice
所以ldap分页的解决方案是使用像这样的代码
$filter = "(&(displayName=*".ldap_escape('r')."*)(samaccountname=*)(givenname=*)(sn=*)(lastlogontimestamp=*))";
$justthese = array('ou', 'sn', 'givenname', 'mail');
$sr = ldap_search($conn['connect'], $conn['base_dn'], $filter, $justthese);
ldap_sort ( $conn['connect'], $sr, 'givenname' ) ;
$info = ldap_get_entries($conn['connect'], $sr);
$offset = $page_number*$number;
$length = $number;
unset($info['count']);
$info = array_slice ($info, $offset ,$length);
echo '<pre>';
print_r($info);
echo '</pre>';
ldap_sort还有一件事,看起来有点垃圾,因为它的区分大小写。我想你可以在得到结果之后自己写,如果不是你的一杯茶。 更新 - 如果有很多结果,这是不可行的,也可以使用像array_reverse
这样的顺序最好的顺序所以他们你去,不是很好,但可行。尝试改进的其他解决方案是当搜索发生查询ldap时,将结果存储在sql表中。让用户使用sql表操作结果(sort / pagination)。每次搜索都会获得一组新的结果。然后你得到sql表的速度和它的排序/分页的好处,但插入将花费你。
所以没有很好的解决方案,只有一些有用的想法。 希望它可以帮到某人。