PHP ldap_mod_replace失败,出现“存在类型或值”错误

时间:2013-06-04 09:18:35

标签: php active-directory ldap

我已经通过PHP API为LDAP创建了一个轻型模型管理器,以简化Active Directory中的对象管理。

一切运行正常,但是在更新多值属性时遇到问题,即使我更改了所有值,事务也因“存在类型或值”而失败,并且数据库中的属性未更改。

我使用的测试用例是为用户更改de多值“描述”字段。如果我添加新值或更改整个值数组,则事务总是失败。

代码的一部分如下:

    if (count($mod_attr) > 0)                                                                                                                                                                                                             
    {                                                                                                                                                                                                                                     
        $ret = @ldap_mod_replace($this->getHandler(), $dn, $mod_attr);                                                                                                                                                                    
        if ($ret === false)                                                                                                                                                                                                               
        {                                                                                                                                                                                                                                                 $this->log(sprintf("LDAP ERROR '%s' -- Modifying {%s}.", ldap_error($this->getHandler()), print_r($mod_attr, true)), \SlapOM\LoggerInterface::LOGLEVEL_CRITICAL);                                                             

            throw new LdapException(sprintf("Error while MODIFYING values <pre>%s</pre> in dn='%s'.", print_r($mod_attr, true), $dn), $this->getHandler(), $this->error);                                                                 
        }                                                                                                                                                                                                                                 

        $this->log(sprintf("Changing attribute {%s}.", join(', ', array_keys($mod_attr))));                                                                                                                                               
    }                                                                                       

可以找到完整的代码[在github上](https://github.com/chanmix51/SlapOM/blob/master/lib/SlapOM/Connection.php#L115 [github])。

日志显示以下行:

   2013-06-04 10:39:54 |                => MODIFY dn='CN=HUBERT Gregoire,OU=...
   2013-06-04 10:39:54 | => LDAP ERROR 'Type or value exists' -- Modifying {Array
(   
    [description] => Array
        (   
            [0] => Description 2
            [1] => Description 3
        )
)}

即使前面的值是["description" => ['Description 1']]。有什么我没有得到或做错了吗?

1 个答案:

答案 0 :(得分:1)

答案很简短:«描述不是一个多值领域»。像往常一样,错误信息是如此混乱,它导致我花了几个小时来解决错误的问题。

简而言之:LDAP错误20“存在类型或值”可能是您尝试在多值字段中插入两次相同的值,或者您尝试在单个值字段中插入多个值。