大家好,小太來為大家解答以上問題。ldapphp,使用PHP連接LDAP服務器這個很多人還不知道,現在讓我們一起來看看吧!
LDAP是一種用于向許多不同資源發布目錄信息的協議。它通常用作集中的地址簿。LDAP最基本的形式是連接數據庫的標準方式。該數據庫針對讀取查詢進行了優化。所以它能很快得到查詢結果,但是在其他方面,比如更新,就慢了很多。值得注意的是,LDAP通常被用作層次數據庫,而不是關系數據庫。因此,它的結構用樹來表示比用表來表示更好。正因為如此,你不能使用SQL語句。簡而言之,LDAP是一種快速獲取有關人員或資源的集中式靜態數據的方法。下面做幾件事:設置公共LDAP服務器的信息;創建LDAP查詢;連接到LDAP服務器;如果連接成功,則處理該查詢;打印格式;關閉連接;設計搜索界面的HTML表格并顯示結果。設置公共LDAP服務器的信息:我們首先要做的是定義所有要搜索的LDAP服務器的信息:'LDAP_NAME'=新LDAP項目的名稱'LDAP_SERVER'=新LDAP項目的IP地址或主機名'LDAP_ROOT_DN'=新LDAP項目的根的可分辨名稱XMP?PHP$LDAP_NAME[0]='NetscapeNetCenter';$LDAP_SERVER[0]='memberdir.Netscape.com';$LDAP_ROOT_DN[0]='ou=member_directory,o=netcenter.com';$LDAP_NAME[1]='Bigfoot';$LDAP_SERVER[1]='LDAP.Bigfoot.com';$LDAP_ROOT_DN[1]=“”;//如果(!$SERVER_ID)$SERVER_ID=0;建立LDAP查詢:如前所述,LDAP查詢不同于SQL查詢。因此,聲明受到某些限制。這里有一個基本的例子。//createquery$LDAP_query='cn=$common';在我們的例子中,“cn”是我們想要搜索的屬性,而$common是從搜索到的表單中獲得的字符串變量。LDAP的查詢語句可以使用通配符'*'。比如,$Stanley會找到'danstanley'。連接到LDAP服務器:下面的函數連接到一個LDAP資源,并將連接的標識號賦給一個變量,就像連接到一個公共數據庫,比如MySQL。Php//連接LDAP$Connect_id=LDAP_Connect($LDAP_server[$server_id]);在我們的示例中,“$connect_id”是連接的標識號,$ldap_SERVER是可能的ldap服務器的數組,$SERVER_ID是通過搜索表獲得的LDAP服務器變量。如果連接成功,處理查詢:如果連接成功,我們將獲得一個有效的LDAP連接標識號,以便我們可以處理查詢。PHP($connect_id){//authentication$bind_id=LDAP_bind($connect_id);//執行搜索$search_id=LDAP_search($connect_id,$LDAP_root_dn[$server_id],$LDAP_query);//將結果集賦給一個數組$result_array=LDAP_get_entries($connect_id,$search_id);}else{//Showconnectionerrorecho'couldnotconnecttoldapserver:$LDAP_server[$server_id]';}?一旦我們與LDAP服務器建立了連接,我們就必須進行身份驗證。當PHP連接到大多數數據庫時,它會發送用戶名和密碼。然而,在LDAP中,在執行綁定操作之前,身份驗證是未知的。在我們的例子中,“$bind_id”是綁定連接的標識符。我們被匿名綁定到一個公共LDAP服務器。所以在執行ldap_bind()時,只需要連接標識號,不需要其他參數。認證之后,我們可以使用ldap_search()函數來執行查詢,生成的$search_id是我們搜索的連接標識符。然后,我們使用ldap_get_entries()函數將結果集分配給$result_array變量。通過這種方式,我們可以按照邏輯的方式排列信息以進行顯示。打印格式:執行LDAP搜索后,返回的數據按搜索順序排列。但是我們在排序的時候沒有SQL那么方便。我們可以只使用ORDERBY語句。通常,大多數公共LDAP目錄沒有標準的大小規范。排序基于字符的ASCII值。我們必須將所有字符格式化為小寫,這樣我們就可以按字母順序輸出它們。
LDAP結果集是一個多維數組,腳本中$result_array的結構如下:$result_array[0]['cn'][0]='DannieStanley'['dn'][0]='uid=Dannie,DC=spinweb.net'['givenname'][0]='Dannie'['sn'][0]='Stanley'['mail'][0]='danSPAM@spinweb.net'$result_array[1]['cn'][0比如我的名字是'dannie',我還可以在LDAP中添加一些屬性,比如:$result_array[0]['cn'][0]='dannieStanley'['dn'][0]='uid=dannie,DC=spinweb.net'['givenname'][0]='dannie'['givenname'][0]='Dan'['sn'][0]='Stanley'['mail'][0]='dansPAM@spinweb.net'下面是Php//如果搜索成功,對結果進行排序If($result_array){for($I=0;$I{$format_array[$I][0]=strtolower($result_array[$I]['cn'][0]);$format_array[$I][1]=$result_array[$I]['dn'];$format_array[$I][2]=strtolower($result_array[$I]['givenname'][0]);$format_array[$I][3]=strtolow($result_array[$I]['sn'][0]);$format_array[$I][4]=strtolow($result_array[$I]['mail'][0]);}//排序數組sort($format_array,'sort_string');for($I=0;$I{$cn=$format_array[$I][0];$dn=$format_array[$I][1];$fname=UCwords($format_array[$I][2]);$lname=UCwords($format_array[$I][3]);$email=$format_array[$I][4];if($dn$fname$lname$email){$result_list。='$fname$lname$result_list。='$email\\n';}elseif($dn$cn$email){$result_list。='ahref='/'LDAP://$LDAP_SERVER[$SERVER_ID]/$dn/''$cn/A';$result_list。='Ahref='/'mailto:$email/''$email/A\n';===else{echo'resultsetemptyforquery:$LDAP_query';}?$format_array是我們構建的一個新數組,它包含查詢的結果并被格式化用于輸出。首先循環$result_array中的每個元素,并將其賦給一個二維數組進行排序。同時,我們使用strtolower()函數將所有值改為小寫。我們使用PHP自帶的sort()函數進行排序。第一個參數是要排序的數組,另一個是要執行的排序類型,這是由PHP文檔定義的。既然是按字符串排序,就用“SORT_STRING”。我們循環格式化的數組,并把它賦給一個名為$result_list的輸出字符,它包含HTML描述。需要注意的是,我在超鏈接中使用ldap的URL格式。這種格式的一個例子是類似的:href='LDAP://LDAP.domain.net/uid=dannie,dc=domain.net'。關閉連接:現在我們所有的數據都已經包含在$result_list中,我們可以安全地關閉LDAP的連接了。Php//關閉連接LDAP_Close($connect_id);自定義搜索界面的HTML表單:最后,我們需要自定義搜索的HTML表單,用于為用戶執行搜索。Php//自定義窗體echo'centerforaction='\'$PHP_self\''method='\'get\';echo'searchin:selectname='\'SERVER_ID\''';//循環來為(I=0)建立SELECT選項;$iCOUNT($LDAP_NAME);br$I=echo'optionselectedvalue='\'$I\'''。$LDAP_NAME[$i]。/OPTION';echo'/SELECT';echo'searchfor:inputname='\'common\''type='\'text\''';echo'inputname='\'lookup\'type='\'submit\'value='\'go\';echo'(youcanuse*forwildcardsearches,ex。*Stanleywillfindallstanleys)’;回聲'/形式/中心';代碼中的$PHP_SELF是一個全局常量,它代表腳本頁面本身,其中的循環用于通過我們的$LDAP_NAME變量創建SELECT選項。顯示:現在所有的工作都完成了,我們將打印出結果集。如果沒有匹配的結果,將顯示消息“NoResults”。
?php//顯示結果if($result_list){echo'CENTERTABLEborder='\'1\'\'cellpadding='\'10\'cellspacing='\'0\'#FFFFEA\'WIDTH=\'450\'TBODYTRTD$result_list/TD/TR/TBODY/TABLE/CENTER';}否則回顯“沒有結果”;源代碼以下是完整的源代碼,只要將它剪切并粘貼到一個超文本標記語言文檔,就可以嘗試一下了。PHP$LDAP_NAME[0]='NetscapeNetCenter';$LDAP_SERVER[0]='成員目錄。網景公司。com’;$LDAP_ROOT_DN[0]='ou=member_directory,o=netcenter。com’;$LDAP_NAME[1]='Bigfoot';$LDAP_SERVER[1]='LDAP。大腳野人。com’;$LDAP_ROOT_DN[1]="";//如果沒有選擇服務器的話將它設置為0if(!$SERVER_ID)$SERVER_ID=0;//建立查詢$ldap_query='cn=$common//連接到LDAP$connect_ID=LDAP_connect($LDAP_SERVER[$SERVER_ID]);if($connect_id){//認證$bind_id=LDAP_bind($connect_id);
//執行搜索$search_ID=LDAP_search($connect_ID,$LDAP_ROOT_DN[$SERVER_ID],$LDAP_query);//將結果集合分配給一個數組$result_array=LDAP_get_entries($connect_id,$search_id);}else{//顯示連接錯誤回聲”無法連接到輕量級目錄訪問協議服務器:$LDAP_SERVER[$SERVER_ID]";}//如果搜索成功,將結果排序if(result_array){for(I=0;$I{$format_array[$I][0]=strtolower($result_array[$I]['cn'][0]);$format_array[$I][1]=$result_array[$I]['dn'];$format_array[$I][2]=strtolower($result_array[$I]['給定名稱'][0]);$format_array[$I][3]=strtow($result_array[$I]['sn'][0]);$format_array[$I][4]=strtow($result_array[$I]['mail'][0]);}//排序數組sort($format_array,'SORT_STRING');for($I=0;$I{$cn=$format_array[$I][0];$dn=$format_array[$I][1];$fname=UCwords($format_array[$I][2]);$lname=UCwords($format_array[$I][3]);$email=$format_array[$I][4];if($dn$fname$lname$email){$result_list.='ahref='/'LDAP://$LDAP_SERVER[$SERVER_ID]/$dn/''$fname$lname/A';$result_list.='$email\使用if($dn$cn$email){$result_list.='ahref='/'LDAP://$LDAP_SERVER[$SERVER_ID]/$dn/''$cn/A';$result_list.='Ahref='/'mailto:$email/''$email/A\n';else{echo'resultsetemptyforquery:$LDAP_query';}//關閉連接LDAP_close($connect_id);//定制表格echo'centerformaction='\'$PHP_SELF\''method='\'GET\';“回顯”搜索范圍:selectname='\'SERVER_ID\//循環以建立挑選選項for($I=0;$Iecho'optionselectedvalue='\'$I\'.$LDAP_NAME[$i].“/OPTION”;echo'/SELECT';“回顯”搜索:輸入名稱='\'common\''type='\'text\echo'inputname='\'lookup'type='\'submit'value='\'go\';echo'(可以使用*進行通配符搜索,例如.*StanleywillfindallStanleys)’;回聲'/形式/中心;//顯示結果if($result_list){echo'CENTERTABLEborder='\'1\'\'cellpadding='\'10\'cellspacing='\'0\'#FFFFEA\'WIDTH=\'450\'TBODYTRTD$result_list/TD/TR/TBODY/TABLE/CENTER';其他回顯“沒有結果”;
本文到此結束,希望對大家有所幫助。