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インデックスが存在しないことを示しています。givennameこの場合、受信しているデータがやなどの値を持っていない可能性が最も高いですが、これらの配列の 1 つ (または「最初のレコード」) である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] : '';
}
于 2012-07-25T19:54:14.807 に答える
2

行う

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

データの構造を確認すると、データへのアクセス方法がわかります

于 2012-07-25T19:52:14.760 に答える
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

未定義のインデックスを説明する最良の方法は、次の例です。

$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

属性は複数の値を持つことができるため、配列です。属性がエントリに複数回存在できるかどうかは、スキーマ属性定義で定義されます。LDAP クライアントはスキーマにアクセスして、構文、一致規則、順序付け規則、および属性が複数値かどうかを判断する必要があります。たとえば、「givenName」は、標準スキーマが使用されている場合、多値です。

于 2012-07-26T01:31:42.130 に答える
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 に答える