2

我无法从 PHP 中的 LDAP 属性中检索一些数据。

我连接到 LDAP,执行查询,并将结果存储在 var 中,如下所示:

$info = ldap_get_entries($connect, $sr);

现在,我可以将所需的大部分 LDAP 属性存储在会话变量中,如下所示:

        $_SESSION['accountFirstName'] = $info[0]['givenname'][0];
        $_SESSION['accountLastName'] = $info[0]['sn'][0];
        $_SESSION['accountEmail'] = $info[0]['mail'][0];

这些工作正常..没问题。但是,我需要存储另一个变量。我相信它是一个关联数组。出于某种原因,无论我做什么,我都会收到NOTICE: Undefined index针对该特定属性的警告。我已经尝试像上面的演示一样存储它,但老实说,我不完全确定属性名称两端的 [0] 索引是什么意思。我不熟悉 LDAP,坦率地说,设置非常混乱.

所以我想我的问题是:

  • 如何访问从 LDAP 查询返回的关联数组?

  • “未定义的索引”是什么意思?这是否意味着该属性不存在,或者它在提供的索引中不存在?

  • 如何测试我的 LDAP 查询以查看变量是否存在?

  • 执行查询的帐户可能没有足够的 LDAP 访问权限(该项目是针对一所大学的,并且有很多繁文缛节)。我有什么方法可以通过代码验证吗?

谢谢!对于所提供的信息含糊不清,我深表歉意,我现在不能太张嘴。

4

6 回答 6

4

问题不在于ldap_get_entries()方法或 LDAP,而是返回的数据。

NOTICE: Undefined index错误表明您的数组中的索引不存在。在这种情况下,您收到的数据很可能没有诸如givennameor之类的值mail,但它也可能是[0]其中一个数组中的(或“第一条记录”)。

文本/字符串索引值,例如givennameor sn,将被定义为“关联数组”。您正在正确访问该数据$info[0]['givenname'];

要检查 PHP 中是否存在索引,可以使用isset(),例如:

if (isset($info[0]['givenname'])) {
    // process data here
}

作为一种快速完成任务的方法,您可以使用以下方法:

if (count($info) > 0) {
    $_SESSION['accountFirstName'] = (isset($info[0]['givenname']) && isset($info[0]['givenname'][0])) ? $info[0]['givenname'][0] : '';
}

如果您需要一长串值,我建议您编写类似于以下内容的内容来为您自动处理它:

$fields = array(
    'accountFirstName' => 'givenname',
    'accountLastName' => 'sn',
    'accountEmail' => 'mail'
);

$info = $info[0];
foreach ($fields as $field => $ldapField) {
    // check if the value exists; otherwise set it to an empty-string
    $_SESSION[$field] = (isset($info[$ldapField]) && isset($info[$ldapField][0])) ? $info[$ldapField][0] : '';
}
于 2012-07-25T19:54:14.807 回答
2

echo '<pre>';
var_dump($info);
echo '</pre>';

看看数据的结构,然后你就会知道如何访问它

于 2012-07-25T19:52:14.760 回答
1

解释未定义索引的最佳方法是举例:

$myArray = array(
    0 => 'val 1',
    1 => 'val 2',
    'apple' => 'cucumber',
);

// If I try to access $myArray['lemon'] I'm going to get an "undefined index" error because that index IS NOT DEFINED (similar to "array index out of bounds").  

如果索引 0 给您此错误,则您尝试访问的数组可能未定义或为空。

于 2012-07-25T19:53:50.953 回答
1

0 只是它试图在 $info 数组上访问的索引。第一个元素是一个索引为“givenname”(与数字索引相对的字符串)的数组,并且该数组包含另一组数组,您正在尝试访问其中的第一个元素。所以你的结构必须是这样的

$info = array(
  [0] => array(
      'givenname' => array(
          [0] => 'test',
          [1] => 'other data or possibly an array'
      ) 
   )
);
于 2012-07-25T19:55:09.733 回答
1

LDAP 的特点是一个属性可以“指向”另一个属性。这就是条目以这种方式表示的原因:

//$ldapResults = ldap_get_entries(xxx)
//$ldapResults['count'] = 1
//$ldapResults[0] = array('dn' => array('count' => 1, array('CN=XXXX'))

因此,当您想要查看 ldap 结果时,您需要知道从 LDAP 中提取的数据类型。您可以直接访问数据,也可以简单地循环访问$ldapResults[0]包含我认为最重要信息的数据。

未定义的索引可能意味着该属性不存在或不在您指定的索引处。您可以使用简单的isset. 现在,如果您不知道要返回什么样的结果,您可能想要转储结果。

于 2012-07-25T19:58:28.627 回答
1

属性可以是多值的,因此是数组。一个属性是否可以在一个条目中多次出现在模式属性定义中定义。LDAP 客户端应该访问模式以确定语法、匹配规则、排序规则以及属性是否是多值的。例如,如果使用标准模式,“givenName”是多值的。

于 2012-07-26T01:31:42.130 回答