精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● PHP>>功能代码>>邮件相关>>使用PHP连接LDAP服务器(三)

主题:使用PHP连接LDAP服务器(三)
发信人: link_wb(火柴天堂)
整理人: dalasthunder(2002-07-25 06:30:13), 站内信件
格式化输出 

  在执行完LDAP搜索后,返回的数据是以查找的顺序排列的。不过我们在排序时没有SQL这样方便,使用ORDER BY语句就可以了。通常多数公共的LDAP目录都没有标准的大小规范。排序是基于字符的ASCII值,我们必须将字符全部格式化为小写,以便按字母的顺序输出。 

  要特别注意的是,返回的LDAP结果集是一个多维的数组。因此,我们脚本中的$result_array的结构如下: 

$result_array[0]["cn"] [0] = "Dannie Stanley" 
["dn"] [0] = "uid=dannie,dc=spinweb.net" 
["givenname"][0] = "Dannie" 
["sn"] [0] = "Stanley" 
["mail"] [0] = "[email protected]
$result_array[1]["cn"] [0] = "Michael Reynolds" 
["dn"] [0] = "uid=michael,dc=spinweb.net" 
["givenname"][0] = "Michael" 
["sn"] [0] = "Reynolds" 
["mail"] [0] = "[email protected]"  

  数据以这种格式存放的原因是每个属性都可能有超过一个值(象树的结构)。例如,如果我的名字是‘Dannie’,我还可以在LDAP中增加一些属性,例如: 

$result_array[0]["cn"] [0] = "Dannie Stanley" 
["dn"] [0] = "uid=dannie,dc=spinweb.net" 
["givenname"][0] = "Dannie" 
["givenname"][0] = "Dan" 
["sn"] [0] = "Stanley" 
["mail"] [0] = "[email protected]

  在我们的搜索中,我们只关心每个属性的首个值,因此除了dn只有一个值外,其它我们只使用每个属性中序号为0的值。以下就是属性和它们含义的简单列表: 

"cn" = Common Name 
"dn" = Distinguished Name 
"givenname" = First Name 
"sn" = Last Name 
"mail" = Email地址 


<?php  

//如果搜索成功,将结果排序  
if($result_array)  
{  
for($i=0; $i {  
$format_array[$i][0] = strtolower($result_array[$i]["cn"][0]);  
$format_array[$i][1] = $result_array[$i]["dn"];  
$format_array[$i][2] = strtolower($result_array[$i]["givenname"][0]);  
$format_array[$i][3] = strtolower($result_array[$i]["sn"][0]);  
$format_array[$i][4] = strtolower($result_array[$i]["mail"][0]);  
}  

//排序数组  
sort($format_array, "SORT_STRING");  

for($i=0; $i {  
$cn = $format_array[$i][0];  
$dn = $format_array[$i][1];  
$fname = ucwords($format_array[$i][2]);  
$lname = ucwords($format_array[$i][3]);  
$email = $format_array[$i][4];  

if($dn && $fname && $lname && $email)  
{  
$result_list .= "$fname $lname";  
$result_list .= " <$email> 
n";  
}  
elseif($dn && $cn && $email)  
{  
$result_list .= "<A href='/"ldap://$LDAP_SERVER[$SERVER_ID]/$dn/"'>$cn</A>";  
$result_list .= " <A href='/"mailto:$email/"'>$email</A> 
n";  
}  
}  
}  
else  
{  
echo "Result set empty for query: $ldap_query";  
}  


?>  

  在我们的例子中,$format_array是我们建立的新数组,里面包括有查询的结果,并且被格式化用作输出。首先循环$result_array中的每个元素,并且将它分配给一个两维的数组用作排序。同时我们使用strtolower()函数将所有的值变为小写。 

  接着,我们使用PHP自带的一个称为sort()的函数进行排序。首个参数是要排序的数组,另一个是要执行的排序类型,该类型是由PHP的文档定义的。由于我们根据字符串排序,我们使用“SORT_STRING”。 

  第三,我们循环已经格式化好的数组,并且将它分配给一个名字为$result_list的输出字符,该字符包含了HTML描述。要特别注意的是,在超链接中,我使用的是ldap的URL格式。这个格式的例子类似:HREF="ldap://ldap.domain.net/uid=dannie,dc=domain.net"。 

关闭连接 

  现在我们所有的数据已经包含在$result_list中了,我们可以安全地关闭LDAP的连接。 

<?php  

//关闭连接 
ldap_close($connect_id);  

[关闭][返回]