控制PHP 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 != '');

这到底有什么作用?饼干是怎么回事?

我可以更换

$result  = ldap_search($ds, $dn, $filter, $justthese); 

带有

$result  = ldap_search($ds, $dn, $filter, $justthese,0,100);

这将与过滤器有关,并为我获取前100行。

现在的问题是如何成功地控制ldap分页。即给出要返回的结果的数量和我希望它们来自的页面。


更新

在上面的代码中,我已经运行了它,它所做的就是运行搜索,多次——在每次迭代中返回一个新页面,直到结束。看来饼干在某种程度上控制了这一点。

cookie保存一个内部指针(一个资源),指向当前返回的结果集部分。因此,为了让服务器知道在哪里继续,您必须提供指针作为参数。ThaT至少目前是这样,但有改变这种情况的想法。我必须做一些挖掘才能找到目前的状况。

将返回的项目数设置为100的第二个想法将一次又一次地返回相同的结果,因为它设置了服务器为每个请求返回的最大值数。

不过,你必须小心分类!目前只有ldap_sort(从PHP7开始就不推荐使用)在客户端对结果集进行排序。但是,由于分页是在服务器端完成的,并且目前没有办法进行服务器端排序(我们正在进行这项工作),结果将不是您所期望的。

对,我想答案是这样的。

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表操作结果(排序/分页)。每次搜索都会得到一组新的表结果。然后,您可以获得sql表的速度和排序/分页的好处,但插入操作会让您付出代价。

所以没有什么好的解决方案,只有一些可行的想法。希望它能帮助到别人。

最新更新