正如标题所说,当我尝试使用ldap_sort()
方法时,它会返回deprecated method
为什么?有没有等价的?
也可以在过滤器中对A-Z进行排序吗?
答案 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中提供服务器端排序(不知道什么时候会到期),但这可能对您没有帮助,因为它取决于服务器功能。
所以获取结果,将它们添加到数组中并为该数组实现排序函数是最简单的事情,而且排序算法完全符合你想要!
答案 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));