ldap_read

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_read读取条目

描述

ldap_read(
    LDAP\Connection|array $ldap,
    array|string $base,
    array|string $filter,
    array $attributes = [],
    int $attributes_only = 0,
    int $sizelimit = -1,
    int $timelimit = -1,
    int $deref = LDAP_DEREF_NEVER,
    ?array $controls = null
): LDAP\Result|array|false

使用范围 LDAP_SCOPE_BASE 对目录执行指定 filter 的搜索。因此它等同于从目录读取条目。

也可以执行并行搜索。在这种情况下,第一个参数应该是 LDAP\Connection 实例的数组,而不是单个实例。如果搜索不应都使用相同的基 DN 和过滤器,则可以将基 DN 的数组和/或过滤器的数组作为参数传递。这些数组的大小必须与 LDAP\Connection 实例数组的大小相同,因为数组的第一个条目用于一个搜索,第二个条目用于另一个搜索,依此类推。在执行并行搜索时,将返回 LDAP\Result 实例的数组,除非发生错误,在这种情况下返回值将是 false

参数

ldap

一个 LDAP\Connection 实例,由 ldap_connect() 返回。

base

目录的基 DN。

filter

不允许使用空过滤器。如果你想检索该条目的所有信息,请使用 objectClass=* 的过滤器。如果你知道目录服务器上使用了哪些条目类型,你可能会使用适当的过滤器,例如 objectClass=inetOrgPerson

attributes

所需属性的数组,例如 array("mail", "sn", "cn")。请注意,无论请求哪些属性类型,都会始终返回 "dn"。

使用此参数比默认操作(返回所有属性及其关联的值)效率更高。因此,应将使用此参数视为最佳实践。

attributes_only

如果只需要属性类型,则应将其设置为 1。如果设置为 0,则同时获取属性类型和属性值,这是默认行为。

sizelimit

使你能够限制获取的条目数量。将其设置为 0 表示没有限制。

注意:

此参数不能覆盖服务器端预设的 sizelimit。但你可以将其设置得更低。

某些目录服务器主机将配置为最多返回预设数量的条目。如果发生这种情况,服务器将指示它只返回了部分结果集。如果你使用此参数限制获取的条目数量,也会发生这种情况。

timelimit

设置搜索花费的时间(秒)。将其设置为 0 表示没有限制。

注意:

此参数不能覆盖服务器端预设的 timelimit。但你可以将其设置得更低。

deref

指定搜索期间应如何处理别名。它可以是以下之一

controls

要与请求一起发送的 LDAP 控制 的数组。

返回值

返回一个 LDAP\Result 实例、一个 LDAP\Result 实例的数组,或在失败时返回 false

变更日志

版本 描述
8.1.0 ldap 参数现在需要一个 LDAP\Connection 实例;之前,需要一个有效的 ldap link 资源
8.1.0 现在返回一个 LDAP\Result 实例;之前,返回一个 资源
8.0.0 controls 现在是可空的;之前,它默认为 []
4.0.5 添加了并行搜索支持。有关详细信息,请参阅 ldap_search()
7.3.0 添加了对 controls 的支持

添加注释

用户贡献的注释 6 个注释

12
cnicholl at yahoo dot com
18 年前
ldap_read 命令语法的说明

如果你只想从对象中提取某些属性,并且你已经知道它的 dn,那么 ldap_read 命令可以做到这一点,如下所示。它比 ldap_search 的开销更低。

通常用于设置递归 ldap_search 的顶部上下文的字符串 base_dn 在此命令中使用方式略有不同。它用于指定具有完整 dn 的实际对象。(希望这能省去其他人尝试此命令的几个小时。)

<?php
$ds
= ldap.myserver.com // 你的 ldap 服务器
$dn = "cn=username,o=My Company, c=US"; // 对象本身,而不是像 ldap_search 中那样作为顶部搜索级别
$filter="(objectclass=*)"; // 此命令需要一些过滤器
$justthese = array("ou", "sn", "givenname", "mail"); // 要提取的属性,如果这样做,这比提取所有属性效率高得多
$sr=ldap_read($ds, $dn, $filter, $justthese);
$entry = ldap_get_entries($ds, $sr);

echo
$entry[0]["mail"][0] . "是您请求的 cn 的电子邮件地址";
echo
$entry[0]["sn"][0] . "是您请求的 cn 的 sn";
ldap_close($ds);
?>

例如,这将打印出指定用户的邮件和姓氏。
3
ronny at nxc dot no
11 年前
attributes 参数中的数组需要是一个索引数组,其键为数字,并按升序排列。像这样

数组
(
[0] => this
[1] => is
[2] => a
[3] => test
)

如果数组中缺少键,则不会返回任何结果。这将不起作用

数组
(
[0] => this
[1] => is
[3] => test
)
5
me at example dot com
16 年前
在前面的例子中

$ds = ldap.myserver.com // 你的 ldap 服务器

应该

$ds = ldap_connect( "ldap.myserver.com" ) ; // 你的 ldap 服务器
0
ehalls at gmail dot com
6 年前
对于那些调试包装器的人,类似于 Symfony 为这些函数提供的客户端包装器,并且由于关于拉取单个记录与多个记录等的完整周期的文档很糟糕。

对于这个
你必须在这个函数调用后调用 ldap_get_entries。

并且请注意,如果你实现了一个包装器,用初始条目对其进行初始化,否则在不返回任何可以轻松识别为成功的东西的情况下执行就没有意义了。

当 query->execute() 并且你得到一个集合时,确保集合中的 entry 字段至少包含已初始化的第一个条目,因为浪费了太多时间,因为它是空的。

并且整个适配器需要用一个不太愚蠢的用法模式通过 STL 库包装器来包装,神秘主义(糟糕的设计)消失。
123.. 不是 4290234~"wds

感谢你的时间
0
sbarnum at mac dot com
23 年前
这与 ldap_search() 不同,因为它不会递归到子条目。如果你知道要查找的项目的 dn,并且只想要该条目上的信息,请使用 ldap_read() 并将要查找的项目的完整 dn 传递给它。

它似乎也表明你总是想要类似于 objectclass=* 的过滤器,因为你只在一个条目上搜索。
-22
guillaumeinnov24 at gmail dot com
9 年前
不幸的是,userPasswords 似乎无法使用 ldap_read() 检索;
To Top