Здравствуйте! Пришел к вам за подсказкой.
Проблема следущая, делаю систему авторизации / регистрации, есть таблица в которой хранятся юзеры, логин хранится в столбце `user`.
В общем перед тем как добавить данные в таблу я проверяю имеется такой юзер с таким логином в базе или нет. Регистр для меня не должен иметь значения, вот тут я сталкнулся с проблемой.
strtolower приводит символы в нижний регистр только латинские, с кирилицей ничего не выходит.
Делаю такой SQL запрос:
$sql = "Select `id`, `user` From `users` Where LOWER(`user`) = '" . strtolower($user) . "'";
Может подскажете как быть с кирилицей?
1. Tankoff - 14 Сентября, 2008 - 15:41:43 - перейти к сообщению
2. Singularis - 14 Сентября, 2008 - 16:42:40 - перейти к сообщению
3. Tankoff - 14 Сентября, 2008 - 16:59:50 - перейти к сообщению
Спасибо. Ща вот написал функцию которая заменяет символы кирилицы верхнего регистра в нижний. В общем код выглядит так:
function strtolower_my($str) {
$str = strtolower($str);
$search = array(
'Й','Ц','У','К','Е','Н','Г','Ш','Щ','З','Х','Ъ','Ф','Ы','В','А','П','Р','О','Л','Д','Ж','Э','Я','Ч','С','М','И','Т','Ь','Б','Ю','Ё'
);
$replace = array(
'й','ц','у','к','е','н','г','ш','щ','з','х','ъ','ф','ы','в','а','п','р','о','л','д','ж','э','я','ч','с','м','и','т','ь','б','ю','ё'
);
$str = str_replace($search, $replace, $str);
return $str;
}
Работает нормально, но проблема возникла в MySQL запросе:
$sql = "Select `id`, `user` From `users` Where LOWER(`user`) = '" . strtolower_my($user) . "'";
LOWER - так же не хочет работать с кирилицей , но тут уже не напишешь функцию.
и запрос работает не коректно. Можете подсказать как можно решить эту проблему с MySQL?
4. Andrey5555 - 14 Сентября, 2008 - 20:22:25 - перейти к сообщению
Полностью код, пожалуйста..
5. Champion - 15 Сентября, 2008 - 14:38:42 - перейти к сообщению
Tankoff пишет:
LOWER - так же не хочет работать с кирилицей Недовольство, огорчение, но тут уже не напишешь функцию
1 - а хранимыя процедура?
2 - можно вносить логины в БД средствами пхп УЖЕ в нижнем регистре, тогда не прийдется приводить их к нижнему регистру во время выборки
6. Tankoff - 15 Сентября, 2008 - 16:06:44 - перейти к сообщению
Champion пишет:
1 - а хранимыя процедура?
2 - можно вносить логины в БД средствами пхп УЖЕ в нижнем регистре, тогда не прийдется приводить их к нижнему регистру во время выборки
Tankoff пишет:
LOWER - так же не хочет работать с кирилицей Недовольство, огорчение, но тут уже не напишешь функцию
1 - а хранимыя процедура?
2 - можно вносить логины в БД средствами пхп УЖЕ в нижнем регистре, тогда не прийдется приводить их к нижнему регистру во время выборки
Это интересная идея, но мне в этом случае придется делать еще один столбец который будет содержать оригинальный ник в оригинальном регистре, для его отображение в программе пользователям. Все же если больше никак не сделать придется делать так.
Код ниже.
(Добавление)
<?php
function strtolower_chat($str) {
$str = strtolower($str);
$search = array(
'Й','Ц','У','К','Е','Н','Г','Ш','Щ','З','Х','Ъ','Ф','Ы','В','А','П','Р','О','Л','Д','Ж','Э','Я','Ч','С','М','И','Т','Ь','Б','Ю','Ё'
);
$replace = array(
'й','ц','у','к','е','н','г','ш','щ','з','х','ъ','ф','ы','в','а','п','р','о','л','д','ж','э','я','ч','с','м','и','т','ь','б','ю','ё'
);
$str = str_replace($search, $replace, $str);
return $str;
}
$user = strtolower_chat($_POST['user']);
$sql = "Select `id`, `user` From `users` Where LOWER(`user`) = '" . $user . "'";
$query = mysql_query($sql);
$result = mysql_fetch_array($query);
if ($result['id']) {
// Ошибка такой юзер уже есть
} else {
// Процедура регистрации ника
}
?>
mysql_fetch_array не критикуйте. Знаю что по другому можно. Нужно совет касательно LOWER
7. Champion - 15 Сентября, 2008 - 16:36:19 - перейти к сообщению
Напиши в БД хранимую процедурку точно такую же. На входе строка, на выходе строка в нижнем регистре
create procedure LOWER_MY (oryg_string varchar(255))
returns (lower_string varchar(255))
as
begin
всё то же самое только на sql-ном
end
create procedure LOWER_MY (oryg_string varchar(255))
returns (lower_string varchar(255))
as
begin
всё то же самое только на sql-ном
end
8. Tankoff - 15 Сентября, 2008 - 16:40:44 - перейти к сообщению
Champion пишет:
Напиши в БД хранимую процедурку точно такую же. На входе строка, на выходе строка в нижнем регистре
create procedure LOWER_MY (oryg_string varchar(255))
returns (lower_string varchar(255))
as
begin
всё то же самое только на sql-ном
end
create procedure LOWER_MY (oryg_string varchar(255))
returns (lower_string varchar(255))
as
begin
всё то же самое только на sql-ном
end
О_о! В MySQL процедуры это типа функций в пыхе? Я не знал этого! Вы не могли бы помочь мне сделать процедуру? На примере 2х-3х букв?
create procedure LOWER_MY (oryg_string varchar(255))
returns (lower_string varchar(255))
as
begin
всё то же самое только на sql-ном - в частности это я не знаю как написть помогите пжлуста!!!
end
9. Tankoff - 16 Сентября, 2008 - 18:30:39 - перейти к сообщению
Почитал тут про них, но не могу понять как сделать, делаю так:
CREATE PROCEDURE LOWER_MY (string varchar(255))
BEGIN
REPLACE(string, 'А', 'а');
END;
Но ничего не выходит
CREATE PROCEDURE LOWER_MY (string varchar(255))
BEGIN
REPLACE(string, 'А', 'а');
END;
Но ничего не выходит
10. Wange - 16 Сентября, 2008 - 22:21:37 - перейти к сообщению
Непонятно суть проблемы, если честно.
Если выставлена кодировка в mysql utf8 регистронезависимая то ей все равно как будет сохранен в ней текст. никаких процедур и функций городить не надо.
Если выставлена кодировка в mysql utf8 регистронезависимая то ей все равно как будет сохранен в ней текст. никаких процедур и функций городить не надо.
11. Джур - 17 Сентября, 2008 - 10:37:52 - перейти к сообщению
Проблемма однозначно в кодировке... Сталкивался с такой проблеммой, кода использовал кирилицу (ср1251) в табличках с кодировкой по умолчанию...
Кодировка базы и текста должны совподать... Так-же может помочь отправка запроса вида:
Кодировка базы и текста должны совподать... Так-же может помочь отправка запроса вида: