如何用PHP正确修改LDAP中的Generalized Time属性?
解决PHP中LDAP Generalized Time类型字段修改的无效语法问题
你遇到的核心问题是LDAP的Generalized Time类型有严格的格式要求,你当前的写法要么格式不符合规范,要么因为PHP的数值运算破坏了正确格式,导致ldap_modify()返回无效语法错误。下面一步步给你解决:
先明确正确的Generalized Time格式
LDAP定义的Generalized Time有两种合法格式:
- UTC时区格式:
YYYYMMDDHHMMSSZ(末尾必须加Z表示UTC时间) - 带时区偏移的格式:
YYYYMMDDHHMMSS±HHMM(比如东1区写+0100,西5区写-0500,注意是完整字符串,不能拆成数字运算)
你的代码里20180307155845+0100被当成了数值计算,结果变成了20180307155845100,完全不符合格式要求,这是关键错误。
修改后的正确代码示例
<?php $ds = ldap_connect(/*hostname*/); ldap_bind($ds, /*binddn*/, /*bindpw*/); // 建议用常量代替数字3,可读性更强,3对应LDAPv3协议 ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3); $new = array(); // 方式1:直接写符合规范的UTC格式字符串 $new["expirationDate"] = "20180307145845Z"; // 方式2:带时区偏移的字符串(必须用引号包裹,不能做数字运算) // $new["expirationDate"] = "20180307155845+0100"; $modify = ldap_modify($ds, /*dn of the object*/, $new); if(!$modify) { echo ldap_error($ds); } ?>
用PHP DateTime类自动生成合规格式
如果需要动态生成时间,推荐用DateTime类来避免手动拼接出错:
// 生成带时区偏移的格式 $date = new DateTime('2018-03-07 15:58:45', new DateTimeZone('Europe/Paris')); $generalizedTime = $date->format('YmdHisO'); // 输出:20180307155845+0100 // 或者生成UTC的Z格式 $date->setTimezone(new DateTimeZone('UTC')); $generalizedTimeUtc = $date->format('YmdHis\Z'); // 输出:20180307145845Z $new["expirationDate"] = $generalizedTime;
关键注意事项
- 必须确保传递给
ldap_modify的是字符串类型,绝对不能是数值,否则PHP会自动转换格式破坏LDAP要求的结构 - 不要省略时间部分,
20180121这种仅日期的格式不符合Generalized Time的完整定义 - 时区偏移的符号和数字必须连在一起,不能有空格
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

