根据 these 中的posts php.net manual,应该可以为ldap_search()
提供多个DN。
但是,我无法使下面的实现工作:
$dn[] = 'ou=Red,ou=Teams,ou=Users,dc=example,dc=org';
$dn[] = 'ou=Green,ou=Teams,ou=Users,dc=example,dc=org';
$dn[] = 'ou=Blue,ou=Teams,ou=Users,dc=example,dc=org';
$query = ldap_search($conn, $dn, $filter, $attrs);
当通过任何单个DN字符串时,一切都很好,但是提供数组会出错,并显示消息:'没有这样的对象'。
显而易见的解决方法是循环我的DN阵列以触发单独的查询并将所有内容推送到一个阵列。我想避免这样做,因为我在一个DN (Paginated - Example 2) 中带回了8000多个对象,而在另外两个DN中带回了大约300个。
实际上是否可以搜索多个DN? 也许是单个DN字符串中的特殊语法(符号/字符)?
答案 0 :(得分:3)
搜索请求必须至少包含以下参数:
base
是基础对象本身,one
是基础对象,
在基础对象下一级,sub
是基础对象,基础对象下面的所有条目。也可以提供属性列表,但很多(但不是全部)LDAP API都会请求所有属性 用户属性,如果搜索请求中没有提供。
在列出的案例中,将基础对象设置为ou=users,dc=example,dc=com
并使用适当的对象
过滤。如果LDAP客户端必须将返回的条目限制为从属条目
到ou=red
,ou=green
或ou=blue
可以使用复合可扩展匹配过滤器
像(&(objectClass=inetOrgPerson)(|(ou:dn:=red)(ou:dn:=green)(ou:dn:=blue)))
一样 - 使用正确的对象
如果数据不使用inetOrgPerson
,则为class。所有符合LDAP的服务器都支持可扩展
匹配过滤器,但不合规的服务器可能不支持此标准过滤器。
无法使用多个基础对象,scope
参数定义了多少个从属对象
在基础对象下面检查等级(如果有的话)。
答案 1 :(得分:2)
您是否在manual中看到了这一点?
这些数组必须与链接标识符数组的大小相同,因为数组的第一个条目用于一次搜索,第二个条目用于另一个,依此类推。
基本上,您的$conn
变量需要是一个等于$dn
数组大小的连接数组。
如果$dn
数组中有3个元素,则$conn
数组中需要3个元素:
$ds = ldap_connect($ldapserver);
$dn[] = 'ou=Red,ou=Teams,ou=Users,dc=example,dc=org';
$dn[] = 'ou=Green,ou=Teams,ou=Users,dc=example,dc=org';
$dn[] = 'ou=Blue,ou=Teams,ou=Users,dc=example,dc=org';
// Match connection elements to count of dn elements
for($x=0, $x < count($dn), $x++)
{
$conn[] = $ds;
}
$query = ldap_search($conn, $dn, $filter, $attrs);