如何在LDAP中筛选出职位为Manager的第一条记录?
如何修改LDAP代码获取职位为Manager的第一条记录
有两种可行的修改方式,优先推荐第一种,因为能减少LDAP服务器返回的数据量,提升查询效率:
方法一:在LDAP查询阶段直接过滤(推荐)
直接修改LDAP的搜索过滤器,让服务器只返回职位头衔为Manager的记录,拿到结果后直接取第一条即可,无需遍历所有记录。
修改步骤:
- 调整
$search_filter,加入职位过滤条件。假设你原本的过滤器是类似"(objectClass=person)",修改为:
$search_filter = "(&(objectClass=person)(title=Manager))";
如果原本有其他过滤条件,用&将(title=Manager)和原有条件组合即可。
- 简化后续处理代码,直接提取第一条符合条件的记录:
$result = ldap_search($ldap_connection, $ldap_base_dn, $search_filter); $targetEntry = null; if (FALSE !== $result){ $entries = ldap_get_entries($ldap_connection, $result); // 检查是否存在符合条件的记录 if ($entries["count"] > 0) { $entry = $entries[0]; // 处理姓氏 $LDAP_FullName = ""; if (!empty($entry["cn"][0]) && $entry["cn"][0] !== "NULL") { $LDAP_FullName = $entry["cn"][0]; } // 处理职位头衔(此处必然是Manager,可选确认) $LDAP_JobTitle = ""; if (!empty($entry["title"][0]) && $entry["title"][0] !== "NULL") { $LDAP_JobTitle = $entry["title"][0]; } $targetEntry = [ "fullName" => $LDAP_FullName, "jobTitle" => $LDAP_JobTitle ]; } } // 后续可直接使用$targetEntry变量
方法二:在本地循环中筛选并终止遍历
如果无法修改LDAP搜索过滤器,就在遍历记录时检查职位头衔,找到第一条Manager后立即终止循环:
$result = ldap_search($ldap_connection, $ldap_base_dn, $search_filter); $targetEntry = null; if (FALSE !== $result){ $entries = ldap_get_entries($ldap_connection, $result); for ($x=0; $x<$entries["count"]; $x++){ // 处理职位头衔 $LDAP_JobTitle = ""; if (!empty($entries[$x]["title"][0]) && $entries[$x]["title"][0] !== "NULL") { $LDAP_JobTitle = $entries[$x]["title"][0]; } // 检查是否为Manager,是则处理并终止循环 if ($LDAP_JobTitle === "Manager") { // 处理姓氏 $LDAP_FullName = ""; if (!empty($entries[$x]["cn"][0]) && $entries[$x]["cn"][0] !== "NULL") { $LDAP_FullName = $entries[$x]["cn"][0]; } $targetEntry = [ "fullName" => $LDAP_FullName, "jobTitle" => $LDAP_JobTitle ]; // 找到第一条后跳出循环,停止后续遍历 break; } } } // 后续可直接使用$targetEntry变量
另外,原代码中判断== "NULL"的逻辑可以优化为!== "NULL",结合!empty一起判断,减少冗余步骤。
内容的提问来源于stack exchange,提问作者i3zzZu
相关产品推荐
相关产品推荐

