Это мой код:
$objLDAP = ldap_connect($_POST['host']);
$dn = "OU=Users,DC=office,DC=example,DC=com";
if ($objLDAP)
{
ldap_set_option($objLDAP, LDAP_OPT_REFERRALS, 0);
ldap_get_option($objLDAP,LDAP_OPT_REFERRALS,$error);
print_r($error."<br/>");
ldap_set_option($objLDAP, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_get_option($objLDAP,LDAP_OPT_PROTOCOL_VERSION,$error);
print_r($error."<br/>");
$objBind = ldap_bind($objLDAP);
print_r($objBind."<br/>");
$sr = ldap_search($objLDAP, $dn, "sn=*","sn") or die("Error in search query: ".ldap_error($objLDAP));
print_r($sr."<br />");
print_r(ldap_error($objLDAP)."<br />");
$info = ldap_get_entries($objLDAP, $sr);
print_r($info["count"]);
print_r(ldap_error($objLDAP));
exit();
}
Где $ _POST [‘host’] является допустимым именем хоста, а $ dn также является допустимым деревом. Однако, когда я запускаю программу, я получаю
0
3
1
успех
Ошибка в поисковом запросе: успех
Если я использую ldap_errno, то получаю «Ошибка в поисковом запросе: 0».
Может кто-нибудь помочь мне получить более значимую информацию о том, почему я не могу получить информацию $?
Спасибо.
РЕДАКТИРОВАТЬ:
Все еще отлаживаю. Если я изменю строку на:
$sr = ldap_search($objLDAP,$dn,"(dn=*)") or die("Error in search query: ".ldap_error($objLDAP);
Тогда я получаю
Ошибка в поисковом запросе: ошибка операций
Но минуту, которую я добавляю в четвертый аргумент:
$sr = ldap_search($objLDAP,$dn,"(dn=*)","") or die("Error in search query: ".ldap_error($objLDAP);
Тогда я получаю:
Ошибка в поисковом запросе: успех
ДРУГОЕ РЕДАКТИРОВАНИЕ:
Основываясь на комментарии ниже, я взял or die()
и просто продолжил выполнение программы. Но я все еще не получаю никаких данных в $ info.
Код:
ldap_set_option($objLDAP, LDAP_OPT_REFERRALS, 0);
ldap_get_option($objLDAP,LDAP_OPT_REFERRALS,$error);
print_r($error.": LDAP_OPT_REFERRALS<br/>");
ldap_set_option($objLDAP, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_get_option($objLDAP,LDAP_OPT_PROTOCOL_VERSION,$error);
print_r($error.": LDAP_OPT_PROTOCOL_VERSION<br/>");
$objBind = ldap_bind($objLDAP);
print_r($objBind.": objBind<br/>");
print_r(ldap_error($objLDAP).": ldap_bind error<br/>");
$sr = ldap_search($objLDAP,"OU=Users,DC=office,DC=example,DC=com","(sn=*)","");
print_r($sr.": search result<br />");
print_r(ldap_error($objLDAP).": ldap_search error<br />");
$info = ldap_get_entries($objLDAP, $sr);
print_r($info["count"].": number of entries returned<br />");
print_r(ldap_error($objLDAP.": ldap_get_entries error<br />"));
exit();
Результат:
0: LDAP_OPT_REFERRALS
3: LDAP_OPT_PROTOCOL_VERSION
1: objBind
Успех: ошибка ldap_bind
: результат поиска
Успешно: ошибка ldap_search
: количество возвращенных записей
Это не столько вопрос LDAP, сколько вопрос PHP.
Ваше заявление ldap_search() or die()
, Но что это делает:
or die()
вызывает смерть сценария, если часть перед or
является false
, Но ldap_search
не возвращает логическое значение, а ресурс. А благодаря динамической природе PHP этот ресурс автоматически преобразуется в false
, Так что даже если ваш поиск вернет что-то полезное, вы будете всегда врезаться в or die()
-часть.
Я думаю, что вы хотите сделать что-то вроде следующего:
$sr = ldap_search($objLDAP, $dn, "sn=*","sn");
if (ldap_errno($objLDAP)) {
print_r($sr."<br />");
print_r(ldap_error($objLDAP)."<br />");
}
Других решений пока нет …