[ 编辑注:段错误已修复,在 PHP 4.3.4 或 PHP 5.0.0 发布后不会再出现。但是,仍然需要转义特殊字符,如以下所述。]
如果您的 DN 包含 < 或 > 字符,您必须使用反斜杠对其进行转义,否则 ldap_explode_dn() 会返回 "参数数量错误" 的错误,甚至可能出现段错误。
例如,以下调用会导致 "参数数量错误" 或段错误
ldap_explode_dn( "cn=<bob>,dc=example,dc=com", 0 );
ldap_explode_dn( 'cn=<bob>,dc=example,dc=com', 0 );
但以下调用将成功
ldap_explode_dn( "cn=\<bob\>,dc=example,dc=com", 0 );
请注意,如上所述,< 和 > 使用十六进制代码进行转义。此函数是一个不错的包装器,它可以正确格式化所有 DN,并且可以安全地使用 < 和 > 字符以及 UTF-8 字符进行调用
function my_explode_dn( $dn, $with_attributes=0 )
{
$dn = addcslashes( $dn, "<>" );
$result = ldap_explode_dn( $dn, $with_attributes );
// 将十六进制代码转换回 ASCII
foreach( $result as $key => $value )
$result[$key] = preg_replace("/\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\1')).''", $value);
return $result;
}
我使用的是 php 4.3.1。祝您好运!