PHP Conference Japan 2024

ldap_read

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

ldap_read讀取項目

說明

ldap_read(
    LDAP\Connection|陣列 $ldap,
    陣列|字串 $base,
    陣列|字串 $filter,
    陣列 $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 實例的陣列,而不是單個實例。如果搜尋不應該都使用相同的 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

指定在搜尋期間應如何處理別名。可以是以下其中之一

控制項

LDAP 控制項的陣列,用於隨請求一起發送。

回傳值

傳回一個 LDAP\Result 實例、一個 LDAP\Result 實例的陣列,或是在失敗時傳回 false

更新日誌

版本 說明
8.1.0 ldap 參數現在需要一個 LDAP\Connection 實例;先前需要一個有效的 ldap link 資源
8.1.0 現在傳回一個 LDAP\Result 實例;先前傳回一個 資源
8.0.0 controls 現在可以為 null;先前預設為 []
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 用於這些函數的 client wrapper 的人,並且由於關於提取單個記錄與多個記錄等的完整週期的文件很爛。

對於這個
您必須在此函數調用後調用 ldap_get_entries。

並且請,如果您實現一個 wrapper,請使用初始項目對其進行初始化,否則在不返回容易看出成功結果的情況下執行它是沒有意義的。

當 query->execute() 並且您獲得一個集合時.. 確保集合中的項目欄位至少已初始化第一個項目.. 因為它看起來是空的而浪費了這麼多時間。

並且整個適配器需要通過 STL lib wrapper 包裝成一個較不遲鈍的使用模式,讓神秘主義(糟糕的設計)消失。
123.. 不是 4290234~"wds

感謝您的時間
sbarnum at mac dot com
23 年前
這與 ldap_search() 的不同之處在於它不會遞迴向下搜尋子項目。如果您知道要查找項目的 dn,並且只想獲取該項目的資訊,請使用 ldap_read() 並傳遞您想要項目的完整 dn。

由於您只搜尋一個項目,因此似乎您總是需要類似 objectclass=* 的過濾條件。
To Top