6.Le langage PHP

6.16.LDAP

6.16.3.Accès via les fonctions de l'extension ldap

6.16.3.3.L'accès en lecture (recherche d'objets)

6.16.3.3.1.Introduction

Une fois connecté[comment?], l'accès aux données LDAP se fait en deux temps:
  • Une première fonction ldap_search() permet de lancer la recherche
  • Une seconde fonction ldap_get_entries() permet d'accéder aux résultats

6.16.3.3.2.ldap_search

En plus de la ressource LDAP (issue de l'appel à ldap_connect()), la requête nécessite de préciser 2 paramètres:
  • La branche LDAP sur laquelle doit s'effectuer la recherche (ex: ou=redacteurs, dc=phpfacile, dc=com)
  • Le filtre de recherche (ex: "(sn=Dupond)" pour rechercher les dénommés Dupond, "(uid=jdupond)" pour rechercher par l'identifiant POSIX)
<?php
// Extrait de code (on suppose l'authentification préalablement établie)
// $ldap est la valeur retour de ldap_connect()
$requete = ldap_search($ldap,
                     'ou=redacteurs,dc=phpfacile,dc=com',
                     '(uid=jdupond)');
if (false === $requete) die('La recherche a échoué');
// Reste à récupérer les résultats
?>
La fonction retourne une ressource de recherche ou false en cas d'erreur.
Par défaut, c'est l'ensemble des attributs qui est retourné. Par conséquent, en pratique, c'est plutôt un minimum de 3 paramètres qui sont passés, le 3ème paramètre étant la liste (sous forme de tableau) des attributs à retourner (ex: ['sn', 'givenname'] pour retourner nom et prénom).
<?php
// Extrait de code (on suppose l'authentification préalablement établie)
// $ldap est la valeur retour de ldap_connect()
$requete = ldap_search($ldap,
                       'ou=redacteurs,dc=phpfacile,dc=com',
                       '(uid=jdupond)',
                       ['uid', 'sn', 'givenName']);
if (false === $requete) die('La recherche a échoué');
// Reste à récupérer les résultats
?>
<?php
// Extrait de code (on suppose l'authentification préalablement établie)
// $ldap est la valeur retour de ldap_connect()
$requete = ldap_search($ldap,
                       'ou=redacteurs,dc=phpfacile,dc=com',
                       '(uid=jdupond)',
                       array('uid', 'sn', 'givenName'));
if (false === $requete) die('La recherche a échoué');
// Reste à récupérer les résultats
?>

6.16.3.3.3.ldap_get_entries

Pour consulter les résultats de la requête LDAP, il suffit de passer en paramètre de la function ldap_get_entries() à la fois la ressource LDAP (réponse de ldap_connect()) et la ressource de requête LDAP (réponse de ldap_search()).
<?php
// Extrait de code (on suppose l'authentification préalablement établie)
// $ldap est la valeur retour de ldap_connect()
$requete = ldap_search($ldap,
                       'ou=redacteurs,dc=phpfacile,dc=com',
                       '(uid=jdupond)',
                       ['uid', 'sn', 'givenName']);
if (false === $requete) die('La recherche a échoué');
$resultats = ldap_get_entries($ldap, $requete);
// Reste à lire les résultats
?>
<?php
// Extrait de code (on suppose l'authentification préalablement établie)
// $ldap est la valeur retour de ldap_connect()
$requete = ldap_search($ldap,
                       'ou=redacteurs,dc=phpfacile,dc=com',
                       '(uid=jdupond)',
                       array('uid', 'sn', 'givenName'));
if (false === $requete) die('La recherche a échoué');
$resultats = ldap_get_entries($ldap, $requete);
// Reste à lire les résultats
?>
La fonction ldap_get_entries() retourne un tableau (à la fois indexé et associatif) qui contient les clés et valeurs suivantes:
  • count: le nombre de réponses
  • Les index de 0 à count-1: un tableau (associatif et indexé) décrivant la n-ième réponse qui contient:
    • count: le nombre d'attributs retourné pour la réponse
    • le nom des attributs (en minuscules): associés chacun à un tableau contenant:
      • count: le nombre de valeurs de l'attributs
      • Les index de 0 à count-1: les valeurs de l'attribut
    • Les index de 0 à count-1: le nom (en minuscules) du n-ième attribut retourné
La réponse ressemble donc à (cas avec une seule réponse)
array(2) {
  'count' =>
  int(1)
  [0] =>
  array(4) {
    'uid' =>
    array(2) {
      'count' =>
      int(1)
      [0] =>
      string(7) "jdupond"
    }
    'sn' =>
    array(2) {
      'count' =>
      int(1)
      [0] =>
      string(6) "Dupond"
    }
    'givenname' =>
    array(2) {
      'count' =>
      int(1)
      [0] =>
      string(4) "Jean"
    }
    [0] =>
    string(3) "uid"
    [1] =>
    string(2) "sn"
    [2] =>
    string(9) "givenname"
    'count' =>
    int(3)
    'dn' =>
    string(48) "cn=Dupond Jean,ou=redacteurs,dc=phpfacile,dc=com"
  }
}
rem
  • Comme on peut le voir, la réponse de ldap_get_entries() autorise la récupération des valeurs des attributs multivalués.
  • Pour toutes les réponses, l'attribut dn est systématiquement retourné (mais n'apparaîtra pas nécessairement dans le tableau indexé des noms des attributs retournés).

6.16.3.3.4.Exemple complet

Il est donc possible d'afficher l'ensemble des résultats de la requête avec un code similaire au suivant:
<?php
$ldapURL = 'ldap.forumsys.com';
$ldapPort = 389; // Port par défaut = 389
$ldapVersionProtocole = 3; // Version par défaut = 2
$ldapIdentifiant = 'cn=read-only-admin,dc=example,dc=com';
$ldapMotDePasse = 'password';

// Connexion
$ldap = ldap_connect($ldapURL, $ldapPort);
if (false === $ldap) die('Echec de la connexion');
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, $ldapVersionProtocole);
$retour = ldap_bind($ldap, $ldapIdentifiant, $ldapMotDePasse);
if (false === $retour) die('Echec de l\'authentification (ou de la connexion)');

// Recherche
$requete = ldap_search($ldap,
                     'dc=example,dc=com',
                     '(uid=curie)',
                     ['uid', 'sn', 'givenname']);
if (false === $requete) die('La recherche a échoué');

// Parcours du résultat de la recherche
$resultats = ldap_get_entries($ldap, $requete);
for ($i = 0; $i < $resultats['count']; $i++) {
    echo 'Réponse '.$i.' ('.$resultats[$i]['dn'].')'."\n";
    for ($j = 0; $j < $resultats[$i]['count']; $j++) {
        $nomAttribut = $resultats[$i][$j];
        echo '  L\'attribut '.$j.' ('.$nomAttribut.') a pour valeur(s):'."\n";
        for ($k = 0; $k < $resultats[$i][$nomAttribut]['count']; $k++) {
            echo '    '.$resultats[$i][$nomAttribut][$k]."\n";
        }
    }
}
?>
<?php
$ldapURL = 'ldap.forumsys.com';
$ldapPort = 389; // Port par défaut = 389
$ldapVersionProtocole = 3; // Version par défaut = 2
$ldapIdentifiant = 'cn=read-only-admin,dc=example,dc=com';
$ldapMotDePasse = 'password';

// Connexion
$ldap = ldap_connect($ldapURL, $ldapPort);
if (false === $ldap) die('Echec de la connexion');
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, $ldapVersionProtocole);
$retour = ldap_bind($ldap, $ldapIdentifiant, $ldapMotDePasse);
if (false === $retour) die('Echec de l\'authentification (ou de la connexion)');

// Recherche
$requete = ldap_search($ldap,
                     'dc=example,dc=com',
                     '(uid=curie)',
                     array('uid', 'sn', 'givenname'));
if (false === $requete) die('La recherche a échoué');

// Parcours du résultat de la recherche
$resultats = ldap_get_entries($ldap, $requete);
for ($i = 0; $i < $resultats['count']; $i++) {
    echo 'Réponse '.$i.' ('.$resultats[$i]['dn'].')'."\n";
    for ($j = 0; $j < $resultats[$i]['count']; $j++) {
        $nomAttribut = $resultats[$i][$j];
        echo '  L\'attribut '.$j.' ('.$nomAttribut.') a pour valeur(s):'."\n";
        for ($k = 0; $k < $resultats[$i][$nomAttribut]['count']; $k++) {
            echo '    '.$resultats[$i][$nomAttribut][$k]."\n";
        }
    }
}
?>
Ce qui pourra donner
Réponse 0 (uid=curie,dc=example,dc=com)
  L'attribut 0 (uid) a pour valeur(s):
    curie
  L'attribut 1 (sn) a pour valeur(s):
    Curie
  L'attribut 2 (givenname) a pour valeur(s):
    Marie
Ici vous pouvez apprendre :
1.Introduction
2.Installation de PHP
3.Exécuter un script PHP
4.Configuration et environnement d'exécution de PHP
5.L'environnement de développement
6.Le langage PHP
6.1.Introduction
6.2.Mon premier script
6.3.La syntaxe
6.4.Les boucles (for, while, foreach, do) en PHP
6.5.Les tableaux (array) en PHP
6.6.Les fonctions
6.7.Include
6.8.Programmation orientée objet
6.9.Les fonctions de manipulation de tableaux
6.10.Les dates
6.11.Fichiers et répertoires
6.12.Les paramètres d'entrée d'un script PHP
6.13.Utilisation de la librairie graphique
6.14.JpGraph pour tracer courbes et diagrammes
6.15.Utilisation de bases de données avec PHP
6.16.LDAP
6.16.1.Introduction
6.16.2.Installation de l'extension ldap
6.16.3.Accès via les fonctions de l'extension ldap
6.16.3.1.Introduction
6.16.3.2.Connexion, authentification, paramétrage
6.16.3.3.L'accès en lecture (recherche d'objets)
6.16.3.3.1.Introduction
6.16.3.3.2.ldap_search
6.16.3.3.3.ldap_get_entries
6.16.3.3.4.Exemple complet
6.16.3.4.L'accès en écriture
6.16.3.5.Conclusion
6.17.Parser un document XML
6.18.Génération de documents PDF en PHP
6.19.Envoyer un mail
6.20.Créer un webmail avec IMAP
6.21.Droits utilisateurs: chmod 777
6.22.Localization (l10n) et Traduction
7.PHP pour le web
8.Internationalisation (i18n) et encodage en PHP
9.Créer un fichier de logs/traces
10.Déboguer une application PHP
11.Programmer en PHP en toute sécurité
12.Bibilothèque PEAR
13.Zend Framework 2 et 3
14.Installation de Zend Framework 2
15.Joomla
16.Composer
17.PHPUnit
18.PHPDocumentor
19.Mesure de temps d'exécution (benchmark) d'une fonction PHP
20.Exemples de scripts PHP
21.Erreurs fréquentes et les solutions
22.Archives
Version imprimable: imprimer