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

  • Автор темы Автор темы DanGien
  • Дата начала Дата начала

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);

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

-~{}~ 25.02.06 16:03:

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

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


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

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

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

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

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

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

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

Т.е. по идее, если юзер пишет "Саша", должен получиться после обработки "саша", ну а такой логин в базе уже есть:) Но так не происходит, в базу записывается логин "Саша"...
 
юзер по идее не должен регистрироваться
по какой идее?
какой конкретно участок кода за это отвечает?
как это действует?
должен получиться после обработки "саша",
а получается?
а ты проверял?
а кто должен за этим следить? я?
 
Автор оригинала: Фанат
по какой идее?
какой конкретно участок кода за это отвечает?
как это действует?
$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);
 
я не спрашивал тебя, как регится юзер.
я тебя спросил, как обеспечивается то, что
юзер по идее не должен регистрироваться
ты можешь ответить на этот вопрос?
Ты понимаешь, что я пишу?
 
Я же написал код, не видно что ли?

$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);

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

Может, соответствующие коды как-нибудь по одинаковому принципу сделать?
 
DanGien
нет, не видно.
я хочу, чтобы ты объяснил словами - как обеспечивается то, что подобный логин не регистрирвется.
Какой механизм при этом применяется? Как он действует

-~{}~ 26.02.06 00:34:

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

А проблема в том, что 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');

Работает с русским и латинницей тогда:)
 
DanGien
locale это хорошо, это тоже решение.

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

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

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