最佳实践是对 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"] . " attributes held for this entry:<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 中的代码快 12 倍(甚至更好,但总体上更快)
<?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) . " attributes held for this entry:<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;
}