In this post, i’m gonna explain how to connect to a LDAP server via using PHP.

First i wanna talk about some definitions;

LDAP means Lightweight Directory Access Protocol.

As you can understand from it’s name, it is a database which uses directory-tree based structure.

It’s used by OpenLDAP, Sun Directory Server, Microsoft Active Directory and such directory services.

LDIF means LDAP Data Interchange Format.

You can easily execute LDAP queries using ldif files. For example;

dn: cn=John Doe,dc=example,dc=com
cn: John Doe
givenName: John
sn: Doe
telephoneNumber: +1 888 555 6789
telephoneNumber: +1 888 555 1232
mail: john@example.com
Manager: cn=Jane Doe,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top

You can see some other terms(actually attributes) in the LDAP query above. Such as dn: Distinguished Name, cn: Common Name, sn: Surname.

I’ll give more information about LDAP later in another post.

PHP LDAP Functions

PHP has it’s own LDAP functions by it’s own. But i’ve decided to write a class for easier access to these functions.

First, you have to include our class below.

<?php 

class LDAP{

    public  $ldapserver = "99.245.56.89";
    public  $ldapport = "389";
    public  $basedn = "cn=admin,dc=web-sistem,dc=com";
    public  $basepass = "yourldap_password"; 

	function connect($server,$port){

		echo "Connecting to LDAP Server..."; 
		$connection = ldap_connect($server,$port);  // must be a valid LDAP server!	
		ldap_set_option($connection, LDAP_OPT_PROTOCOL_VERSION, 3);

		// PHP Reference says there is no control of connection status in OpenLDAP 2.x.x
		// So we'll use binding function to check connection status.

		return $connection;

	}

	function bind($connection,$basedn,$basepass){

		echo "<br><br>Binding...<br>";  
		$ldaprdn  = $basedn;    // ldap rdn or dn 
		$ldappass = $basepass;  // associated password
		$bind = ldap_bind($connection, $ldaprdn, $ldappass);

		if ($bind) { 
			echo "LDAP bind successful...";

		} else { 
			echo "LDAP bind failed..."; 
		}
	}

	function search($connection, $searchdn, $filter, $attributes = array()){

		$sr = ldap_search($connection, $searchdn, $filter, $attributes);

		if ($sr) {
			echo 'Search Succeeded. Getting Entries...<br>';

	        echo "Number of entires returned:  " . ldap_count_entries($connection, $sr) . "<br />";

	        $info = ldap_get_entries($connection, $sr);

	        echo "Data for " . $info["count"] . " items returned:<p>\n";

			print_r($info);
			echo '<hr><br>';

		} else {
			echo 'Search Failed.<br>';
		}
	}

	function addRecord($connection, $adddn, $record){

	    $addProcess = ldap_add($connection, $adddn, $record);

	    if($addProcess){
	        echo "Entry added<br>";
			echo '<hr><br>';
	    } else {
	    	echo "Please check your data<br>";
			echo '<hr><br>';
	    }
	}

	function modifyRecord($connection, $modifydn, $record){
		$modifyProcess = ldap_modify($connection, $modifydn, $record);
	    if($modifyProcess){
	        echo "Entry modified<br>";
			echo '<hr><br>';
	    } else {
	    	echo "Please check your data<br>";
			echo '<hr><br>';
	    }
	}

	function deleteRecord($connection, $dn, $recursive = false){
	    echo "Deleting Record...<br>";

	    if($recursive == false){
	    	echo 'Entry: ' . $dn . ' deleted.';
	        return(ldap_delete($connection, $dn));
	    } else {

	        // Search for child entries	        
	        $sr = ldap_list($connection, $dn, "ObjectClass=*", array(""));
	        $info = ldap_get_entries($connection, $sr);

	        for($i=0;$i<$info['count'];$i++){
	            // Recursive delete child entries - using myldap_delete to recursive deletion
	            $result = myldap_delete($connection, $info[$i]['dn'], $recursive);
	            if(!$result){
	                // return status code if deletion fails.
	                return($result);
	            }
	        }
			// Delete top dn
			echo 'Entry: ' . $dn . ' deleted.';
	        return(ldap_delete($connection, $dn));
	    }
	}

	function close($connection){
		echo '<hr><br>';
	    echo "Closing connection";
	    ldap_close($connection);
	}

}

?>

And then you may want to initialize and use our class. Usage is so simple.

<?php

	require_once('class.ldap.php');

	$ldap = new LDAP();

	// Connect to LDAP Server  - connect(ldap_server, port)
	$connection = $ldap->connect($ldap->ldapserver,$ldap->ldapport);

	// Bind with LDAP instance
	$ldap->bind($connection,'cn=admin,dc=web-sistem,dc=com','yourldap_password');

	echo '<hr><br>';

	// Search LDAP directory

	// Search with a wildcard
	$ldap->search($connection,'o=hosting,dc=web-sistem,dc=com','vd=*');

	// Search with no attributes specified	
	$ldap->search($connection,'o=hosting,dc=web-sistem,dc=com','vd=plugged.in');

	// Search with attributes (attributes must be an array)

	$ldap->search($connection,'o=hosting,dc=web-sistem,dc=com','vd=web-sistem.com', array('custID'));

	// Prepare data to insert

	// Please change the record entry as required by your company directory structure

	$insert_data['objectclass'][0] = "top";
	$insert_data['objectclass'][1] = "VirtualDomain";

	$insert_data["accountActive"] = "TRUE";
	$insert_data["delete"] = "FALSE";
	$insert_data["lastChange"] = "103";
	$insert_data["vd"] = "plugged.in";
	$insert_data["adminID"] = "3";
	$insert_data["custID"] = "2";
	$insert_data["editAV"] = "FALSE";
	$insert_data["maxAlias"] = "20";
	$insert_data["maxMail"] = "22";
	$insert_data["maxQuota"] = "300";
	$insert_data["postfixTransport"] = "maildrop:";

	// LDAP Insert DN		
	$addDN = "vd=plugged.in,o=hosting,dc=web-sistem,dc=com";
	$ldap->addRecord($connection,$addDN,$insert_data);

	// Prepare data to modify

	// Please change the record entry as required by your company directory structure

	$modify_data["adminID"] = "3213";
	$modify_data["custID"] = "2441";

	// LDAP Modify DN		
	$modifyDN = "vd=plugged.in,o=hosting,dc=web-sistem,dc=com";
	$ldap->modifyRecord($connection,$modifyDN,$modify_data);

	// Delete LDAP record	(third parameter is "Recursive")
	$deleteDN = "vd=plugged.in,o=hosting,dc=web-sistem,dc=com";
	$ldap->deleteRecord($connection,$deleteDN,true);

	//Close LDAP Connection
	$ldap->close($connection);
?>

That’s all for now.

If you have questions or advices about this class please leave a message in comments section.