我一开始没有意识到 ldap_get_values 函数不适用于二进制数据——只适用于字符串。如果您使用 ldap_get_values 获取二进制数据,您不会收到警告——只会得到一些垃圾。对于二进制数据,您必须使用 ldap_get_values_len。
(PHP 4, PHP 5, PHP 7, PHP 8)
ldap_get_values — 获取结果条目中的所有值
读取结果中条目中属性的所有值。
此调用需要一个 entry
,因此需要在其中一个 ldap 搜索调用和其中一个获取单个条目的调用之前进行。
您的应用程序将被硬编码为查找某些属性(例如“surname”或“mail”),或者您必须使用 ldap_get_attributes() 调用来确定给定条目存在哪些属性。
如果成功,则返回属性值的数组,如果出错,则返回 false
。可以在结果数组中索引“count”找到值的个数。可以通过数组中的整数索引访问各个值。第一个索引是 0。
LDAP 允许一个属性有多个条目,因此它可以例如将一个人的目录条目的多个电子邮件地址都标记为属性“mail”存储起来。
return_value["count"] = number of values for attribute return_value[0] = first value of attribute return_value[i] = ith value of attribute
版本 | 描述 |
---|---|
8.1.0 | ldap 参数现在期望一个 LDAP\Connection 实例;以前,期望的是一个有效的 ldap link 资源。 |
8.1.0 | entry 参数现在期望一个 LDAP\ResultEntry 实例;以前,期望的是一个有效的 ldap result entry 资源。 |
范例 #1 列出目录条目中“mail”属性的所有值
<?php
// $ds 是一个有效的 LDAP\Connection 实例,用于目录服务器
// $sr 是先前对
// 其中一个 ldap 目录搜索调用进行的有效搜索结果
// $entry 是先前对
// 返回目录条目的其中一个调用进行的有效条目标识符
$values = ldap_get_values($ds, $entry, "mail");
echo $values["count"] . " 个此条目的电子邮件地址。<br />";
for ($i=0; $i < $values["count"]; $i++) {
echo $values[$i] . "<br />";
}
?>
我一开始没有意识到 ldap_get_values 函数不适用于二进制数据——只适用于字符串。如果您使用 ldap_get_values 获取二进制数据,您不会收到警告——只会得到一些垃圾。对于二进制数据,您必须使用 ldap_get_values_len。
我花了很长时间才找到问题,所以我会发布出来,以防其他人遇到同样的问题。
$sr = ldap_search($ds, "cn=me", "(objectclass=*)");
$entry = ldap_first_entry($ds, $sr);
do {
// 做其他事情
$sr = "现在是其他东西";
$values = ldap_get_values($ds, $entry, "attirib1");
// 做其他事情
} while ($entry = ldap_next_entry($ds, $entry));
如果您将搜索资源 $sr 更改为其他内容,即使它不再使用,它也会终止页面,它将是一个空白页面,如果您查看代码,您将获得不同的事情,具体取决于某些我不知道的东西。
这种情况一直在发生,我忘记了我使用了 $sr,所以我又使用了它,每当我使用 ldap_get_values 时,它就不会显示页面,如果这是一个特性,最好知道。我还没有看到它在其他函数中发生过。