PHP.SU

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


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

> Без описания
Tankoff
Отправлено: 14 Сентября, 2008 - 15:41:43
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Март 2008  


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




Здравствуйте! Пришел к вам за подсказкой.

Проблема следущая, делаю систему авторизации / регистрации, есть таблица в которой хранятся юзеры, логин хранится в столбце `user`.

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

strtolower приводит символы в нижний регистр только латинские, с кирилицей ничего не выходит.

Делаю такой SQL запрос:

$sql = "Select `id`, `user` From `users` Where LOWER(`user`) = '" . strtolower($user) . "'";

Может подскажете как быть с кирилицей?
 
 Top
Singularis
Отправлено: 14 Сентября, 2008 - 16:42:40
Post Id


Новичок


Покинул форум
Сообщений всего: 37
Дата рег-ции: Май 2008  


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




 
 Top
Tankoff
Отправлено: 14 Сентября, 2008 - 16:59:50
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Март 2008  


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




Singularis пишет:


Спасибо. Ща вот написал функцию которая заменяет символы кирилицы верхнего регистра в нижний. В общем код выглядит так:

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?
 
 Top
Andrey5555
Отправлено: 14 Сентября, 2008 - 20:22:25
Post Id


Частый гость


Покинул форум
Сообщений всего: 183
Дата рег-ции: Авг. 2007  


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




Полностью код, пожалуйста..
 
 Top
Champion Супермодератор
Отправлено: 15 Сентября, 2008 - 14:38:42
Post Id



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


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


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




Tankoff пишет:
LOWER - так же не хочет работать с кирилицей Недовольство, огорчение, но тут уже не напишешь функцию

1 - а хранимыя процедура?
2 - можно вносить логины в БД средствами пхп УЖЕ в нижнем регистре, тогда не прийдется приводить их к нижнему регистру во время выборки
 
 Top
Tankoff
Отправлено: 15 Сентября, 2008 - 16:06:44
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Март 2008  


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




Champion пишет:
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

Закатив глазки
 
 Top
Champion Супермодератор
Отправлено: 15 Сентября, 2008 - 16:36:19
Post Id



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


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


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




Напиши в БД хранимую процедурку точно такую же. На входе строка, на выходе строка в нижнем регистре
create procedure LOWER_MY (oryg_string varchar(255))
returns (lower_string varchar(255))
as
begin
всё то же самое только на sql-ном
end
 
 Top
Tankoff
Отправлено: 15 Сентября, 2008 - 16:40:44
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Март 2008  


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




Champion пишет:
Напиши в БД хранимую процедурку точно такую же. На входе строка, на выходе строка в нижнем регистре
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
 
 Top
Tankoff
Отправлено: 16 Сентября, 2008 - 18:30:39
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Март 2008  


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




Почитал тут про них, но не могу понять как сделать, делаю так:

CREATE PROCEDURE LOWER_MY (string varchar(255))
BEGIN
REPLACE(string, 'А', 'а');
END;

Но ничего не выходит Недовольство, огорчение
 
 Top
Wange
Отправлено: 16 Сентября, 2008 - 22:21:37
Post Id



Гость


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


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




Непонятно суть проблемы, если честно.
Если выставлена кодировка в mysql utf8 регистронезависимая то ей все равно как будет сохранен в ней текст. никаких процедур и функций городить не надо.


-----
Не пытайся, делай
обучение, праздники
 
 Top
Джур
Отправлено: 17 Сентября, 2008 - 10:37:52
Post Id



Посетитель


Покинул форум
Сообщений всего: 423
Дата рег-ции: Март 2007  


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




Проблемма однозначно в кодировке... Сталкивался с такой проблеммой, кода использовал кирилицу (ср1251) в табличках с кодировкой по умолчанию...
Кодировка базы и текста должны совподать... Так-же может помочь отправка запроса вида:
CODE (text):
скопировать код в буфер обмена
  1. SET NAMES 'имя кодировки'


-----
Тамбовский каджит тебе товарищ
 
 Top
Champion Супермодератор
Отправлено: 17 Сентября, 2008 - 10:46:29
Post Id



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


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


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




Во-первых, можно действительно было set names.
А что касается хранмимых процедур, вот:
1 - В том, что Вы написали, функция replase, свой результат возвращает никуда
2 - Сама Ваша процедура не возвращает значений. Правильнее напсиать так:
CREATE PROCEDURE LOWER_MY (string varchar(255))
RETURNS (lower_str varchar(255))
BEGIN
lower_str = REPLACE(string, 'А', 'а');
END;
(Добавление)
Кроме этого менять так все буквы поотдельности не удобно. Предлагаю так сделать:
синтексис проверьте. и названия

create......
RETURNS (lower_str varchar(255))
AS
BEGIN
--declare variables
caps_symb_a = ord('A') ;
caps_symb_z = ord('Я') ; --определили границы, в которых хранятся большие символы
low_caps_diff = ord('A') - ord('a') ; --разница между большом и маленьким
for i=0 to length(in_str) do
begin
--если текущий символ - большая буква, меняем его на маленькую
if (ord(in_str[i]) >= caps_symb_a) and (ord(in_str[i]) <= caps_symb_z) then
in_str[i] = chr(ord(in_str[i]) - low_caps_diff)
end

END;
 
 Top
Mike-Eci
Отправлено: 13 Января, 2009 - 14:10:30
Post Id



Новичок


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


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




здравствуйте. я совсем новичек как в пхп, так и в программировании.

я тоже столкнулся с похожей проблемой и решил сделать так:

селект * фром таблица ид, имя
феч_аррай //или как его там

и потом уже сравнить прямо в пхп элементы массива с помощью strtolower


не будет ли это лучше? или это уже снова изобретение велосипеда?


-----
 
 Top
Champion Супермодератор
Отправлено: 13 Января, 2009 - 14:30:27
Post Id



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


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


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




Нет. Делать выборку и фильтровать ее средствами php не лучше. Это гораздо медленнее и неэкономно.
 
 Top
Mike-Eci
Отправлено: 13 Января, 2009 - 15:02:53
Post Id



Новичок


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


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




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


-----
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB