PHP 中针对 LDAP 属性/关联数组的未定义索引警告


undefined index warning in PHP for LDAP attribute / associative array?

我在PHP中从LDAP属性中检索某些数据时遇到问题。

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

$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访问权限(该项目适用于大学而且有很多繁文缛节(。我有什么办法可以验证吗通过代码?

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

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

NOTICE: Undefined index错误指出数组中的索引不存在。在这种情况下,您接收的数据很可能没有 givennamemail 等值,但它也可能是其中一个数组中的[0](或"第一条记录"(。

文本/字符串索引值,如givennamesn,将被定义为"关联数组"。您正在正确访问该数据$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] : '';
}

do

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

并查看数据的结构,然后您将知道如何访问它

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

$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 出现此错误,则可能是您尝试访问的数组未定义或为空。

0 只是

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

$info = array(
  [0] => array(
      'givenname' => array(
          [0] => 'test',
          [1] => 'other data or possibly an array'
      ) 
   )
);

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

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

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

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

属性可以是多值的,因此是数组。属性是否可以在条目中多次存在是在架构属性定义中定义的。LDAP 客户端应访问架构以确定语法、匹配规则、排序规则以及属性是否为多值属性。例如,如果使用标准架构,则"givenName"是多值的。