PHP Conference Japan 2024

ldap_read

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

ldap_read读取条目

描述

ldap_read(
    LDAP\Connection|数组 $ldap,
    数组|字符串 $base,
    数组|字符串 $filter,
    数组 $attributes = [],
    整数 $attributes_only = 0,
    整数 $sizelimit = -1,
    整数 $timelimit = -1,
    整数 $deref = LDAP_DEREF_NEVER,
    ?数组 $controls = null
): LDAP\Result|数组|false

使用范围为 LDAP_SCOPE_BASE 在目录中针对指定的 filter 执行搜索。因此,它等效于从目录中读取条目。

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

参数

ldap

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

base

目录的 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 现在可以为空;以前,它默认为 []
7.3.0 添加了对 controls 的支持

添加注释

用户贡献的注释 5 条注释

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);
?>

例如,这将打印出指定用户的邮件和姓氏。
me at example dot com
17年前
在之前的例子中

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

应该改为

$ds = ldap_connect( "ldap.myserver.com" ) ; // 你的LDAP服务器
ronny at nxc dot no
11年前
属性参数中的数组需要是一个索引数组,其键为升序的数字。例如:

数组
(
[0] => 这
[1] => 是
[2] => 一
[3] => 个
)

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

数组
(
[0] => 这
[1] => 是
[3] => 个
)
ehalls at gmail dot com
6年前
对于那些调试包装器的人,类似于symfony的这些函数的客户端包装器,并且由于关于拉取单个记录与多个记录等完整周期的文档很糟糕。

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

并且请注意,如果你实现了一个包装器,请用初始条目对其进行初始化,否则在不返回易于识别为成功的某些内容的情况下执行是没有意义的。

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

并且整个适配器需要通过STL库包装器进行包装,以获得更不易出错的使用模式,神秘性(糟糕的设计)消失。
123.. 不是4290234~"wds

感谢你的时间
sbarnum at mac dot com
23年前
这与ldap_search()的不同之处在于它不会递归到子条目。如果你知道要查找的项目的DN,并且只想获取该条目的信息,请使用ldap_read()并传递你想要项目的完整DN。

似乎你总是需要类似于objectclass=*的过滤器,因为你只在一个条目上搜索。
To Top