<?php
// basic sequence with LDAP is connect, bind, set pagedResults control,
// search, interpret search result, re-set pagedResults control as required,
// close connection

echo "<h3>LDAP pagedResults query test</h3>";
echo "Connecting ...";
$ds=ldap_connect("ldap://:9011");  // must be a valid LDAP server!
echo "connect result is [" . $ds . "]<br />";

if ($ds) {
	if (ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)) {
		echo "Using LDAPv3<br />";
	} else {
		echo "Failed to set protocol version to 3<br />";
	}

	echo "Binding ...";
	$r = ldap_bind($ds);    // this is an "anonymous" bind, typically
                                // read-only access
	echo "Bind result is [" . $r . "]<br />";

	//if (ldap_set_option($ds, LDAP_OPT_SIZELIMIT, 4)) {
	//	echo "setting sizelimit<br />";
	//} else {
	//	echo "Failed to set sizelimit<br />";
	//}

	$pageSize = "\003";
	$pagedResultsValue = "0\005\002\001\003\004\000";
	//0  \r 002 001  \0 004  \b  \n  \0 \0  \0  \0  \0  \0  \0

	while (1) {
		$pagedResultsValue{4} = $pageSize;

		//echo "Setting pagedResults control = " . $pagedResultsValue . "... ";
		echo "Setting pagedResults control... ";
		$ctrl1 = array("oid" => "1.2.840.113556.1.4.319", "value" => $pagedResultsValue, "iscritical" => 1);
		if (ldap_set_option($ds, LDAP_OPT_SERVER_CONTROLS, array($ctrl1))) {
			echo "success<br />";
		} else {
			echo "ldap_set_option failed<br />";
		}

		echo "Searching for (sn=S*) ...";
		// Search surname entry
		$sr=ldap_search($ds, "dc=example,dc=com", "sn=*"); 
		echo "Search result is [" . $sr . "]<br />";

		echo "Number of entires returned is " . ldap_count_entries($ds, $sr) . "<br />";

		echo "Getting entries ...<p>";
		$info = ldap_get_entries($ds, $sr);
		echo "Data for " . $info["count"] . " items returned:<p>";

		for ($i=0; $i<$info["count"]; $i++) {
			echo "dn is: " . $info[$i]["dn"] . "<br />";
			echo "first cn entry is: " . $info[$i]["cn"][0] . "<br />";
			echo "first email entry is: " . $info[$i]["mail"][0] . "<br /><hr />";
		}

		$r=ldap_parse_result($ds, $sr, $errcode, $matcheddn, $errmsg, &$referrals, &$ctrls);
		//$r=ldap_parse_result($ds, $sr, $errcode, $matcheddn, $errmsg, $referrals);

		echo "error: " . $errcode . " (" . $errmsg . ")</br />";
		if ($ctrls["count"] > 0) {
			$dostop = 0;
			for ($i = 0; $i < $ctrls["count"]; $i++) {
				//echo "control " . $i . ": oid=" . $ctrls[$i]["oid"] . " value=" . $ctrls[$i]["value"] . " iscritical=" . $ctrls[$i]["iscritical"] . "<br />";
				echo "control " . $i . ": oid=" . $ctrls[$i]["oid"] . " iscritical=" . $ctrls[$i]["iscritical"] . "<br />";
				if ($ctrls[$i]["oid"] == "1.2.840.113556.1.4.319") {
					$pagedResultsValue = $ctrls[$i]["value"];
					if ($pagedResultsValue{6} == "\000") {
						$dostop = 1;
					}
				}
			}

			if ($dostop) {
				break;
			}

		} else {
			echo "Control missing?<br />";
			break;
		}

		echo "<br /><hr /><hr />";
	}

	echo "Closing connection...<br />";
	ldap_close($ds);

} else {
	echo "<h4>Unable to connect to LDAP server</h4>";
}
?> 
