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
Форумы портала PHP.SU :: Версия для печати :: strtolower и кирилица. Проблема!
Форумы портала PHP.SU » PHP » Программирование на PHP » strtolower и кирилица. Проблема!

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

1. Tankoff - 14 Сентября, 2008 - 15:41:43 - перейти к сообщению
Здравствуйте! Пришел к вам за подсказкой.

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

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

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

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

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

Может подскажете как быть с кирилицей?
2. Singularis - 14 Сентября, 2008 - 16:42:40 - перейти к сообщению
3. Tankoff - 14 Сентября, 2008 - 16:59:50 - перейти к сообщению
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?
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 пишет:
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
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


О_о! В 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;

Но ничего не выходит Недовольство, огорчение
10. Wange - 16 Сентября, 2008 - 22:21:37 - перейти к сообщению
Непонятно суть проблемы, если честно.
Если выставлена кодировка в mysql utf8 регистронезависимая то ей все равно как будет сохранен в ней текст. никаких процедур и функций городить не надо.
11. Джур - 17 Сентября, 2008 - 10:37:52 - перейти к сообщению
Проблемма однозначно в кодировке... Сталкивался с такой проблеммой, кода использовал кирилицу (ср1251) в табличках с кодировкой по умолчанию...
Кодировка базы и текста должны совподать... Так-же может помочь отправка запроса вида:
CODE (text):
скопировать код в буфер обмена
  1. SET NAMES 'имя кодировки'
12. Champion - 17 Сентября, 2008 - 10:46:29 - перейти к сообщению
Во-первых, можно действительно было 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;
13. Mike-Eci - 13 Января, 2009 - 14:10:30 - перейти к сообщению
здравствуйте. я совсем новичек как в пхп, так и в программировании.

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

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

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


не будет ли это лучше? или это уже снова изобретение велосипеда?
14. Champion - 13 Января, 2009 - 14:30:27 - перейти к сообщению
Нет. Делать выборку и фильтровать ее средствами php не лучше. Это гораздо медленнее и неэкономно.
15. Mike-Eci - 13 Января, 2009 - 15:02:53 - перейти к сообщению
тогда получается самым правильным вариантом будет хранить 2 поля в базе. с реальным имененем и нижнего регистра.

 

Powered by ExBB FM 1.0 RC1