【问题标题】:ldap_search() error: Successldap_search() 错误:成功
【发布时间】:2016-02-15 15:49:22
【问题描述】:

这是我的代码:

$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”。

谁能帮我找回更有意义的信息,说明为什么我无法联系到 $info?

谢谢。

编辑: 还在调试。如果我将行更改为:

$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:对象绑定
成功:ldap_bind 错误
: 搜索结果
成功:ldap_search 错误
: 返回的条目数

【问题讨论】:

    标签: php ldap ldap-query


    【解决方案1】:

    这不是一个 LDAP 问题,而是一个 PHP 问题。

    您的声明是ldap_search() or die()。但它有什么作用:

    如果or 之前的部分是falseor die() 会导致脚本终止。但是ldap_search 不返回布尔值,而是返回资源。由于 PHP 的动态特性,资源会自动转换为false。因此,即使您的搜索返回有用的信息,您也将总是遇到or die()-part。

    我认为您想要做的事情如下:

    $sr = ldap_search($objLDAP, $dn, "sn=*","sn");
    if (ldap_errno($objLDAP)) {
        print_r($sr."<br />");
        print_r(ldap_error($objLDAP)."<br />");
    }
    

    【讨论】:

    • 非常感谢您的回答。但是,即使没有or die(),我也没有从搜索中获得任何数据。 $info 永远不会被填充。我将编辑我的问题以进一步反映这一点。感谢您解释任何答案都转换为false。这是非常有用的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    相关资源
    最近更新 更多