如果我在过滤器中使用可扩展匹配,则我的ldap_search失败并出现协议错误。这是相关的代码:
$conn = ldap_connect(SERVER, PORT);
ldap_bind($conn, LDAP_USER, LDAP_PW);
$filter = "(&(whatever=*)(uid=something)(!(ou:dn:=other)))";
$s = ldap_search($conn, BASE_DN, $filter);
if (ldap_errno($conn) != 0) {
echo "Error: " + ldap_error($conn);
exit();
}
$res = ldap_get_entries($conn, $s);
var_dump($res);
exit();
如果我改用:
$filter = "(&(whatever=*)(uid=something))";
它运作正常。如果我从命令行使用带有可扩展匹配部分的ldapsearch它可以正常工作,所以它不是ldap服务器版本问题。
我也试图加入
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3);
和
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 2);
并且都没有效果。我使用的是PHP 7.0.28。
任何人都知道发生了什么事吗?
修改
回应@heiglandreas:
user@mycomp:~$ ldapsearch -VV
ldapsearch: @(#) $OpenLDAP: ldapsearch (Ubuntu) (May 30 2017 19:20:53) $
buildd@lgw01-18:/build/openldap-JXEADB/openldap-2.4.42+dfsg/debian/build/clients/tools
(LDAP library: OpenLDAP 20442)
从php_info输出:
LDAP Support enabled
RCS Version $Id: cec20da3ccaa477662b8667bef021291fb5bf6f4 $
Total Links 0/unlimited
API Version 3001
Vendor Name OpenLDAP
Vendor Version 20442
SASL Support Enabled
Directive Local Value Master Value
ldap.max_links Unlimited Unlimited
回应jwilleke:
vendorName 389 Project
vendorVersion 389-Directory/1.2.11.15 B2016.194.1549
但我确信它支持过滤器,因为命令行可扩展匹配的ldapseach工作正常。