[ 编辑注:段错误已修复,在 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。祝你好运!