最佳实践是在 ldap_get_attributes() 的结果上使用 array_change_key_case(),这样你的程序就可以像 ldap 本身一样忽略属性名称中的大小写。(你不会希望 ldap_get_attributes _总是_ 扁平化大小写,因为你需要一种方法以漂亮的格式获取属性名称以便显示给用户。)
(PHP 4, PHP 5, PHP 7, PHP 8)
ldap_get_attributes — 从搜索结果条目中获取属性
读取搜索结果中条目的属性和值。
在目录中找到特定条目后,可以使用此调用来查找该条目中保存的信息。对于“浏览”目录条目和/或不知道目录条目结构的应用程序,可以使用此调用。在许多应用程序中,您将搜索特定的属性,例如电子邮件地址或姓氏,并且不关心保存的其他数据。
return_value["count"] = number of attributes in the entry return_value[0] = first attribute return_value[n] = nth attribute return_value["attribute"]["count"] = number of values for attribute return_value["attribute"][0] = first value of the attribute return_value["attribute"][i] = (i+1)th value of the attribute
返回一个包含完整条目信息的二维数组。
版本 | 描述 |
---|---|
8.1.0 | ldap 参数现在期望一个 LDAP\Connection 实例;以前,期望一个有效的 ldap link 资源。 |
8.1.0 | entry 参数现在期望一个 LDAP\ResultEntry 实例;以前,期望一个有效的 ldap result entry 资源。 |
示例 #1 显示特定目录条目中保存的属性列表
<?php
// $ds 是指向目录服务器的有效 LDAP\Connection 实例
// $sr 是先前对
// ldap 目录搜索调用的有效搜索结果
$entry = ldap_first_entry($ds, $sr);
$attrs = ldap_get_attributes($ds, $entry);
echo $attrs["count"] . " 个属性保存在此条目中:<p>";
for ($i=0; $i < $attrs["count"]; $i++) {
echo $attrs[$i] . "<br />";
}
?>
最佳实践是在 ldap_get_attributes() 的结果上使用 array_change_key_case(),这样你的程序就可以像 ldap 本身一样忽略属性名称中的大小写。(你不会希望 ldap_get_attributes _总是_ 扁平化大小写,因为你需要一种方法以漂亮的格式获取属性名称以便显示给用户。)
此函数创建的数组类似于 ldap_get_entries() 中的数组,但是当它创建数组键时,它会不一致地更改属性的大小写。
ldap_get_entries() 在使用属性作为数组键之前将其全部转换为小写,但是此函数似乎保留了原样。
如果您遇到问题,请执行 print_r 并确保您使用了正确的数组键大小写。例如,您可能需要使用 "objectClass" 而不是 "objectclass"。
从 PHP 4.0.5 开始,ldap_get_attributes 函数不适用于二进制数据。如果您要从 LDAP 服务器获取 JPEG,请改用 ldap_get_values_len。
请注意,ldap_get_attributes 从 LDAP 服务器获取属性和值。根据条目中存储的数据,以下代码的速度可能会快数十倍(甚至更好,但总体上更快),比示例 1 中的代码快。
<?php
// $ds 是目录的链接标识符
// $sr 是先前对
// ldap 目录搜索调用的有效搜索结果
$entry = ldap_first_entry($ds, $sr);
$attrs = array();
$attribute = ldap_first_attribute($ds,$entry,$identifier);
while ($attribute) {
$attrs[] = $attribute;
$attribute=ldap_next_attribute($ds,$entry,$identifier);
}
echo count($attrs) . "条属性保存在此条目中:<p>";
for ($i=0; $i<count($attrs); $i++) {
echo $attrs[$i] . "<br />";
}
?>
您可能需要使用“microtime”函数检查时间差。
用于从特定DN中的所有条目提取所有属性的代码和函数。也许不是时间效率最高的,但它有效。
$entry = ldap_first_entry($ds, $sr);
write_attr($entry,$ds);
for ($i = 0; $i < $n_entries; $i++){
$entry = ldap_next_entry($ds, $entry);
write_attr($entry,$ds);
}
function write_attr($entry,$ds){
$attrs = ldap_get_attributes ($ds, $entry);
for ($j = 0; $j < $attrs["count"]; $j++){
$attr_name = $attrs[$j];
$attrs["$attr_name"]["count"] . "\n";
for ($k = 0; $k < $attrs["$attr_name"]["count"]; $k++) {
echo ">>>>>>";
echo $attr_name.": ".$attrs["$attr_name"][$k]."\n";
}
}
}
我花了相当长的时间来思考如何读取操作属性,例如创建和修改时间戳。
这个函数解决了这个问题……
function get_entry_system_attrs( $ds, $dn, $deref=LDAP_DEREF_NEVER )
{
$conn = $ds;
$attrs = array( 'creatorsname', 'createtimestamp', 'modifiersname',
'structuralObjectClass', 'entryUUID', 'modifytimestamp',
'subschemaSubentry', 'hasSubordinates', '+' );
$search = @ldap_read( $conn, $dn, '(objectClass=*)', $attrs, 0, 0, 0, $deref );
if( ! $search )
return false;
$entry = ldap_first_entry( $conn, $search );
if( ! $entry)
return false;
$attrs = ldap_get_attributes( $conn, $entry );
if( ! $attrs )
return false;
if( ! isset( $attrs['count'] ) )
return false;
$count = $attrs['count'];
unset( $attrs['count'] );
$return_attrs = array();
for( $i=0; $i<$count; $i++ ) {
$attr_name = $attrs[$i];
unset( $attrs[$attr_name]['count'] );
$return_attrs[$attr_name] = $attrs[$attr_name];
}
return $return_attrs;
}