什么是不推荐使用的LDAP_sort()方法的替代品?

时间:2017-06-29 12:40:11

标签: php ldap

正如标题所说,当我尝试使用ldap_sort()方法时,它会返回deprecated method

为什么?有没有等价的?

也可以在过滤器中对A-Z进行排序吗?

3 个答案:

答案 0 :(得分:2)

您可以看到,按照PHP ldap_sort Documentation

  

对ldap_search()返回的LDAP搜索结果进行排序。

     

由于此函数对客户端返回的值进行排序   如果您达到,可能无法获得预期的结果   sizelimit服务器或在ldap_search()中定义的。

     

警告:自PHP 7.0.0起,此功能已被弃用。非常不鼓励依赖此功能。

另外,按照PHP Compatibility DeprecatedFunctionsSniff Doc in Github

    'ldap_sort' => array(
        '7.0' => false,
        'alternative' => null,
    ),
  

在这个测试用例中,它被编写为ldap_sort将从PHP弃用   7.0版本&它有alternative = NULL手段无替代

回答你的另一个问题

  

也可以在过滤器中对A-Z进行排序吗?

RFC 2891 LDAP Control Extension for Server Side Sorting of Search Results中定义的LDAP协议。如果实施此控件,您将必须检查您使用的LDAP实现(因为它没有标记在问题上)

答案 1 :(得分:2)

ldap_sort基于一个多年来已被弃用的C函数。由于ldap_sort通常不会做大多数人认为它做的事情,我们决定也弃用PHP函数。

特别是当使用userland-code也可以实现结果时。看一下https://github.com/zendframework/zend-ldap/blob/master/src/Collection/DefaultIterator.php#L379-L403,了解我们如何在zend-ldap中解决这个问题。您可以使用任何排序函数来获取您喜欢的排序,并且不受ldap_sort中实现的排序算法的约束,但没有人真正知道它是如何排序的。

当您使用用户土地功能进行排序时,您可以精确地实现特殊情况所需的排序。按多个属性排序,排序不区分大小写等。

另一种方法是使用服务器端排序

a)需要我们在PHP C代码中实现LDAP-COntrol(目前尚未完成) b)需要服务器实现

此功能目前在PHP中不可用,因为我们尚未设法完成该功能。这是更好的解决方案,但由于它不一定在服务器上可用,您可能仍希望在客户端进行排序。当您使用分页结果多次搜索时,您仍需要手动对结果进行排序。

所以ldap_sort因为原因而被弃用,但它仍然可用。它将在所有PHP 7.x分支中提供。但是你应该使用不同的排序解决方案。我们希望能够在PHP 8中提供服务器端排序(不知道什么时候会到期),但这可能对您没有帮助,因为它取决于服务器功能。

所以获取结果,将它们添加到数组中并为该数组实现排序函数是最简单的事情,而且排序算法完全符合想要!

免责声明:I'm the one that implemented the DEPRECATED-Warning

答案 2 :(得分:0)

$sr=ldap_search($test_ldap, $base, $filter, $attrs, 0, -1, -1, LDAP_DEREF_NEVER, [['oid' => LDAP_CONTROL_SORTREQUEST, 'value' => [['attr'=>'samaccountname']]]]);

将执行服务器端排序

当将此与分页搜索结果结合时,它看起来像这样:

$cookie = '';
do {
 $request_controls=[['oid' => LDAP_CONTROL_PAGEDRESULTS, 'value' => ['size' => 2, 'cookie' => $cookie]], ['oid' => LDAP_CONTROL_SORTREQUEST, 'value' => [['attr'=>'samaccountname']]]];
 $sr = ldap_search($ldap, $base, $filter, $attribs, 0, 0, 0, LDAP_DEREF_NEVER, $request_controls  );
 ldap_parse_result($ldap, $sr, $errcode , $matcheddn , $errmsg , $referrals, $response_controls);
 $results = ldap_get_entries($ldap, $sr);
 for ($i=0; $i<$results["count"]; $i++) {
  echo($results[$i]['samaccountname'][0]); echo('<br>');
 }
 if (isset($response_controls[LDAP_CONTROL_PAGEDRESULTS]['value']['cookie'])) {$cookie = $response_controls[LDAP_CONTROL_PAGEDRESULTS]['value']['cookie']; } else { $cookie = '';  }
} while (!empty($cookie));