where не сравнивает регистр

Devillio

Новичок
where не сравнивает регистр

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

PHP:
$sql="select * from ".USR_TABLE." where username='".$_GET["user"]."'";

попадает и devillio, и Devillio, и dEvILlIO. Как избавиться от сего бага? ...или фичи?

Благодарю.

-~{}~ 20.09.05 14:03:

как то я тему неверно поставил: where не учитывает регистр при сравнении - так правильнее.
 
Re: where не сравнивает регистр

Автор оригинала: Devillio
Господа, я все постигаю методом тыка, институтов не кончали, как говорится, так вот любопытная для меня вешь: в запрос
постигать надо методом скурпулезного изучения документации ибо там 99% ответов и есть. например настройки регистрозависимости таблиц, полей, поиска и т.д.

p.s. так и хочется кавычку AND 1=1 в $_GET['user'] вставить. гыгыгы
 
>Как избавиться от сего бага? ...или фичи?

Это не баг и не фича, это ты работаешь с регистронезависимым полем.

Как избавиться, можешь посмотреть в поиске.
 
Re: where не сравнивает регистр

Одно из возможных решений:
[sql]
select * from test;
[/sql]
+----+------+
| id | name |
+----+------+
| 1 | name |
| 2 | Name |
+----+------+
2 rows in set (0.00 sec)

[sql]select name from test where STRCMP(name,cast('Name' as binary))=0;
[/sql]
+------+
| name |
+------+
| Name |
+------+
1 row in set (0.00 sec)
 
Это не баг и не фича, это ты работаешь с регистронезависимым полем.
выходит, фича. полез в документацию :rolleyes:

народ, а че то мысль
p.s. так и хочется кавычку AND 1=1 в $_GET['user'] вставить. гыгыгы
меня навела на иную мысль, что так можно всю мою табличку слить... как же быть? (я понимаю, мысль offtopic, но все же). Это уже не мысль, это паника.
 
впрочем, если реализовать, как предлагает уважаемый Oleg Marchuk, то можно не волноваться насчет user=' AND '1=

пошел тестировать. всем спасибо.
 
Devillio
Нужно волноваться. Смотри:
PHP:
$_GET['param'] = "' AS binary) ) = 0 or 1=1 or STRCMP(name, cast('";
$sql = "SELECT name
FROM test
WHERE STRCMP( name, cast( '"$_GET['param']."' AS binary ) ) = 0";
Получим
[SQL]
FROM test
WHERE STRCMP( name, cast( '' AS binary) ) = 0 or 1=1 or STRCMP(name, cast('' AS binary ) ) = 0
[/SQL]
 
Devillio, а версия какая? Если 4.1 и выше, то ставишь просто collation который case sensitive.
 
Сверху