par
OwnTelemaque » 18 juil. 2012, 22:47
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
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:
[php]
//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
[/php]
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:
[php]
//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
[/php]
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, :wink:
Nico