Благодарю, исправил
Благодарю. Мне этот недочёт уже указывали, но я почему-то забыл внести правки =\
Да, проверял. Перечисления, по-сути, создают обычные константы и проблем быть не должно.
Приветствую ребят.
Спасибо Вам за этот чудесный урок, все очень красиво и удобно расписано.
Вопрос такой, case 1044,1045 и т.д это типо индентификатор ошибки в функции mysql_errno?
Код:switch(mysql_errno())
{
case 0: print("Подключение к базе данных удалось");
case 1044: print("Подключение к базе данных не удалось [Указано неизвестное имя пользователя]");
case 1045: print("Подключение к базе данных не удалось [Указан неизвестный пароль]");
case 1049: print("Подключение к базе данных не удалось [Указана неизвестная база данных]");
case 2003: print("Подключение к базе данных не удалось [Хостинг с базой данных недоступен]");
case 2005: print("Подключение к базе данных не удалось [Указан неизвестный адрес хостинга]");
default: printf("Подключение к базе данных не удалось [Неизвестная ошибка. Код ошибки: %d]", mysql_errno());
}
Именно
- - - Добавлено - - -
Я, кстати, изначально реализовывал этот код в подобную штуку:
PHP код:
mysql_connect_ID = mysql_connect(данные_для_подключения);
MySQLConnectError(mysql_errno(), 0);
PHP код:
stock MySQLConnectError(error_id, attempt = 0)
{
switch(error_id)
{
case 0:
{
SetGameModeText("Evil Scripter v.0.1");
SendRconCommand("hostname ServerName");
SendRconCommand("language Русский/Russian");
SendRconCommand("weburl DeimoS");
if(attempt) SendRconCommand("password 0");
print("Подключение к базе данных удалось");
return 1;
}
case 1044:
{
print("Подключение к базе данных не удалось [Указано неизвестное имя пользователя]");
SendRconCommand("hostname MySQL: Неизвестное имя пользователя");
SendRconCommand("password 666555");
}
case 1045:
{
print("Подключение к базе данных не удалось [Указан неизвестный пароль]");
SendRconCommand("hostname MySQL: Неизвестный пароль");
SendRconCommand("password 666555");
}
case 1049:
{
print("Подключение к базе данных не удалось [Указана неизвестная база данных]");
SendRconCommand("hostname MySQL: Неизвестная база данных");
SendRconCommand("password 666555");
}
case 2003:
{
print("Подключение к базе данных не удалось [Хостинг с базой данных недоступен]");
SendRconCommand("hostname MySQL: Хостинг недоступен");
SendRconCommand("password 666555");
}
case 2005:
{
print("Подключение к базе данных не удалось [Указан неизвестный адрес хостинга]");
SendRconCommand("hostname MySQL: Невалидный адрес хостинга");
SendRconCommand("password 666555");
}
default:
{
printf("Подключение к базе данных не удалось [Неизвестная ошибка. Код ошибки: <%d>]", error_id);
new string[38+11];
format(string, sizeof(string), "hostname MySQL: Неизвестная ошибка [%d]", error_id);
SendRconCommand(string);
SendRconCommand("password 666555");
}
}
SendRconCommand("language Closed [MySQL_Error]");
SendRconCommand("weburl Closed [MySQL_Error]");
SetGameModeText("Closed [MySQL_Error]");
SetTimer("@___Reconnect_MySQL", 1000, 0);
return 1;
}
То бишь, пока сервер не сможет соединиться с MySQL сервером, он будет запоролен и будут выданы соответствующие сообщения + он будет каждую секунду пытаться переподключиться.PHP код:
@___Reconnect_MySQL();
@___Reconnect_MySQL()
{
mysql_close(mysql_connect_ID);
mysql_connect_ID = mysql_connect(данные_для_подключения);
MySQLConnectError(mysql_errno(), 1);
return 1;
}
О, не ожидал спасибо. Возьму на заметку.
Какую можно сделать проверку если вовремя работы сервера например вырубается бд?
- - - Добавлено - - -
Кстати, при создании пароля с русскими символами то в бд они сохраняются иероглифами.
- - - Добавлено - - -
Код проверок есть всё есть, но игрок может пока не авторизован и команды писать и текст в чат.
Ну как-то так:
Но разрыв с БД обнаружится только при первом отосланном запросе к БД и этот запрос уже будет утерян 100%.PHP код:
public OnQueryError(errorid, error[], callback[], query[], connectionHandle)
{
if(errorid != 0)
{
//Действие
}
return 1;
}
Можно сделать реализацию попытки переподключения (тут проблем нет) и отправки повторного запроса, но беда в том, что в OnQueryError приходит информация только о тексте самого запроса и о коллбэке, в который отсылается ответ на запрос в виде кэша, поэтому придётся для каждого запроса, требующего кэширование (а это "SELECT * FROM" или, в редких случаях (как в случае с этой регистрацией) "INSERT"), делать индивидуальные запросы. Но тут появляется ещё одна проблема: где взять данные, которые передаются в функцию, вызываемую запросом? То бишь, в случае с UploadPlayerAccount, это "playerid". Лично я способов, без создания каких-то супер-костылей, не вижу :cry:
DeimoS, тебе цены нет. Спасибо.
прочел много букавок, многое взял для себя, многое исправил в моде.
Обновил урок, добавив пункт 8, о котором совсем забыл при публикации статьи :( Кто использует сию регистрацию и кто самостоятельно этот код не добавил - добавьте, ибо без него Вы получите множество проблем :(
http://i.imgur.com/Mav7xF7.png