Помогите с проблемой конвертирования в mysql

Статус
В этой теме нельзя размещать новые ответы.

k01dun

Новичок
Всем привет!

Помогите пожалуйста, решить головоломку!

есть такая вот таблица:

PHP:
CREATE TABLE IF NOT EXISTS `users` (
  `ID` int(11) NOT NULL DEFAULT '0',
  `name` varchar(32) NOT NULL DEFAULT '',
  `passwd` varchar(64) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
есть процедура в ней:

PHP:
DROP PROCEDURE IF EXISTS `adduser`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `adduser`(
  in name1 VARCHAR(64),
  in passwd1 VARCHAR(64)
)
BEGIN
  DECLARE idtemp INTEGER;
    SELECT IFNULL(MAX(id), 16) + 16 INTO idtemp FROM users;
    INSERT INTO users (id,name,passwd) VALUES( idtemp, name1, passwd1);
END
;;
DELIMITER ;
регистрируется пользователь так:

PHP:
$Salt = $Login.$Pass;
$Salt = md5($Salt);
$Salt = "0x".$Salt;
MySQL_Query("call adduser('$Login', $Salt)");
пытаюсь авторизовать пользователя:

PHP:
if (isset($_POST['username']))
{
$Login = $_POST['username'];
$Pass = $_POST['passwd'];
$Salt = $Login.$Pass;
$Salt = md5($Salt);
$Salt = "0x".$Salt;

$r=MySQL_Query("select * from users WHERE name='$Login' AND passwd='$Salt'");
$n=mysql_numrows($r);

if($n == 1)
{
//auth code	
}
}
но всегда получаю 0..

данные выглядят странным образом:

PHP:
INSERT INTO `users` (`ID`, `name`, `passwd`) VALUES(160, 'testuser', '„?s? ye‰T? ?')
условия:
процедуру менять нельзя;
таблицу менять нельзя;

нужно как-то получить данные в правильном виде чтоб правильно выполнился запрос...
уже всю головву сломал... =\

после коннекта выставнено:
PHP:
mysql_query("SET CHARACTER SET utf8_general_ci");
mysql_query("SET NAMES utf8_general_ci");
 
Последнее редактирование:

k01dun

Новичок
Dez
все бы ничего но вот так низя
MySQL_Query("call adduser('$Login', '$Salt')");

иначе приложение не коннектится к базе

mysql_numrows($r);
это не опечатка это старая функция добавлена для совместимости

mysql_real_escape_string куда его применить? у мня из базы не выбирает, постоянно 0 возвращается...

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

дело в том что видимо сравниваются строка из php с паролем которая имеет вид:
0x4a9c69524ac34200fb20d4e58a8ea23a
со строкой которая в базе:
„?s? ye‰T? ?

вот и как их привести к одинаковому виду или кодировке? ...
 

Фанат

oncle terrible
Команда форума
Записываешь ты соль без кавычек, а читаешь с кавычками.
Выбери что-нибудь одно.
 

k01dun

Новичок
Записываешь ты соль без кавычек, а читаешь с кавычками.
Выбери что-нибудь одно.
записывается там все хорошо и регистрация проходит и после этого клиентское приложение читает нормально но я в php немогу почему-то..
да и пробовал я читать без кавычек.. как уже только н пробовал, да вы сами попробуй, дампы на руках получится ли у вас после регистрации получить данные в нормальном виде из базы.. это надо видеть как оно работает а так не понятно что как и откуда в базе появляется пароль иероглифами.. такое впечатление что он бинарная строка...

менять можно только скрипт авторизации и все... то есть делать выборку чтоб авторизовать по этим данным пользователя на сайте, остальное менять нельзя
 

keltanas

marty cats
Это не формат пароля с хешем. Это просто хеш пароля. И почему Salt? Назови его Hash, будет понятнее ;)
Постарайся все же выяснить, в каком же виде записываешь свою строку хеша, и почему есть разница, если с кавычками она передается в СУБД и если без?
Я даже проще пример приведу:
PHP:
var_dump(0x20 === "0x20");
как думаешь, каков будет результат?
 
Последнее редактирование:

Фанат

oncle terrible
Команда форума
да и пробовал я читать без кавычек..
Ещё раз попробуй.
Работа программиста заключается в том, чтобы делать правильно, и разбираться, почему не работает, если что-то идет не так.
А не метаться, как обитательницы борделя при визите полицмейстера, пробуя все что в голову взбредёт.
 

k01dun

Новичок
Ещё раз попробуй.
Работа программиста заключается в том, чтобы делать правильно, и разбираться, почему не работает, если что-то идет не так.
А не метаться, как обитательницы борделя при визите полицмейстера, пробуя все что в голову взбредёт.
PHP:
SELECT *
FROM users
WHERE name = 'qqqq'
AND passwd = 0x4a9c69524ac34200fb20d4e58a8ea23a
LIMIT 0 , 30
MySQL вернула пустой результат (т.е. ноль строк)

дамп
PHP:
INSERT INTO `users` (`ID`, `name`, `passwd`) VALUES
(1, 'qqqq', 'J?iRJAB\0u OaSZ?:')
хоть убей не совпадают данные..
как блин мне в php из этого
0x4a9c69524ac34200fb20d4e58a8ea23a

получить такую белиберду
J?iRJAB\0u OaSZ?:

я все же думаю проблема в кодировке...
 

WMix

герр M:)ller
Партнер клуба
k01dun у тебя вопрос задом наперед!
а как ты получил эту запись ?
PHP:
 INSERT INTO `users` (`ID`, `name`, `passwd`) VALUES (1, 'qqqq', 'J?iRJAB\0u OaSZ?:')
 

k01dun

Новичок
k01dun у тебя вопрос задом наперед!
а как ты получил эту запись ?
PHP:
 INSERT INTO `users` (`ID`, `name`, `passwd`) VALUES (1, 'qqqq', 'J?iRJAB\0u OaSZ?:')
PHP:
$Login = $_POST['login'];
$Pass = $_POST['passwd'];
$Salt = $Login.$Pass;
$Salt = md5($Salt);
$Salt = "0x".$Salt;
MySQL_Query("call adduser('$Login', $Salt)");
всмысле задом на перед?
 

k01dun

Новичок
PHP:
MySQL_Query("select * from users WHERE name='$Login' AND passwd=0x$Salt");
#1054 - Unknown column '0x0x4a9c69524ac34200fb20d4e58a8ea23a' in 'where clause'

так же пробовал:
PHP:
MySQL_Query("select * from users WHERE name='$Login' AND passwd=CAST( $Salt AS UNSIGNED )");
0

PHP:
MySQL_Query("select * from users WHERE name='$Login' AND passwd=HEX( $Salt)");
0

даже не знаю... что-то на стороне mysql не получается их сравнить.. возможно нужно выделять данные по логину и уже в php пытаться работать с бинарными данными..
только в этом у меня нет опыта... видел что есть функция unpack() но вот по какому формату распаковывать данные - ума не приложу...

правда не знаю к чему эта вся химия
еслиб это все придумывал я - было бы проще...
 

artoodetoo

великий и ужасный
#1054 - Unknown column '0x0x4a9c69524ac34200fb20d4e58a8ea23a' in 'where clause'
что-то лишнее. это уже не Hexadecimal Literals
 

Dez

Новичок
k01dun, ты же если 0x до запроса присоединяешь, то зачем еще второй раз?
PHP:
$Salt = "0x".$Salt;
MySQL_Query("select * from users WHERE name='$Login' AND passwd=$Salt");
 

k01dun

Новичок
ты же если 0x до запроса присоединяешь, то зачем еще второй раз?
это мне выше советовали)
там лишнее

PHP:
$Salt = "0x".$Salt;
MySQL_Query("select * from users WHERE name='$Login' AND passwd=$Salt");
а вот так не пашет, кому интересно - дамп базы и процедуры есть выше... попробуйте.. сами увидите...
 

artoodetoo

великий и ужасный
Тут, мне кажется, одна проблема - суетливые ручки. Будь последователен - проверь запрос SELECT в консоли mysql.
Не накладывай возможные проблемы: может у тебя чертов $Login не определен в нужный момент, или ты неправильно проверяешь чертов результат.
 

WMix

герр M:)ller
Партнер клуба
PHP:
mysql> set @a=cast( 0x4a9c69524ac34200fb20d4e58a8ea23a as char(64));
Query OK, 0 rows affected (0.23 sec)

mysql> select @a;
+------------------+
| @a               |
+------------------+
| J�iRJ�B � �劎�:       |
+------------------+
1 row in set (0.01 sec)

mysql> select  @a=0x4a9c69524ac34200fb20d4e58a8ea23a;
+---------------------------------------+
| @a=0x4a9c69524ac34200fb20d4e58a8ea23a |
+---------------------------------------+
|                                     1 |
+---------------------------------------+
1 row in set (0.02 sec)
у тебя дамп битый я не вижу китайский иероглиф 劎
 

artoodetoo

великий и ужасный
WMix, это проблемы представления, а не хранения.

k01dun, вообще нахрен было делать так нестандартно?! Для тебя отцы и деды не авторитет? Почему бы строку не хранить буквально как ты ее видишь после md5(), все так делают, но не ты!

IFNULL(MAX(id), 16) + 16 элегантный способ избежать auto_increment )))
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху