我无法从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];
这些工作正常..没问题。但是,我需要存储另一个var。我相信它是一个关联数组。出于某种原因,无论我做什么,我都会收到针对该特定属性的NOTICE: Undefined index
警告。我试过像上面的演示一样存储它,但说实话我不完全确定属性名称两端的[0]索引是什么意思..我不熟悉LDAP,坦率地说这个设置很混乱。
所以我想我的问题是:
如何访问从LDAP返回的关联数组 查询?
'未定义的索引'是什么意思?这是否意味着那个 属性不存在,或者在提供的索引中不存在?
如何测试我的LDAP查询以查看变量是否存在?
执行查询的帐户可能不会 拥有足够的LDAP访问权限(该项目适用于大学 并且有很多繁文缛节)。我有什么方法可以验证 通过代码?
谢谢!我对所提供信息的模糊性表示歉意,我现在不能太开放了。
答案 0 :(得分:4)
问题不在于ldap_get_entries()
方法或LDAP本身 - 它是要返回的数据。
NOTICE: Undefined index
错误表明数组中的索引不存在。在这种情况下,您收到的数据很可能没有givenname
或mail
等值,但也可能是[0]
(或“第一个记录“)在其中一个阵列中。
文本/字符串索引值(例如givenname
或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] : '';
}
答案 1 :(得分:2)
DO
echo '<pre>';
var_dump($info);
echo '</pre>';
并查看数据的结构,然后您就会知道如何访问它
答案 2 :(得分: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给出了这个错误,那么您尝试访问的数组可能是未定义的或是空的。
答案 3 :(得分:1)
0只是它试图在$ info数组上访问的索引。第一个元素是一个索引为'givenname'的数组(字符串与数字索引相对),该数组包含另一组数组,您尝试访问第一个元素。所以你的结构必须是
$info = array(
[0] => array(
'givenname' => array(
[0] => 'test',
[1] => 'other data or possibly an array'
)
)
);
答案 4 :(得分: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
来测试它是否存在。现在,如果你不知道你要回到什么样的结果,你可能想要转储结果。
答案 5 :(得分:1)
属性可以是多值的,因此是数组。属性是否可以在条目中多次出现在schema属性定义中定义。 LDAP客户端应访问模式以确定语法,匹配规则,排序规则以及属性是否为多值。例如,如果使用标准模式,“givenName”是多值的。