Модераторы: Aliance, skyboy, MoLeX, ksnk

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> проверка на кирилицу 
V
    Опции темы
Нурик Сакура
Дата 23.3.2006, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почти японец...
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 17.12.2004
Где: Украина, Киев

Репутация: нет
Всего: 2



Значит так. Вот что я только что напроверял. Вынес проверку поля в отдельный файл и запустил. Все заработало. А вот в файле регистрации не хочет (оба файла в кодировке ANSI).

Вот запрос к функции после нажатия на кнопку "Зарегаться":
Код

field_validator("login name", $_POST["login"], "alphanumeric", 4, 15);


Вот ПОЛНЫЙ код всей функции field_validator:
Код

function field_validator($field_descr, $field_data, $field_type, $min_length="", $max_length="", $field_required=1)
{
    global $messages;

    if(!$field_data && !$field_required)
    {
        return;
    }

    $field_ok=false;

    $email_regexp="^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|";
    $email_regexp.="(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";

    $data_types=array(
                        "email"=>$email_regexp,
                        "digit"=>"^[0-9]$",
                        "number"=>"^[0-9]+$",
                        "alpha"=>"^[a-zA-Zа-яА-Я]+$",
                        "alpha_space"=>"^[a-zA-Zа-яА-Я ]+$",
                        "alphanumeric"=>"^[a-zA-Zа-яА-Я0-9]+$",
                        "alphanumeric_space"=>"^[a-zA-Zа-яА-Я0-9 ]+$",
                        "string"=>""
                     );

    if ($field_required && empty($field_data))
    {
        $messages[] = "$field_descr is a required field.";
        return;
    }

    if ($field_type == "string")
    {
        $field_ok = true;
    }
    else
    {
        $field_ok = ereg($data_types[$field_type], $field_data);
    }

    if (!$field_ok)
    {
        $messages[] = "Please enter a valid $field_descr.";
        return;
    }

    if ($field_ok && $min_length)
    {
        if (strlen($field_data) < $min_length)
        {
            $messages[] = "$field_descr is invalid, it should be at least $min_length character(s).";
            return;
        }
    }

    if ($field_ok && $max_length)
    {
        if (strlen($field_data) > $max_length)
        {
            $messages[] = "$field_descr is invalid, it should be less than $max_length characters.";
            return;
        }
    }
}


При передаче в поле $_POST["login"] из формы логина "Нурик" выводится сообщение: "Please enter a valid $field_descr." А вот вынесенная в отдельный файл проверка:
Код

<?php
$field_ok=false;
$field_data = "Нурик";
$field_type = "alphanumeric";

$data_types=array(
            "email"=>$email_regexp,
            "digit"=>"^[0-9]$",
            "number"=>"^[0-9]+$",
            "alpha"=>"^[a-zA-Zа-яА-Я]+$",
            "alpha_space"=>"^[a-zA-Zа-яА-Я ]+$",
            "alphanumeric"=>"^[a-zA-Zа-яА-Я0-9]+$",
            "alphanumeric_space"=>"^[a-zA-Zа-яА-Я0-9 ]+$",
            "string"=>""
         );

$field_ok = ereg($data_types[$field_type], $field_data);

if ($field_type == "string")
{
    $field_ok = true;
}
else
{
    $field_ok = ereg($data_types[$field_type], $field_data);
}

print $field_ok;
?>


Все отлично работает и выводит единицу.

Это сообщение отредактировал(а) Nurik - 23.3.2006, 15:35
--------------------
- Приказы не обсуждаются!- Не объясняются и не выполняются. (с) фанфик на Hellsing
PM MAIL   Вверх
madFobos
Дата 20.4.2006, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.12.2005

Репутация: нет
Всего: 3



Вобщем, не мучайся. Самое простое это вместо А-Яа-я использовать \x7F-\xFF, это шестнадцатеричные коды русских букв (хотя я не уверен, что их ereg поддерживате, вот preg_match точно).

Другой вариант заключается в том, что все проверки строк основаны на текущей локали, так что выстави
setlocalce(LC_ALL, 'rus') //Название локалей надо на хостинге смотреть
или хотя бы проверь какая у тебя стоит на сравнение строк с помощью:
Код

echo setlocale(LC_COLLATE, 0);
 
PM MAIL   Вверх
Mal Hack
Дата 21.4.2006, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Модератор: а при чем тут Базы Данных? Что, не может отличить текстовую информацию от БД? Перенесено. 
PM ICQ   Вверх
Нурик Сакура
Дата 13.1.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почти японец...
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 17.12.2004
Где: Украина, Киев

Репутация: нет
Всего: 2



Вобщем, сейчас вот вернулся к этому вопросу. Кажется, у меня получилось найти решение.

Во-первых, у меня в php.ini стояло раньше не default_charset = "utf8", а что-то другое, потому русский язык не поддерживался и приходилось писать все на английском. Сейчас поставил и все пашет как надо.

Во-вторых, разобрался наконец-то с регуляркой. Теперь можно спокойно делать русский ник и он будет выводиться на экран нормально.

Код

function field_validator($field_descr, $field_data, $field_type, $min_length, $max_length, $field_required=1)
{
    global $messages;
    global $lang;

    if(!$field_data && !$field_required)
    {
        return;
    }

    $field_ok=false;

    $email_regexp="^([a-zA-Z0-9_\.\-]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|";
    $email_regexp.="(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";

    $data_types=array(
                        "email"=>$email_regexp,
                        "digit"=>"^[0-9]$",
                        "number"=>"^[0-9]+$",
                        "alpha"=>"^[a-zA-Z]+$",
                        "alpha_space"=>"^[a-zA-Z ]+$",
                        "alphanumeric"=>"^[a-zA-Z0-9_\-]+$",
                        "alphanumeric_space"=>"^[a-zA-Z0-9_ \-]+$",
                        "alpha_ru"=>"^[a-zA-Zа-яА-Я]+$",
                        "alpha_space_ru"=>"^[a-zA-Zа-яА-Я ]+$",
                        "alphanumeric_ru"=>"^[a-zA-Zа-яА-Я0-9_\-]+$",
                        "alphanumeric_space_ru"=>"^[a-zA-Zа-яА-Я0-9_ \-]+$",
                        "string"=>""
                     );

    if ($field_required && empty($field_data))
    {
        $messages[] = "<b>".$field_descr."</b> " . $lang['err_is_required'];
        return;
    }

    if ($field_type == "string")
    {
        $field_ok = true;
    }
    else
    {
        $field_ok = ereg($data_types[$field_type], $field_data);
    }

    if (!$field_ok)
    {
        $messages[] = $lang['err_invalid_data_begin'] . $field_descr . $lang['err_invalid_data_end'];
        return;
    }

    if ($field_ok && $min_length)
    {
        if (strlen($field_data) < $min_length)
        {
            $messages[] = "<b>".$field_descr."</b>" . $lang['err_min_length_begin'] . $min_length . $lang['err_length_end'];
            return;
        }
    }

    if ($field_ok && $max_length)
    {
        if (strlen($field_data) > $max_length)
        {
            $messages[] = "<b>".$field_descr."</b>" . $lang['err_max_length_begin'] . $max_length . $lang['err_length_end'];
            return;
        }
    }
}

Для тех, кто не заметил разницы, обьясняю. Ввиду того, что логин у меня должен быть только на английском, а имя может содержать и русские символы, мне пришлось продублировать записи в масиве $data_types, указав для русского нужные символы.

Проверять после этого стало все успешно регистрировать. Но при выводе из БД выдавало "???" вместо имени. Еще вчера я столкнулся с проблемой кодировки текста от пользователя, потому сделал ф-цию mk_txt (просто для удобства):
Код

function mk_txt($act, $txt)
{
    switch($act)
    {
        case "enc":
            $text = utf8_encode($txt);
            break;
        case "dec":
            $text = utf8_decode($txt);
            break;
    }
    return $text;
}

И теперь перед каждым вводом и выводом инфы, которая может быть на русском, я юзаю эту ф-цию. Все пашет идеально =) Юзайте, кому нужно, авось поможет. smile 
--------------------
- Приказы не обсуждаются!- Не объясняются и не выполняются. (с) фанфик на Hellsing
PM MAIL   Вверх
Mal Hack
Дата 13.1.2007, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Цитата(Нурик Сакура @  13.1.2007,  11:34 Найти цитируемый пост)
Во-первых, у меня в php.ini стояло раньше не default_charset = "utf8", а что-то другое, потому русский язык не поддерживался и приходилось писать все на английском. Сейчас поставил и все пашет как надо.

Вот как раз при utf8 русский замечательно поддерживается.

Изврат. Надо настроить нормально кодировку БД и установить лоакаль setlocale
PM ICQ   Вверх
Нурик Сакура
Дата 13.1.2007, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почти японец...
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 17.12.2004
Где: Украина, Киев

Репутация: нет
Всего: 2



Мм.. Ты не понял, у меня стояло НЕ utf8, а что-то другое, я не помню уже что. Я поставил utf8 и все запахало. Что касается кодировки БД, то там стоит utf8_unicode_ci. Но почему-то при вставке русского языка получается фигня какая-то.
--------------------
- Приказы не обсуждаются!- Не объясняются и не выполняются. (с) фанфик на Hellsing
PM MAIL   Вверх
Mal Hack
Дата 13.1.2007, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Цитата(Нурик Сакура @  13.1.2007,  14:20 Найти цитируемый пост)
Но почему-то при вставке русского языка получается фигня какая-то. 

uft8_general_ci там должно вроде стоять, не помню все их виды...
PM ICQ   Вверх
Нурик Сакура
Дата 13.1.2007, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почти японец...
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 17.12.2004
Где: Украина, Киев

Репутация: нет
Всего: 2



Сейчас проверю.

Добавлено @ 14:42 
Посмотрел. Поменял в БД везде кодировку на uft8_general_ci и все заработало без ф-ции mk_txt =)
Сейчас еще проверю отправку ПМок, если все работает - то тогда тема точно решена =)
--------------------
- Приказы не обсуждаются!- Не объясняются и не выполняются. (с) фанфик на Hellsing
PM MAIL   Вверх
Нурик Сакура
Дата 13.1.2007, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почти японец...
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 17.12.2004
Где: Украина, Киев

Репутация: нет
Всего: 2



С ПМками проблема. Вобщем, вот та часть кода, которая отвечает за запись данных в БД:
Код

if($action == compose2)
{
    field_validator($lang['recipient_field'], $_POST['to'], "alphanumeric_space_ru", 3, 16);
    field_validator($lang['subject_field'], $_POST['subject'], "string", 1, 50);
    field_validator($lang['message_field'], $_POST['message'], "string", 1, 5000);

    $recipient = $_POST['to'];
    $msg = $_POST['message'];

    if($recipient == $char_name)
    {
        $messages[] = $lang['err_selfsending'];
    }

    $tools->checkCharExistance($recipient);
    if($tools->char_check_result == 1)
    {
        $tools->getCharAccID($recipient);
        $recipient_id = $tools->char_acc_id;
    }
    else
    {
        $messages[] = $lang['err_wrong_recipient'];
    }

    if(empty($msg))
    {
        $messages[] = $lang['err_empty_message'];
    }

    if(empty($messages))
    {
        $sentdate = date("U");

        $msg_subject = $_POST['subject'];
        $msg_subject = htmlentities($msg_subject);
        $msg_text = $_POST['message'];
        $msg_text = nl2br(htmlentities($msg_text));

        $dbconn->connect();
        $query = "insert into mailbox (msg_sender, msg_recipient, msg_subject, msg_body, msg_status, msg_sentdate) values ('".$acc_id."', '".$recipient_id."', '".$msg_subject."', '".$msg_text."', 'unread', '".$sentdate."')";
        if(!($result = mysql_query($query, $dbconn->link)))
        {
            print("Unnable to work with <b>mailbox!</b><br>\n" .
                  "MySQL tells: " . mysql_error() . "<br>\n");
            exit;
        }
        $dbconn->disconnect($dbconn->link);
        print("<center>\n" .
              "    ".$lang['mailbox_sent_msg']."<br>\n".
              "    <a href=\"".$_SERVER['PHP_SELF']."?action=inbox\">".$lang['mailbox_return_inbox']."</a>\n" .
              "</center>\n");
    }
    else
    {
        print("<font color=red><br>\n");
        foreach($messages as $err_msg) print "\t".$err_msg."<br>\n";
        print("</font><br>\n");
        newPMform($recipient, $subject, "");
    }
}


Через форму передаются данные для записи в БД. В БД почему-то записывается не в таком формате "Íàçàð÷èê", как было записано русское имя персонажа, а вот в таком формате "&Euml;&icirc;&euml;&uuml;&divide;&egrave;&ecirc;". А при выводе получается не русский текст, а вот такая вот "Ïðèâåòèê" канитель  smile 

Это сообщение отредактировал(а) Нурик Сакура - 13.1.2007, 15:01
--------------------
- Приказы не обсуждаются!- Не объясняются и не выполняются. (с) фанфик на Hellsing
PM MAIL   Вверх
Нурик Сакура
Дата 13.1.2007, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почти японец...
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 17.12.2004
Где: Украина, Киев

Репутация: нет
Всего: 2



Я уже разобрался, что вся беда в htmlentities(), который русский текст превращает на то, что вставляется в БД. Но без него ведь никак... Или как-то по другому придется фильтровать то, что юзеры передают...
--------------------
- Приказы не обсуждаются!- Не объясняются и не выполняются. (с) фанфик на Hellsing
PM MAIL   Вверх
Нурик Сакура
Дата 13.1.2007, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почти японец...
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 17.12.2004
Где: Украина, Киев

Репутация: нет
Всего: 2



Как ни странно, но мануал мне помог решить проблему =)
Поставил вместо просто
Код

htmlentities($msg_subject);

вот такой вот вариант
Код

htmlentities($msg_subject, 0, "utf-8");

и все заработало. Вобщем, все вопросы решены.
--------------------
- Приказы не обсуждаются!- Не объясняются и не выполняются. (с) фанфик на Hellsing
PM MAIL   Вверх
madFobos
Дата 15.1.2007, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.12.2005

Репутация: нет
Всего: 3



Объясните мне одну вещь. Насколько я знаю проблемы с выводом символов ??? связаны с тем, что phpmysql библиотека использует по умолчанию кодировку latin для коннекта к базе, и с этим настройками кодировки самой базы ничего поделать нельзя. Или кодировка phpmysql зависит от default_charset в php.ini?


M
Mal Hack
Один топик один вопрос!


Это сообщение отредактировал(а) Mal Hack - 15.1.2007, 10:46
PM MAIL   Вверх
Закрытая темаСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0614 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.