Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : LDAP Functions : ldap_explode_dn

ldap_explode_dn

Splits DN into its component parts (PHP 4, PHP 5)
array ldap_explode_dn ( string dn, int with_attrib )


Code Examples / Notes » ldap_explode_dn

davidsmith

[ Editor's Note: The segfault has been fixed and will not occur in PHP 4.3.4 or PHP 5.0.0 when they are released.  However, it is still important to escape special characters as detailed below. ]
If your DN contains < or > characters, you must escape them with a backslash or ldap_explode_dn() will give you a "wrong parameter count" error or even a segmentation fault.
For example, these calls will fail with a "wrong parameter count" or a seg fault:
 ldap_explode_dn( "cn=<bob>,dc=example,dc=com", 0 );
 ldap_explode_dn( 'cn=<bob>,dc=example,dc=com', 0 );
But this will succeed
 ldap_explode_dn( "cn=\<bob\>,dc=example,dc=com", 0 );
Notice also that the < and > are escaped with hex codes as noted above. This function is a nice wrapper that properly formats all DNs and can safely be called with < and > characters, and UTF-8 characters:
function my_explode_dn( $dn, $with_attributes=0 )
{
       $dn = addcslashes( $dn, "<>" );
       $result = ldap_explode_dn( $dn, $with_attributes );
       //translate hex code into ascii again
       foreach( $result as $key => $value )
               $result[$key] = preg_replace("/\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\1')).''", $value);
       return $result;
}
I am using php 4.3.1. Good luck!


gabriel

Keep attention on UTF8 encoded DNs. Since openLDAP >=2.1.2
ldap_explode_dn turns unprintable chars (in the ASCII sense, UTF8
encoded) into \<hexcode>.
Example:
$dn="ou=Universität ,c=DE";
var_dump(ldap_explode_dn($dn,0));
//returns
array(3) {
 ["count"]=>
 int(2)
 [0]=>
 string(19) "ou=Universit\C3\A4t"
 [1]=>
 string(4) "c=DE"
}
Unfortunately, PHP don't support the ldap functions ldap_str2dn and
ldap_dn2str, but by means of preg_replace a workaround is possible to
recover the old behaviour of ldap_explode_dn
// workaround
function myldap_explode_dn($dn,$with_attribute){
$result=ldap_explode_dn ($dn, $with_attrib);
//translate hex code into ascii again
   foreach($result as $key=>$value){
         $result[$key]=preg_replace("/\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\1')).''", $value);
   }
   return($result);
}
//
//then follows for the example
$dn="ou=Universität ,c=DE";
var_dump(myldap_explode_dn($dn,0));
//returns
array(3) {
 ["count"]=>
 int(2)
 [0]=>
 string(15) "ou=Universität"
 [1]=>
 string(4) "c=DE"
}


bs

Copying is much better than typing!!!!
Just modify the constants.
Best wishes (and thanX 4 this helpfull site),
Bernd Schwaegerl
Mueller-Knoche GmbH, Systemhaus fuer EDV-Loesungen
# Example:
$HOST = "Yourhostname";
$USER_DN = "Yourldapuser_dn";
$PWD = "Ldapuserpassword";
$BASE_DN = "o=Your_organisation";
$SEARCH_OBJECT="sn=YOUR_SEARCH_PERSON_OBJECTS_SN";
$ldap_handle=ldap_connect($HOST);
$bind_result=ldap_bind($ldap_handle,$USER_DN,$PWD);
$search_result=ldap_search($ldap_handle,$BASE_DN,$SEARCH_OBJECT);
$result=ldap_get_entries($ldap_handle,$search_result);
$result_array=ldap_get_entries($ldap_handle,$result);
$whole_dn=$result_array[0]["dn"];
$dn_parts=ldap_explode_dn($whole_dn,0);


Change Language


Follow Navioo On Twitter
ldap_8859_to_t61
ldap_add
ldap_bind
ldap_close
ldap_compare
ldap_connect
ldap_count_entries
ldap_delete
ldap_dn2ufn
ldap_err2str
ldap_errno
ldap_error
ldap_explode_dn
ldap_first_attribute
ldap_first_entry
ldap_first_reference
ldap_free_result
ldap_get_attributes
ldap_get_dn
ldap_get_entries
ldap_get_option
ldap_get_values_len
ldap_get_values
ldap_list
ldap_mod_add
ldap_mod_del
ldap_mod_replace
ldap_modify
ldap_next_attribute
ldap_next_entry
ldap_next_reference
ldap_parse_reference
ldap_parse_result
ldap_read
ldap_rename
ldap_sasl_bind
ldap_search
ldap_set_option
ldap_set_rebind_proc
ldap_sort
ldap_start_tls
ldap_t61_to_8859
ldap_unbind
eXTReMe Tracker