LDAP 分頁需要 3.0 以上的協定版本。如果 LDAP_CONTROL_PAGEDRESULTS LDAP 控制項無法正常運作,請嘗試在綁定之前設定 LDAP 協定版本。
<?php
$ldapconn = ldap_connect($ldapuri) or die("LDAP-URI 無法解析");
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
?>
以下是在 PHP >= 7.3.0 中使用 LDAP 控制項的一些範例。
範例 #1 使用策略資訊進行綁定
<?php
$user = 'cn=admin,dc=example,dc=com';
$passwd = 'adminpassword';
$ds = ldap_connect('ldap://127.0.0.1');
if ($ds) {
$r = ldap_bind_ext($ds, $user, $passwd, [['oid' => LDAP_CONTROL_PASSWORDPOLICYREQUEST]]);
if (ldap_parse_result($ds, $r, $errcode, $matcheddn, $errmsg, $referrals, $ctrls)) {
if ($errcode != 0) {
die("錯誤: $errmsg ($errcode)");
}
if (isset($ctrls[LDAP_CONTROL_PASSWORDPOLICYRESPONSE])) {
$value = $ctrls[LDAP_CONTROL_PASSWORDPOLICYRESPONSE]['value'];
echo "密碼到期時間: ".$value['expire']." 秒\n";
echo "剩餘驗證次數: ".$value['grace']."\n";
if (isset($value['error'])) {
echo "密碼策略錯誤碼: ".$value['error'];
}
}
}
} else {
die("無法連線到 LDAP 伺服器");
}
?>
範例 #2 僅在描述不為空時修改描述
<?php
// $link 為 LDAP 連線
$result = ldap_mod_replace_ext(
$link,
'o=test,dc=example,dc=com',
['description' => 'New description'],
[
[
'oid' => LDAP_CONTROL_ASSERT,
'iscritical' => TRUE,
'value' => ['filter' => '(!(description=*))']
]
]
);
// 接著使用 ldap_parse_result
?>
範例 #3 刪除前讀取一些值
<?php
// $link 為 LDAP 連線
$result = ldap_delete_ext(
$link,
'o=test,dc=example,dc=com',
[
[
'oid' => LDAP_CONTROL_PRE_READ,
'iscritical' => TRUE,
'value' => ['attrs' => ['o', 'description']]
]
]
);
// 接著使用 ldap_parse_result
?>
範例 #4 刪除一個參考
<?php
// $link 為 LDAP 連線
// 沒有控制項的話,它會刪除被參考的節點
// 務必將控制項設定為關鍵,以避免這種情況
$result = ldap_delete_ext(
$link,
'cn=reference,dc=example,dc=com',
[['oid' => LDAP_CONTROL_MANAGEDSAIT, 'iscritical' => TRUE]]
);
// 接著使用 ldap_parse_result
?>
範例 #5 使用分頁搜尋
<?php
// $link 為 LDAP 連線
$cookie = '';
do {
$result = ldap_search(
$link, 'dc=example,dc=base', '(cn=*)', ['cn'], 0, 0, 0, LDAP_DEREF_NEVER,
[['oid' => LDAP_CONTROL_PAGEDRESULTS, 'value' => ['size' => 2, 'cookie' => $cookie]]]
);
ldap_parse_result($link, $result, $errcode , $matcheddn , $errmsg , $referrals, $controls);
// 為簡化範例,錯誤處理未在此示範
$entries = ldap_get_entries($link, $result);
foreach ($entries as $entry) {
echo "cn: ".$entry['cn'][0]."\n";
}
if (isset($controls[LDAP_CONTROL_PAGEDRESULTS]['value']['cookie'])) {
// 必須將上次呼叫的 cookie 傳遞到下一次呼叫
$cookie = $controls[LDAP_CONTROL_PAGEDRESULTS]['value']['cookie'];
} else {
$cookie = '';
}
// 空 cookie 表示最後一頁
} while (strlen($cookie) > 0);
?>