控制PHP ldap分页 - 结果数和页码

时间:2015-12-23 16:16:24

标签: php pagination active-directory ldap

嗨,这已经有点了,但希望我可以对这个问题有所了解。基本上我想使用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可以控制它。

2 个答案:

答案 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表的速度和它的排序/分页的好处,但插入将花费你。

所以没有很好的解决方案,只有一些有用的想法。 希望它可以帮到某人。