vanilla php ldap 查询有效。 Symfony 3 ldap 查询失败。为什么?
vanilla php ldap query works. Symfony 3 ldap query fails. Why?
我正在尝试弄清楚如何在 Symfony3 中使用 Ldap class。我已经成功创建并绑定了一个连接,但我无法获得任何查询结果。为了确保查询确实有效,我 运行 一个裸 php 版本:
if($lconn = ldap_connect('ds.mydomain.ca')){
ldap_set_option($lconn, LDAP_OPT_REFERRALS, 0);
ldap_set_option($lconn, LDAP_OPT_PROTOCOL_VERSION, 3);
if($lbind = ldap_bind($lconn,'webuser','password')){
$filter ="(&(sn=Smith)(givenname=J*))";
if(!$result = ldap_search($lconn, "dc=ds, dc=mydomain, dc=ca", $filter)) throw \Exception("Error in search query: ".ldap_error($lconn));
$output = ldap_get_entries($lconn, $result);
}else{
$output='bind failed';
}
} else {
$output= 'connection failed';
}
它 returns 预期的结果数。
另一方面,此查询使用 Symfony 3 的 Ldap 组件完成 returns 0 个结果:
//use Symfony\Component\Ldap\Ldap
$ldap = Ldap::create('ext_ldap', array(
'host' => 'ds.mydomain.ca',
'version' => 3,
'debug' => true,
'referrals' => false,
));
$ldap->bind('webuser', 'password');
$q = $ldap->query("dc=ds, dc=nrc, dc=ca", "(&(sn=Smith)(givenname=J*))");
$output = $q->execute();
知道为什么当 Symfony ldap 查询的所有选项都应该与我用于裸 php 查询的选项相同时它会失败吗?
我reposted this question on the Symfony github. @ChadSikorra也在场。他清楚地说明了我的问题是什么。这是他的解释:
If you look at the collection class, nothing is done with the result
resource until initialize() is called in the class. If you do
return array('output' => array('bare' => $bare, 'symfony' =>
$symf->toArray())); it will call initialize and you'll see the
entries populated in the class. Unless there's something else going
on.
您在使用最新的 3.1+ 版本时仍然遇到此问题吗?
抱歉,我不常去 Stack Overflow,大部分时间都花在 Github 上,所以我之前没有看到你的问题。
正如@ChadSikorra 所说,您应该使用结果集合的 toArray() 方法 class,或者您应该直接迭代结果。
实现是为了以内存高效的方式遍历结果,默认情况下不会将所有结果存储在数组中,但 toArray() 方法可以为您完成此操作。在幕后,它实际上使用适当的 PHP 函数 (iterator_to_array) 将生成的 itératif 转换为数组。
顺便说一句,迭代器和 toArray() 函数调用之间曾经存在一些不一致,但在最近的版本中已得到修复。
干杯!
我正在尝试弄清楚如何在 Symfony3 中使用 Ldap class。我已经成功创建并绑定了一个连接,但我无法获得任何查询结果。为了确保查询确实有效,我 运行 一个裸 php 版本:
if($lconn = ldap_connect('ds.mydomain.ca')){
ldap_set_option($lconn, LDAP_OPT_REFERRALS, 0);
ldap_set_option($lconn, LDAP_OPT_PROTOCOL_VERSION, 3);
if($lbind = ldap_bind($lconn,'webuser','password')){
$filter ="(&(sn=Smith)(givenname=J*))";
if(!$result = ldap_search($lconn, "dc=ds, dc=mydomain, dc=ca", $filter)) throw \Exception("Error in search query: ".ldap_error($lconn));
$output = ldap_get_entries($lconn, $result);
}else{
$output='bind failed';
}
} else {
$output= 'connection failed';
}
它 returns 预期的结果数。
另一方面,此查询使用 Symfony 3 的 Ldap 组件完成 returns 0 个结果:
//use Symfony\Component\Ldap\Ldap
$ldap = Ldap::create('ext_ldap', array(
'host' => 'ds.mydomain.ca',
'version' => 3,
'debug' => true,
'referrals' => false,
));
$ldap->bind('webuser', 'password');
$q = $ldap->query("dc=ds, dc=nrc, dc=ca", "(&(sn=Smith)(givenname=J*))");
$output = $q->execute();
知道为什么当 Symfony ldap 查询的所有选项都应该与我用于裸 php 查询的选项相同时它会失败吗?
我reposted this question on the Symfony github. @ChadSikorra也在场。他清楚地说明了我的问题是什么。这是他的解释:
If you look at the collection class, nothing is done with the result resource until initialize() is called in the class. If you do return array('output' => array('bare' => $bare, 'symfony' => $symf->toArray())); it will call initialize and you'll see the entries populated in the class. Unless there's something else going on.
您在使用最新的 3.1+ 版本时仍然遇到此问题吗?
抱歉,我不常去 Stack Overflow,大部分时间都花在 Github 上,所以我之前没有看到你的问题。
正如@ChadSikorra 所说,您应该使用结果集合的 toArray() 方法 class,或者您应该直接迭代结果。
实现是为了以内存高效的方式遍历结果,默认情况下不会将所有结果存储在数组中,但 toArray() 方法可以为您完成此操作。在幕后,它实际上使用适当的 PHP 函数 (iterator_to_array) 将生成的 itératif 转换为数组。
顺便说一句,迭代器和 toArray() 函数调用之间曾经存在一些不一致,但在最近的版本中已得到修复。
干杯!