|
ldap_explode_dn
Splits DN into its component parts
(PHP 4, PHP 5)
Code Examples / Notes » ldap_explode_dndavidsmith
[ 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 Languageldap_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 |