Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Равнозначность регистра

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Как реализовать равнозначность регистра
Haron
Отправлено: 20 Февраля, 2011 - 16:48:05
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




Возникла проблема со входом\регистрацией пользователей на одном веб-портале. Проблема в том, что например, "Вася" и "ВАСЯ" - система считает разными именами.

А нужно сделать так, чтобы "Вася", "ВАСЯ", "ВаСя" и пр.. - считались одним именем, и проблем со входом не возникало.

Как это можно проще всего реализовать?

В голове пока такой алгоритм:
- Берём отправленное из формы имя.
- Генерим массив из всевозможных вариантов имени в разных регистрах.
- Ищем имя в получившемся массиве.
- Если в массиве найдено - всё ОК. Если нет - в газенваген...

Может проще можно?


-----
И чё?
 
 Top
OrmaJever
Отправлено: 20 Февраля, 2011 - 16:57:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




А как хранится имя? mysql регистронезависимая бд и при выборке даных Вася и ВАСЯ одно и тоже.
strtoupper() и strtolower()


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Haron
Отправлено: 20 Февраля, 2011 - 17:13:46
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




Хм... Имя хранится как есть, в колонке с типом varchar. А ещё, СOLLATION таблиц - utf8_bin. Так что о регистронезависимости базы можно забыть.

Вижу такой вариант:

1). Создаём в таблице юзеров дополнительную колонку, username_normal к примеру.
2). При регистрации записываем туда strtolower($name)

При входе юзера в систему - приводим его имя к нижнему регистру, и ищем в базе.
Итог: ВаСя и ВАСЯ - нормально опознаются как Вася.

При регистрации, снова приводим жедаемое имя к нижнему регистру, ищем в базе. Если нету - позволяем идти дальше, если есть - просим придумать другое имя.

Тогда другой вопрос, как эти функции работают с русскими буквами?

(Отредактировано автором: 20 Февраля, 2011 - 17:17:06)



-----
И чё?
 
 Top
OrmaJever
Отправлено: 20 Февраля, 2011 - 17:16:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Haron пишет:
Имя хранится как есть, в колонке с типом varchar.

а как берётся из базы? Покажите процес авторизации.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Invert
Отправлено: 20 Февраля, 2011 - 17:20:55
Post Id



Частый гость


Покинул форум
Сообщений всего: 223
Дата рег-ции: Нояб. 2010  


Помог: 5 раз(а)




Я не спец. в БД, но регулярка с i решит эту проблему.
 
 Top
Мелкий Супермодератор
Отправлено: 20 Февраля, 2011 - 17:21:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




OrmaJever пишет:
mysql регистронезависимая

Зависит от используемой кодировки сравнения. cs — case sensitive — чувствительно к регистру, ci — case insensitive — не чувствительно.
(Добавление)
Haron пишет:
А ещё, СOLLATION таблиц - utf8_bin. Так что о регистронезависимости базы можно забыть.

А что мешает выдать непосредственно полю utf8_unicode_ci ?


-----
PostgreSQL DBA
 
 Top
Haron
Отправлено: 20 Февраля, 2011 - 17:32:02
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




Вот собственно, функция.

PHP:
скопировать код в буфер обмена
  1. function check_user_rights($login, $password)
  2. {
  3.         global $control;
  4.         global $db;
  5.  
  6.         $login = $control -> prepare($login);
  7.         $password = $control -> prepare($password);
  8.  
  9.         $row = $db -> selectRow('SELECT * FROM tbl_users WHERE username = ?', $login); 
  10.         if(empty($row))
  11.         {
  12.                 # пользователя не существует
  13.                $control -> securelog('USER_INCORRECT');
  14.                 return 0;
  15.         }
  16.  
  17.         elseif(!empty($row))
  18.         {
  19.                 $username = $row['username'];
  20.                 $out_hash = $row['user_password'];
  21.                
  22.                 if (check_hash($password), $out_hash))
  23.                 {
  24.                         # пользователь успешно авторизован (пароль верный)
  25.                         return 1;
  26.                 }
  27.                 else
  28.                 {
  29.                         # неверный пароль
  30.                        $control -> securelog('PASS_INCORRECT');
  31.                         return 2;
  32.                 }
  33.         }
  34. }


Класс prepare - готовит логин с паролем (фильтрация "нехороших" вещей и т. д..)


Цитата:
А что мешает выдать полю utf8_unicode_ci

Особенности движка, и его "связей с другими плюшками". Менять к сожалению нельзя ничего.

(Отредактировано автором: 20 Февраля, 2011 - 17:34:51)



-----
И чё?
 
 Top
OrmaJever
Отправлено: 20 Февраля, 2011 - 17:41:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Вот примерно так можно попробовать.
CODE (SQL):
скопировать код в буфер обмена
  1. "SELECT * FROM `table` WHERE LOWER(`login`) = '".strtolower($login)."'"


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Haron
Отправлено: 20 Февраля, 2011 - 17:46:28
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




Мне тоже эта мысль пришла в голову, но с русскими буквами - идея обречена на провал. В это вся и проблема Недовольство, огорчение


-----
И чё?
 
 Top
OrmaJever
Отправлено: 20 Февраля, 2011 - 17:49:57
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




а что руские буквы не делает в нижний регистр? Однако


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Haron
Отправлено: 20 Февраля, 2011 - 17:54:16
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




К сожалению до сих пор PHP не умеет их корректно обрабатывать.
Проверить фейл можно так:

Создаём файло test.php (Естетсвенно в кодировке utf-8)
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2. header("Content-Type: text/html; charset=utf-8");
  3. $var = 'ПРОВЕРКАРУССКИХБУКАФФФ';
  4. echo strtolower($var);
  5. ?>
  6.  

Выведет какую-то хрень из ромбиков с вопросиками.

Тем не менее, проблему можно решить, заюзав модуль mbstring:
CODE (htmlphp):
скопировать код в буфер обмена
  1. echo mb_strtolower('ПРОВЕРКАРУССКИХБУКАФФФ', 'UTF-8');


Однако, сей волшебный модуль также юзать низя...

(Отредактировано автором: 20 Февраля, 2011 - 17:57:56)



-----
И чё?
 
 Top
Мелкий Супермодератор
Отправлено: 20 Февраля, 2011 - 17:56:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Haron, mb_strtolower?


-----
PostgreSQL DBA
 
 Top
Haron
Отправлено: 20 Февраля, 2011 - 17:59:20
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




Мелкий пишет:


Да знаю я. Подправил пост вверху Улыбка


-----
И чё?
 
 Top
Мелкий Супермодератор
Отправлено: 20 Февраля, 2011 - 18:01:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Тогда пошли наркоманить:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. header("Content-Type: text/html; charset=utf-8");
  3. $var = 'ПРОВЕРКАРУССКИХБУКАФФФ';
  4. echo iconv("cp1251","utf8",strtolower(iconv("utf-8","cp1251",$var)));
  5. ?>


-----
PostgreSQL DBA
 
 Top
Haron
Отправлено: 20 Февраля, 2011 - 18:04:44
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




Спасибо большое, вопрос решён!


-----
И чё?
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB