PDA

Просмотр полной версии : [Вопрос] По поводу MySQL R7-2



nikvlad
14.06.2016, 22:50
Что не так в этом коде?

stock RegisterPlayer(playerid)
{
new query[170];
format(query, sizeof(query), "INSERT INTO `accounts` (`nickname`, `email`, `password`, `regdata`, `regip`, `age`, `sex`, `race`) VALUES ('%s','%e','%e','%s','%s','%d','%d','%d')", pData[playerid][pNickname],pData[playerid][pEmail] ,pData[playerid][pPassword], pData[playerid][pRegData], pData[playerid][pRegIP],pData[playerid][pAge], pData[playerid][pGender],pData[playerid][pRace]);
mysql_function_query(dbHandle, query, false, "", "");
}
Не регистрирует аккаунт. (Вообще не появляется новая строчка)
Вот mysql_log:

[23:47:43] Passing query INSERT INTO `accounts` (`nickname`, `email`, `password`, `regdata`, `regip`, `age`, `sex`, `race`) VALUES ('[email protected]','e','e','[email protected]','cn |
[23:47:43] CMySQLHandler::ProcessQueryThread() - Error will be triggered to OnQueryError()
[23:47:43] OnQueryError() - Called.

ziggi
14.06.2016, 23:46
В format нет спецификатора %e. Используй %q или используй mysql_format

nikvlad
15.06.2016, 10:22
В format нет спецификатора %e. Используй %q или используй mysql_format

использовал mysql_format. При использовании спецификатора %e просто выключало сервер без ошибок в лог. Я сделал %s. Аккаунт сохранился, но появился такой артефакт: http://dl1.joxi.net/drive/2016/06/15/0004/1911/292727/27/6b415430a8.jpg
(Вводил пароль: 123456, e-mail: [email protected].)


stock RegisterPlayer(playerid)
{
new query[170];
mysql_format(dbHandle,query, "INSERT INTO `accounts` (`nickname`, `email`, `password`, `regdata`, `regip`, `age`, `sex`, `race`) VALUES ('%s','%s','%s','%s','%s','%d','%d','%d')", pData[playerid][pNickname],pData[playerid][pEmail] ,pData[playerid][pPassword], pData[playerid][pRegData], pData[playerid][pRegIP],pData[playerid][pAge], pData[playerid][pGender],pData[playerid][pRace]);
mysql_function_query(dbHandle, query, false, "", "");
}

Я также вывел все эти переменные в printf. Они записываются нормально.
http://dl1.joxi.net/drive/2016/06/15/0004/1911/292727/27/2f484b2cd8.jpg

StevenH
15.06.2016, 11:23
использовал mysql_format. При использовании спецификатора %e просто выключало сервер без ошибок в лог. Я сделал %s. Аккаунт сохранился, но появился такой артефакт: http://dl1.joxi.net/drive/2016/06/15/0004/1911/292727/27/6b415430a8.jpg
(Вводил пароль: 123456, e-mail: [email protected].)


stock RegisterPlayer(playerid)
{
new query[170];
mysql_format(dbHandle,query, "INSERT INTO `accounts` (`nickname`, `email`, `password`, `regdata`, `regip`, `age`, `sex`, `race`) VALUES ('%s','%s','%s','%s','%s','%d','%d','%d')", pData[playerid][pNickname],pData[playerid][pEmail] ,pData[playerid][pPassword], pData[playerid][pRegData], pData[playerid][pRegIP],pData[playerid][pAge], pData[playerid][pGender],pData[playerid][pRace]);
mysql_function_query(dbHandle, query, false, "", "");
}

Я также вывел все эти переменные в printf. Они записываются нормально.
http://dl1.joxi.net/drive/2016/06/15/0004/1911/292727/27/2f484b2cd8.jpg


Разве емайл надо записывать не через strmid?

nikvlad
15.06.2016, 11:25
Разве емайл надо записывать не через strmid?

Я записывал через mysql_real_escape_string.

ziggi
15.06.2016, 11:45
Судя по вики: http://wiki.sa-mp.com/wiki/MySQL/R33#mysql_format
Ты используешь функцию mysql_format неправильно. Нужно указать размер query.

mysql_format(dbHandle, query, sizeof(query), "INSERT INTO `accounts` (`nickname`, `email`, `password`, `regdata`, `regip`, `age`, `sex`, `race`) VALUES ('%s','%s','%s','%s','%s','%d','%d','%d')", pData[playerid][pNickname],pData[playerid][pEmail] ,pData[playerid][pPassword], pData[playerid][pRegData], pData[playerid][pRegIP],pData[playerid][pAge], pData[playerid][pGender],pData[playerid][pRace]);
Также выведи то, что сформировалось с помощью print:

print(query);

nikvlad
15.06.2016, 12:02
Судя по вики: http://wiki.sa-mp.com/wiki/MySQL/R33#mysql_format
Ты используешь функцию mysql_format неправильно. Нужно указать размер query.

mysql_format(dbHandle, query, sizeof(query), "INSERT INTO `accounts` (`nickname`, `email`, `password`, `regdata`, `regip`, `age`, `sex`, `race`) VALUES ('%s','%s','%s','%s','%s','%d','%d','%d')", pData[playerid][pNickname],pData[playerid][pEmail] ,pData[playerid][pPassword], pData[playerid][pRegData], pData[playerid][pRegIP],pData[playerid][pAge], pData[playerid][pGender],pData[playerid][pRace]);
Также выведи то, что сформировалось с помощью print:

print(query);

Хм, ошибка: error 035: argument type mismatch (argument 3)
Я использую MySQL R7-2, в том же вики написано так: http://wiki.sa-mp.com/wiki/MySQL#mysql_format

http://joxi.ru/Dr8KZEbHkbBRbA.jpg

ziggi
15.06.2016, 14:27
Я использую MySQL R7-2,[/url]
Почему? Оно же такое старое...


http://joxi.ru/Dr8KZEbHkbBRbA.jpg

Очевидно, что данные в pData[playerid][pNickname] и в прочие строки записываются неправильно.

nikvlad
15.06.2016, 14:37
Решил вот таким способом, но этот код похож на костыль, можно его как-нибудь оптимизировать?


new query[201], pass[16], email[32],ip[16],data[16], name[MAX_PLAYER_NAME];
GetPVarString(playerid,"email",email,32);
GetPVarString(playerid,"pass",pass,16);
GetPVarString(playerid,"name",name,MAX_PLAYER_NAME);
format(data, sizeof(data), "%s", date("%dd.%mm.%yyyy", gettime()));
GetPlayerIp(playerid, ip, sizeof(ip));
format(query, sizeof(query), "INSERT INTO `accounts` (`nickname`, `password`, `regdata`, `regip`, `email`, `age`, `sex`, `race`) VALUES ('%s','%s','%s','%s','%s','%d','%d','%d')", name, pass, data, ip, email,pData[playerid][pAge], pData[playerid][pGender],pData[playerid][pRace]);
mysql_function_query(dbHandle, query, false, "", "");

- - - Добавлено - - -


Почему? Оно же такое старое...



Очевидно, что данные в pData[playerid][pNickname] и в прочие строки записываются неправильно.

Это мои первые опыты, я это для души делаю)

ziggi
15.06.2016, 15:14
Покажи как ты пытаешься записать данные в pData[playerid][pNickname].

nikvlad
15.06.2016, 15:22
Покажи как ты пытаешься записать данные в pData[playerid][pNickname].


new temp[MAX_PLAYER_NAME];
GetPlayerName(playerid,temp,MAX_PLAYER_NAME);
SetPVarString(playerid,"name",temp);


Я уже решил проблему. Помог этот код:
new query[201], pass[16], email[32],ip[16],data[16], name[MAX_PLAYER_NAME];
GetPVarString(playerid,"email",email,32);
GetPVarString(playerid,"pass",pass,16);
GetPVarString(playerid,"name",name,MAX_PLAYER_NAME);
format(data, sizeof(data), "%s", date("%dd.%mm.%yyyy", gettime()));
GetPlayerIp(playerid, ip, sizeof(ip));
format(query, sizeof(query), "INSERT INTO `accounts` (`nickname`, `password`, `regdata`, `regip`, `email`, `age`, `sex`, `race`) VALUES ('%s','%s','%s','%s','%s','%d','%d','%d')", name, pass, data, ip, email,pData[playerid][pAge], pData[playerid][pGender],pData[playerid][pRace]);
mysql_function_query(dbHandle, query, false, "", "");
Но он похож на костыль, можно его как-нибудь оптимизировать?

ziggi
15.06.2016, 15:25
Но он похож на костыль, можно его как-нибудь оптимизировать?

Зачем ты скопировал свой предыдущий пост? Я попросил показать то, как ты записываешь данные (или раньше записывал) в pData[playerid][pNickname].

nikvlad
15.06.2016, 15:38
Зачем ты скопировал свой предыдущий пост? Я попросил показать то, как ты записываешь данные (или раньше записывал) в pData[playerid][pNickname].
Я решил записывать не через pData[playerid][pNickname], а обойтись Pvar'ом. Этот вариант подошел, в базу все записалось отлично!

ziggi
15.06.2016, 16:00
Я решил записывать не через pData[playerid][pNickname], а обойтись Pvar'ом. Этот вариант подошел, в базу все записалось отлично!

Но ты же сам считаешь, что это костыль. Но если тебе это подходит, то ладно, твоё дело.