[ 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!
ldap_explode_dn
(PHP 4, PHP 5)
ldap_explode_dn — Sépare les différents composants d'un DN
Description
array ldap_explode_dn
( string $dn
, int $with_attrib
)
Sert à extraire les différents composants du DN dn . Chaque composant s'appelle un Nom Distingué Relatif (Relative Distinguished Name ou encore RDN).
Liste de paramètres
- dn
-
Le nom DN de l'entrée LDAP.
- with_attrib
-
Sert à préciser si les RDN sont retournés seuls, ou bien avec leurs attributs. Pour obtenir les attributs en même temps que les RDN (au format attribut=valeur), donnez à with_attrib la valeur de 0 et, sinon, donnez lui la valeur de 1.
Valeurs de retour
Retourne un tableau de tous les composants DN.
ldap_explode_dn
DavidSmith at byu dot net
15-Sep-2003 06:06
15-Sep-2003 06:06
gabriel at hrz dot uni-marburg dot de
05-Aug-2003 11:27
05-Aug-2003 11:27
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 at muekno dot de
23-Oct-2001 01:02
23-Oct-2001 01:02
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);
