Проблема - прога не отождествляет "логин" и "Логин" в базе на русском...

DanGien

Новичок
Проблема - прога не отождествляет "логин" и "Логин" в базе на русском...

Юзеры регистрируются, зачастую в качестве логина вводя запись русскими буквами, да еще и в разном регистре.

В результате частенько получается так, что в базе при входе в аккаунт выводятся данные нескольких юзеров.

Как я обрабатываю переданный логин.

$login = trim ($login);
$login = strtolower ($login); //убираем заглавные буквы

// убираем двойные пробелы
while (stristr($login," ")) $login=str_replace (" ","",$login);

// удаляем все лишнее (знаки препинания, и прочее)
$login = eregi_replace ('[.?,!()#":;|]', '', $login);

$login = trim ($login); //еще раз убираем пробелы по концам

$query = "SELECT * FROM user WHERE login=binary('$login')";
$result = mysql_query ($query);

Так вот, при этом запросе если в базе есть уже "саша", а юзер ввел "Саша", в базу спокойненько записывается логин "Саша".
А при заходе юзер "саша" видит и свои данные, и данные от "Саша". Как с этим бороться?
 

Фанат

oncle terrible
Команда форума
кхммм.
а ЗАЧЕМ ты делаешь такой запрос?

-~{}~ 25.02.06 16:03:

а, главное, непонятно, чего ты хочешь.
чтобы новые юзеры с похожими логинами могли регистрироваться?
или чтобы при выводе им чужие данные не выдавались?

А при заходе юзер "саша" видит и свои данные, и данные от "Саша".
постой.
что значит- видит?
а пароль у них тоже совпадает?
 

DanGien

Новичок
Фанат, делаю запрос вида


$query = "SELECT * FROM user WHERE login=binary('$login')";
$result = mysql_query ($query);

чтобы узнать, есть ТАКОЙ же логин в базе или нет. Если ЕСТЬ, то юзеру пишется, что введенный им логин есть. Если НЕТ, то далее идет регистрация юзера, т.е. все его данные вносятся в базу.

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

Далее. Когда он входит в свой аккаунт, после авторизации (логин и пароль) инфо выводится, опираясь на логин как идентификатор аккаунта. Поэтому делается выборка из базы, где логин = "Саша", выводятся при этом данные "саша" и "Саша". Вот такой бардак.

Вопрос вот в чем. Как сделать все же, чтобы система считала "Саша" и "саша" одним и тем же логином, т.е. если в базе есть "саша", то чтобы не регился юзер с логином "Саша"?

Непонятно, почему вообще такие юзеры регятся, ведь я в самом начале полученный логин привожу к маленьким буквам:

$login = strtolower ($login); //убираем заглавные буквы

Т.е. по идее, если юзер пишет "Саша", должен получиться после обработки "саша", ну а такой логин в базе уже есть:) Но так не происходит, в базу записывается логин "Саша"...
 

Фанат

oncle terrible
Команда форума
юзер по идее не должен регистрироваться
по какой идее?
какой конкретно участок кода за это отвечает?
как это действует?
должен получиться после обработки "саша",
а получается?
а ты проверял?
а кто должен за этим следить? я?
 

DanGien

Новичок
Автор оригинала: Фанат
по какой идее?
какой конкретно участок кода за это отвечает?
как это действует?
$login = trim ($login);
$login = strtolower ($login); //убираем заглавные буквы

// убираем двойные пробелы
while (stristr($login," ")) $login=str_replace (" ","",$login);

// удаляем все лишнее (знаки препинания, и прочее)
$login = eregi_replace ('[.?,!()#":;|]', '', $login);

$login = trim ($login); //еще раз убираем пробелы по концам

$query = "SELECT * FROM user WHERE login=binary('$login')";
$result = mysql_query ($query);

$i = mysql_num_rows($result);
$k = 0;

if ($i != $k)
{
print "Ошибка! Такой логин уже есть! Вернитесь обратно и введите другой логин!";
@include ('./../inc/footer.php');
exit;
}
else

--регится юзер


а получается?
а ты проверял?
а кто должен за этим следить? я?
Блин, проверял, после обработки на локальном компе при вводе "Саша" логин равен "саша". На сервере остается "Саша". Тогда второй вопрос - почему так? Не работает команда

$login = strtolower ($login);
 

Фанат

oncle terrible
Команда форума
я не спрашивал тебя, как регится юзер.
я тебя спросил, как обеспечивается то, что
юзер по идее не должен регистрироваться
ты можешь ответить на этот вопрос?
Ты понимаешь, что я пишу?
 

DanGien

Новичок
Я же написал код, не видно что ли?

$query = "SELECT * FROM user WHERE login=binary('$login')";
$result = mysql_query ($query);

$i = mysql_num_rows($result);
$k = 0;

if ($i != $k)
{
print "Ошибка! Такой логин уже есть! Вернитесь обратно и введите другой логин!";
@include ('./../inc/footer.php');
exit;
}

Если введенный юзером логин уже есть в базе, юзеру пишется ошибка и все на этом заканчивается. Т.е. юзер НЕ регистрируется. Я понятно отвечаю?

Проблема в том, что не срабатывает на сервере $login = strtolower ($login);

А какого, непонятно...
 

kruglov

Новичок
Эээ... Как так - при регистрации повторяемость логина не обнаруживается, а при входе на сайт - обнаруживается?

Может, соответствующие коды как-нибудь по одинаковому принципу сделать?
 

Фанат

oncle terrible
Команда форума
DanGien
нет, не видно.
я хочу, чтобы ты объяснил словами - как обеспечивается то, что подобный логин не регистрирвется.
Какой механизм при этом применяется? Как он действует

-~{}~ 26.02.06 00:34:

Ты же совершаешь осмысленные действия?
Или, как обезьяна, лепишь код от балды?
Вот если осмысленные - то и приведи здесь их смысл.
 

DanGien

Новичок
Фанат, смысл в том, что идет запрос в базу - есть ли логин, равный тому, который мы получили. Если при выборке результат не равен нулю (записи в базе есть с таким логином), юзер не регится. В противном случае регится.

А проблема в том, что strtolower не приводит русские симвооы к нижнему регистру. Нашел решение такое:

setlocale (LC_ALL, 'ru_RU.CP1251');

НО я же не знаю, как юзер введет логин, русскими символами или еще какими-то...

-~{}~ 26.02.06 00:41:

kruglov, причина нашлась, при вводе русскими буквами логина он не приводится к нижнему регистру, не работает
strtolower. Поэтому в базу вносится "Саша", даже если есть в базе "саша". А если входит в базу "Саша" или "саша", выводится сразу инфо от "саша" и "Саша".

Решение - приводить к нижнему регистру сразу логин при регистрации. Но вот проблема с русскими символами...

-~{}~ 26.02.06 00:46:

Все, проблему решил.

setlocale (LC_ALL, 'ru_RU.CP1251');

Работает с русским и латинницей тогда:)
 

kruglov

Новичок
DanGien
locale это хорошо, это тоже решение.

Но непонятно, почему вы не хотели проверять существование пользователя в базе тем же способом, каким определяли, что его там 2 и более раз (выводится сразу инфо от "саша" и "Саша") .
 

DanGien

Новичок
kruglov, посмотрел еще раз вниматльно, действительно, при входе юзера данные берутся так

$query = "SELECT * FROM user WHERE login='$login'";
$result = mysql_query ($query);

Т.е. не был проставлен login=binary('$login')";
Исправил и это. Теперь должен и регистр нижний делать, и различать "саша" и "Саша" как разные логины, насколько понимаю. Двойная защита будет:))
 
Сверху