PHP: Supr d'un attribut multivalué dans LDAP
owntelemaque
Messages postés
1
Date d'inscription
Statut
Membre
Dernière intervention
-
owntelemaque -
owntelemaque -
Bonjour,
Je souhaiterais supprimer une valeur d'un attribut multivalué dans un annuaire LDAP mais même après de nombreuses recherches sur le web je n'y parviens pas.
Je travaille en PHP.
Voici l'entrée dans le LDAP sur laquelle on travaille:
cn liste.test
createTimestamp 20120621185416Z
creatorsName cn=directory manager
description Liste TEST
inetMailGroupStatus active
mail liste.test@entreprise.com
mgmanHidden false
mgmanJoinability Closed
mgmanMemberVisibility Closed
mgrpBroadcasterPolicy NO_REQUIREMENTS
mgrpMsgRejectAction REPLY
modifiersName cn=directory manager
modifyTimestamp 20120624112809Z
objectClass top
objectClass groupofuniquenames
objectClass inetLocalMailRecipient
objectClass inetmailgroup
objectClass inetmailgroupmanagement
uniqueMember uid=nico.test,ou=TEST,o=entreprise.com,o=corp
uniqueMember uid=paul.test,ou=TEST,o=entreprise.com,o=corp
uniqueMember uid=john.test,ou=TEST,o=entreprise.com,o=corp
L'objectif est du SUPPRIMER l'attribut:
uniqueMember uid=nico.test,ou=TEST,o=entreprise.com,o=corp
et de conserver les 2 autres.
J'ai essayé dans un premier temps de simplement MODIFIER l'uniquemember en question mais je n'y arrive déjà pas:
//Connexion au LDAP puis...
//Préparation d'une requête pour compter et afficher tous les uniquemember de notre entrée:
$varSup = "liste.test";
$filtreReqSup="cn=$varSup";
$restrictionReqSup = array("uniquemember");
$sr=ldap_search($ds, $dn, $filtreReqSup, $restrictionReqSup);
$infoReqSup = ldap_get_entries($ds, $sr);
print $infoReqSup[0]["uniquemember"]["count"]." uniqueMembers trouvés" . "<br>";
//J'essaye de modifier mon uniquemember:
for ($i=0; $i<$infoReqSup[0]["uniquemember"]["count"]; $i++)
{
if($infoReqSup[0]["uniquemember"][$i] == "uid=nico.test,ou=TEST,o=entreprise.com,o=corp")
{
$sup["uniqueMember"][$i] = "uid=MODIF.test,ou=TEST,o=entreprise.com,o=corp";
$r=ldap_modify($ds, "cn=liste.test,ou=Misc,o=entreprise.com,o=corp", $sup);
}
}
//....
Quand j'exécute ce code, je me prends ce message d'erreur:
Warning: ldap_modify() [function.ldap-modify]: Value array must have consecutive indices 0, 1, ...
Merci d'avance pour votre aide si vous avez une idée! :)
Nico
Je souhaiterais supprimer une valeur d'un attribut multivalué dans un annuaire LDAP mais même après de nombreuses recherches sur le web je n'y parviens pas.
Je travaille en PHP.
Voici l'entrée dans le LDAP sur laquelle on travaille:
cn liste.test
createTimestamp 20120621185416Z
creatorsName cn=directory manager
description Liste TEST
inetMailGroupStatus active
mail liste.test@entreprise.com
mgmanHidden false
mgmanJoinability Closed
mgmanMemberVisibility Closed
mgrpBroadcasterPolicy NO_REQUIREMENTS
mgrpMsgRejectAction REPLY
modifiersName cn=directory manager
modifyTimestamp 20120624112809Z
objectClass top
objectClass groupofuniquenames
objectClass inetLocalMailRecipient
objectClass inetmailgroup
objectClass inetmailgroupmanagement
uniqueMember uid=nico.test,ou=TEST,o=entreprise.com,o=corp
uniqueMember uid=paul.test,ou=TEST,o=entreprise.com,o=corp
uniqueMember uid=john.test,ou=TEST,o=entreprise.com,o=corp
L'objectif est du SUPPRIMER l'attribut:
uniqueMember uid=nico.test,ou=TEST,o=entreprise.com,o=corp
et de conserver les 2 autres.
J'ai essayé dans un premier temps de simplement MODIFIER l'uniquemember en question mais je n'y arrive déjà pas:
//Connexion au LDAP puis...
//Préparation d'une requête pour compter et afficher tous les uniquemember de notre entrée:
$varSup = "liste.test";
$filtreReqSup="cn=$varSup";
$restrictionReqSup = array("uniquemember");
$sr=ldap_search($ds, $dn, $filtreReqSup, $restrictionReqSup);
$infoReqSup = ldap_get_entries($ds, $sr);
print $infoReqSup[0]["uniquemember"]["count"]." uniqueMembers trouvés" . "<br>";
//J'essaye de modifier mon uniquemember:
for ($i=0; $i<$infoReqSup[0]["uniquemember"]["count"]; $i++)
{
if($infoReqSup[0]["uniquemember"][$i] == "uid=nico.test,ou=TEST,o=entreprise.com,o=corp")
{
$sup["uniqueMember"][$i] = "uid=MODIF.test,ou=TEST,o=entreprise.com,o=corp";
$r=ldap_modify($ds, "cn=liste.test,ou=Misc,o=entreprise.com,o=corp", $sup);
}
}
//....
Quand j'exécute ce code, je me prends ce message d'erreur:
Warning: ldap_modify() [function.ldap-modify]: Value array must have consecutive indices 0, 1, ...
Merci d'avance pour votre aide si vous avez une idée! :)
Nico
A voir également:
- PHP: Supr d'un attribut multivalué dans LDAP
- Easy php - Télécharger - Divers Web & Internet
- Expert php pinterest - Télécharger - Langages
- Retour a la ligne php - Forum Webmastering
- Alert php - Forum PHP
- Retour a la ligne php ✓ - Forum PHP
1 réponse
Résolu
Objet: supprimer un attribut multivalué dans un annuaire LDAP en php
Bonjour,
Bon, depuis le temps j'ai bossé sur le problème et j'ai trouvé la solution.
En fait, le problème c'est que je ne connaissais pas bien le fonctionnement du LDAP. (ni des tableaux)
Je pensais que pour des valeurs d'un attribut suivant sur l'annuaire:
$var["uniqueMember"][0] => "uid=toto.test,o=entreprise.com,o=corp"
$var["uniqueMember"][1] => "uid=titi.test,o=entreprise.com,o=corp"
$var["uniqueMember"][2] => "uid=tata.test,o=entreprise.com,o=corp"
$var["uniqueMember"][3] => "uid=tutu.test,o=entreprise.com,o=corp"
si je supprimais l'entrée manuellement sur le LDAP (l'index 1 par exemple), le tableau ressemblerait à cela sur le LDAP:
$var["uniqueMember"][0] => "uid=toto.test,o=entreprise.com,o=corp"
$var["uniqueMember"][2] => "uid=tata.test,o=entreprise.com,o=corp"
$var["uniqueMember"][3] => "uid=tutu.test,o=entreprise.com,o=corp"
En fait non, lorsque l'on fait une modif directement sur l'annuaire, ce dernier ré-indexe tout automatiquement.
Aussi, on aurait eu à la place cela:
$var["uniqueMember"][0] => "uid=toto.test,o=entreprise.com,o=corp"
$var["uniqueMember"][1] => "uid=tata.test,o=entreprise.com,o=corp"
$var["uniqueMember"][2] => "uid=tutu.test,o=entreprise.com,o=corp"
C'est pour cela que dans mon code ci dessus, lorsque je demande de ré-écrire ne serait-ce que une ligne dont l'index est autre que le 0, il me jette avec ce message:
Value array must have consecutive indices 0, 1, ...
La solution réside donc dans la préparation d'un tableau temporaire préparé en php et indexé correctement que l'on soumettra à la fonction ldap_modify.
Plus précisément, admettons que l'on veuille supprimer l'entrée "uid=tata.test,o=entreprise.com,o=corp" dans le LDAP dans l'exemple ci-dessous:
$var["uniqueMember"][0] => "uid=toto.test,o=entreprise.com,o=corp"
$var["uniqueMember"][1] => "uid=titi.test,o=entreprise.com,o=corp"
$var["uniqueMember"][2] => "uid=tata.test,o=entreprise.com,o=corp"
$var["uniqueMember"][3] => "uid=tutu.test,o=entreprise.com,o=corp"
il va falloir récupérer dans un premier temps le contenu des valeurs de l'attribut dans un tableau temporaire que l'on gère en php ($infoReqListe dans l'exemple ci-dessous), supprimer la ligne que l'on souhaite dans ce tableau, le réindéxer et enfin, l'envoyer dans le LDAP:
Pour une modif, le principe est a peu près le même sauf que nous n'avons pas d'étape de suppression ni de ré-indexation.
Si l'on voulait modifier notre uniquemember dont la valeur est "uid=tata.test,o=entreprise.com,o=corp", il faut dans un premier temps ré-écrire dans un tableau temporaire les valeurs contenus dans les index jusqu'à "uid=tata.test,o=entreprise.com,o=corp", ecrire une nouvelle ligne dans ce tableau avec notre modif, finir avec de compléter le tableau avec le reste des valeurs et enfin insérer le contenu de ce tableau dans le LDAP:
Voilà, j'ai pris le temps de faire une réponse aussi claire que précise pour ceux qui rencontrerons ce pb car j'ai bien lutté avec ça! En espérant que ceci pourra aider.
Pour info les codes ont été testés et fonctionnent.
Bon développement, :)
Nico
Objet: supprimer un attribut multivalué dans un annuaire LDAP en php
Bonjour,
Bon, depuis le temps j'ai bossé sur le problème et j'ai trouvé la solution.
En fait, le problème c'est que je ne connaissais pas bien le fonctionnement du LDAP. (ni des tableaux)
Je pensais que pour des valeurs d'un attribut suivant sur l'annuaire:
$var["uniqueMember"][0] => "uid=toto.test,o=entreprise.com,o=corp"
$var["uniqueMember"][1] => "uid=titi.test,o=entreprise.com,o=corp"
$var["uniqueMember"][2] => "uid=tata.test,o=entreprise.com,o=corp"
$var["uniqueMember"][3] => "uid=tutu.test,o=entreprise.com,o=corp"
si je supprimais l'entrée manuellement sur le LDAP (l'index 1 par exemple), le tableau ressemblerait à cela sur le LDAP:
$var["uniqueMember"][0] => "uid=toto.test,o=entreprise.com,o=corp"
$var["uniqueMember"][2] => "uid=tata.test,o=entreprise.com,o=corp"
$var["uniqueMember"][3] => "uid=tutu.test,o=entreprise.com,o=corp"
En fait non, lorsque l'on fait une modif directement sur l'annuaire, ce dernier ré-indexe tout automatiquement.
Aussi, on aurait eu à la place cela:
$var["uniqueMember"][0] => "uid=toto.test,o=entreprise.com,o=corp"
$var["uniqueMember"][1] => "uid=tata.test,o=entreprise.com,o=corp"
$var["uniqueMember"][2] => "uid=tutu.test,o=entreprise.com,o=corp"
C'est pour cela que dans mon code ci dessus, lorsque je demande de ré-écrire ne serait-ce que une ligne dont l'index est autre que le 0, il me jette avec ce message:
Value array must have consecutive indices 0, 1, ...
La solution réside donc dans la préparation d'un tableau temporaire préparé en php et indexé correctement que l'on soumettra à la fonction ldap_modify.
Plus précisément, admettons que l'on veuille supprimer l'entrée "uid=tata.test,o=entreprise.com,o=corp" dans le LDAP dans l'exemple ci-dessous:
$var["uniqueMember"][0] => "uid=toto.test,o=entreprise.com,o=corp"
$var["uniqueMember"][1] => "uid=titi.test,o=entreprise.com,o=corp"
$var["uniqueMember"][2] => "uid=tata.test,o=entreprise.com,o=corp"
$var["uniqueMember"][3] => "uid=tutu.test,o=entreprise.com,o=corp"
il va falloir récupérer dans un premier temps le contenu des valeurs de l'attribut dans un tableau temporaire que l'on gère en php ($infoReqListe dans l'exemple ci-dessous), supprimer la ligne que l'on souhaite dans ce tableau, le réindéxer et enfin, l'envoyer dans le LDAP:
//PRE-REQUETE: on récupere dans un tableau $infoReqListe tous les uniquemember présents dans la liste $filtreReqListe="cn=Nom de la Liste"; //On va effectuer la recherche sur notre liste qui s'appelle "Nom de la Liste" $restrictionReqListe = array("uniquemember", "dn"); //Lors de la recherche on récupère les valeurs des uniquemember et le dn de la liste $sr=ldap_search($ds, $dn, $filtreReqListe, $restrictionReqListe); //On effectue notre recherche $infoReqListe = ldap_get_entries($ds, $sr); //On place le résultat de notre recherche dans un array qui s'appelle $infoReqListe $DNRequListe = $infoReqListe[0]["dn"]; //On recupere le DN de notre Liste dans une variable simple $DNmodif = "uid=tata.test,o=entreprise.com,o=corp"; //On initialise une variable dans laquelle se trouve la valeur de l'attribut à modifier //LA PHASE DE SUPRESSION: unset($infoReqListe[0]["uniquemember"][array_search($DNmodif, $infoReqListe[0]["uniquemember"])]); //on supprime l'élément de la liste array_splice($infoReqListe[0]["uniquemember"], $DNmodif, 1); //On ré-indexe le tableau $REQUETE["uniquemember"] = $infoReqListe[0]["uniquemember"]; //On remet les valeurs dans un tableau simple qui s'appelle $REQUETE $r=ldap_modify($ds, $DNRequListe, $REQUETE); //On applique la modif dans le LDAP
Pour une modif, le principe est a peu près le même sauf que nous n'avons pas d'étape de suppression ni de ré-indexation.
Si l'on voulait modifier notre uniquemember dont la valeur est "uid=tata.test,o=entreprise.com,o=corp", il faut dans un premier temps ré-écrire dans un tableau temporaire les valeurs contenus dans les index jusqu'à "uid=tata.test,o=entreprise.com,o=corp", ecrire une nouvelle ligne dans ce tableau avec notre modif, finir avec de compléter le tableau avec le reste des valeurs et enfin insérer le contenu de ce tableau dans le LDAP:
//PRE-REQUETE: Comme tout à l'heure, on extrait les valeurs du LDAP dans un tableau temporaire $infoReqListe que l'on va par la suite modifier $filtreReqListe="cn=Nom de la Liste"; //On va effectuer la recherche sur notre liste qui s'appelle "Nom de la Liste" $restrictionReqListe = array("uniquemember", "dn"); //Lors de la recherche on récupère les valeurs des uniquemember et le dn de la liste $sr=ldap_search($ds, $dn, $filtreReqListe, $restrictionReqListe); //On effectue notre recherche $infoReqListe = ldap_get_entries($ds, $sr); //On place le résultat de notre recherche dans un array qui s'appelle $infoReqListe $NBMembres = $infoReqListe[0]["uniquemember"]["count"]; //On compte le nombre de valeurs qu'il y a pour notre attribut uniqueMember $DNRequListe = $infoReqListe[0]["dn"]; //On recupere le DN de notre Liste dans une variable simple $NvValeur = "uid=hihi.test,o=entreprise.com,o=corp"; //On initialise une variable dans laquelle on renseigne la nouvelle valeur de l'attribut que l'on met à jour for ($j=0; $j<$NBMembres; $j++) //Pour tous les uniquemember que l'on a dans la liste... { if ($infoReqListe[0]["uniquemember"][$j] == "uid=tata.test,o=entreprise.com,o=corp") //Si la valeur de l'attribut en question corresponds à celui que l'on veut modifier... { $REQUETE["uniquemember"][$j] = $NvValeur; //on renseigne dans notre tableau temporaire $REQUETE notre nouvelle valeur ("uid=hihi.test,o=entreprise.com,o=corp") à la place de ("uid=tata.test,o=entreprise.com,o=corp") $j++; //On incrémente notre compteur pour ne pas ré-écrire sur la même ligne à la prochaine modif. } $REQUETE["uniquemember"][$j] = $infoReqListe[0]["uniquemember"][$j]; //Si pas de modif, on réécrit tout ce qu'il y avait dans les uniquemember et qui n'a pas changé } //Une fois que le tableau temporaire est prêt et du coup correctement indéxé.... $r=ldap_modify($ds, $DNRequListe, $REQUETE); //On applique la modif dans le LDAP
Voilà, j'ai pris le temps de faire une réponse aussi claire que précise pour ceux qui rencontrerons ce pb car j'ai bien lutté avec ça! En espérant que ceci pourra aider.
Pour info les codes ont été testés et fonctionnent.
Bon développement, :)
Nico