ldap_add и русские значение

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
skeletor
майор
Сообщения: 2548
Зарегистрирован: 2007-11-16 18:22:04

ldap_add и русские значение

Непрочитанное сообщение skeletor » 2010-07-02 15:38:41

Есть html-форма, через неё методом POST передаются значения полей, которые заполнил пользователь. Вот код формы:

Код: Выделить всё

<form action="ldapadd.php" method=post>
<table border=0>
<tr bgcolor=#cccccc>
  <td width=150>Item</td>
  <td width=15>Entire</td>
</tr>
<tr>
  <td>CN</td>
  <td align=left><input type="text" name="id_cn" size=120 maxlength=120></td>
</tr>
<tr>
  <td>SN</td>
  <td align=left><input type="text" name="id_sn" size=120 maxlength=120></td>
</tr>
<tr>
  <td>EMAIL</td>
  <td align=left><input type="text" name="id_mail" size=120 maxlength=120></td>
</tr>
<tr>
  <td colspan=2 align=center><input type=submit value="Submit Order"></td>
</tr>
</table>
</form>
А вот код ldapadd.php

Код: Выделить всё

<?

  // create short variable names
$id_cn = $_POST['id_cn'];
$id_sn = $_POST['id_sn'];
$id_mail = $_POST['id_mail'];

//$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];


$ldaphost='ldap://10.0.3.185';
$ldapport='389';
$ldapuser='cn=book_rw,ou=people,dc=domain,dc=lin';
$ldappassword='book_rw';
$dc='ou=addressbook,dc=domain,dc=lin';
$attr = array('cn','mail','sn');
$filter='(&(objectclass=*))';

$ldapconn = ldap_connect($ldaphost, $ldapport)
          or die("Could not connect to $ldaphost" . ldap_error($ldapconn));

if (ldap_set_option($ldapconn,LDAP_OPT_PROTOCOL_VERSION,3))
{
    echo "Using LDAP v3";
}else{
        echo "Failed to set version to protocol 3";
}


if ($bind=ldap_bind($ldapconn, $ldapuser, $ldappassword)) {
    echo("Login correct");
}
else
{
    echo("Unable to bind to server.</br>");
    echo("msg:'".ldap_error($bind)."'</br>");
}


$info["cn"] = $id_cn;
$info["sn"] = $id_sn;
$info["mail"] = $id_mail;
$info["objectclass"] = "inetOrgPerson";

ldap_add($ldapconn,"cn=$id_cn,$dc",$info) or die("Could not add new entry!" . ldap_error($ldapconn));

ldap_unbind($ldapconn);

?>
Проблема заключается в том, что если пользователь вводит текст на кирилице, то вылазит ошибка (если латиницей, то всё нормально):

Код: Выделить всё

Warning: ldap_add() [function.ldap-add]: Add: Invalid DN syntax in /var/www/localhost/htdocs/ldapadd.php on line 69
Could not add new entry!Invalid DN syntax
Сервер локализирован под UTF-8. Если в самом ldapadd.php написать ручками на русском значения то отрабатывает нормально. Если выводить передаваемые от формы значения, то тоже выводится нормально.

Подскажите, как можно решить эту проблему?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
skeletor
майор
Сообщения: 2548
Зарегистрирован: 2007-11-16 18:22:04

Re: ldap_add и русские значение

Непрочитанное сообщение skeletor » 2010-07-02 16:33:52

Подсказали на одном из форумов про функцию iconv. Пару экспериментов с iconv и заработало. В итоге блок
// create short variable names

Код: Выделить всё

 $id_cn = $_POST['id_cn'];
 $id_sn = $_POST['id_sn'];
 $id_mail = $_POST['id_mail'];
заменить на такой

Код: Выделить всё

$id_cn = iconv("utf-8","utf-8",$_POST['id_cn']);
$id_sn = iconv("utf-8","utf-8",$_POST['id_sn']);
$id_mail = iconv("utf-8","utf-8",$_POST['id_mail']);
Странно, но именно такой вариант заработал. Не могу понять почему.