02:08
ОбновитьСмайлыУправление мини-чатом
МИНИ-ЧАТ
Главная страница!

 



 
          





Рекомендуем:





Последние Файлы GTA 4 Последние Файлы GTA-MP Реклама
Скрипт GTA 4 элементы Watch... 07.09.2014
Ferrari 360 Spider [EPM con... 13.12.2013
Porsche Cayenne Turbo 2012 ... 13.12.2013
Shelby Terlingua Mustang v1... 13.12.2013
Hamann Lamborghini Gallardo... 27.10.2013
[GM] The Big PEN1:LS v2.00 ... 04.12.2017
Dgun (AvnanceRP,SampRP,Dimo... 19.03.2016
SAMP скрипт SX Events (MySQ... 03.03.2016
Карта ASL мэрия для SAMP се... 03.03.2016
AIM для SA-MP 0.3.7 22.02.2016
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: AXE, Weddew  
Запись в переменные
Edward_ArmstrongДата: Вторник, 19.06.2012, 13:48 | Сообщение # 1
Новенький
Группа: Продвинутые
Сообщений: 31
Награды: 0
Город: Пятигорск
Репутация: 29
Замечания: 0%
Статус:
Вообщем написал код, который парсит данные из MySQL при помощи sscanf в переменные
Вот он сам:
Code
stock LAccount(playerid)
{
  format(qwery,sizeof(qwery), "SELECT * FROM `accounts` WHERE name = '%s'  LIMIT 1",login);
  mysql_query(qwery);
  mysql_store_result();
  mysql_fetch_row(qwery);
    sscanf(qwery, "p<|>s[128]s[32]iiiis[128]iii",
     PlayerInfo[playerid][pLogin],
     PlayerInfo[playerid][pPassword],
     PlayerInfo[playerid][pSex],
     PlayerInfo[playerid][pMoney],
     PlayerInfo[playerid][pLvl],
     PlayerInfo[playerid][pAdmin],
     PlayerInfo[playerid][pEmail],
     PlayerInfo[playerid][pTeam],
     PlayerInfo[playerid][pRank],
     PlayerInfo[playerid][pSkin]
  );
  mysql_free_result();


Проблема в том, что логин, пароль, email он парсит, а остальное или пишет null, или какой-то бред. Один раз даже смайлики парсило вместо 5.

DesertДата: Вторник, 19.06.2012, 15:04 | Сообщение # 2
Местный
Группа: I'm V.I.P.
Сообщений: 669
Награды: 57
Город: Москва
Репутация: 1082
Замечания: 0%
Статус:
Code
stock LAccount(playerid)
{
    format(qwery,sizeof(qwery), "SELECT * FROM `accounts` WHERE name = '%s'  LIMIT 1",login);
    mysql_query(qwery);
    mysql_store_result();
    if(mysql_fetch_row(query) == 1)
     {
       sscanf(qwery, "p<|>s[128]s[32]iiiis[128]iii",
       PlayerInfo[playerid][pLogin],
       PlayerInfo[playerid][pPassword],
       PlayerInfo[playerid][pSex],
       PlayerInfo[playerid][pMoney],
       PlayerInfo[playerid][pLvl],
       PlayerInfo[playerid][pAdmin],
       PlayerInfo[playerid][pEmail],
       PlayerInfo[playerid][pTeam],
       PlayerInfo[playerid][pRank],
       PlayerInfo[playerid][pSkin]);
       mysql_free_result();
}



Сообщение отредактировал Desert - Вторник, 19.06.2012, 15:05
Edward_ArmstrongДата: Вторник, 19.06.2012, 20:40 | Сообщение # 3
Новенький
Группа: Продвинутые
Сообщений: 31
Награды: 0
Город: Пятигорск
Репутация: 29
Замечания: 0%
Статус:
Теперь все значения null.
pesnike1Дата: Вторник, 19.06.2012, 22:25 | Сообщение # 4
Новенький
Группа: Пользователи
Сообщений: 27
Награды: 0
Город: Ростов-На-Дону
Репутация: 5
Замечания: 20%
Статус:
Ну я вот такое написал для своего мода. Очень удобно.
Code
stock DbGet(base[], text[], rettext[], Name[])
{
  new string[128], result[128], str[55];
  format(string, sizeof(string),"SELECT `%s` FROM `%s` WHERE `Name` = '%s'",text,base,Name);
  mysql_query(string);
  mysql_store_result();
  mysql_fetch_row_format(result, "|");
  sscanf(result, "p<|>s[55]",str);
  strmid(rettext,str,0,strlen(str),255);
  mysql_free_result();
}
stock DbGetInt(base[], text[], &rettext, Name[])
{
  new string[128], result[128];
  format(string, sizeof(string),"SELECT `%s` FROM `%s` WHERE `Name` = '%s'",text,base,Name);
  mysql_query(string);
  mysql_store_result();
  mysql_fetch_row_format(result, "|");
  sscanf(result, "p<|>d",rettext);
  mysql_free_result();
}

Использовать например так:
DbGetInt("accounts","Level",PlayerInfo[playerid][pLevel],sendername);
DbGet для считывания строк.

s3apДата: Среда, 20.06.2012, 02:00 | Сообщение # 5
Местный
Группа: Продвинутые
Сообщений: 570
Награды: 7
Город: Саратов
Репутация: 382
Замечания: 80%
Статус:
На каждую переменную по одному запросу? И что же ты будешь делать, когда онлайн будет 10+ человек?


Сообщение отредактировал s3ap - Среда, 20.06.2012, 02:00
pesnike1Дата: Среда, 20.06.2012, 09:13 | Сообщение # 6
Новенький
Группа: Пользователи
Сообщений: 27
Награды: 0
Город: Ростов-На-Дону
Репутация: 5
Замечания: 20%
Статус:
Запрашивать. Это ведь нужно делать 1 раз, когда игрок логинится.
AlcoholikДата: Среда, 20.06.2012, 09:49 | Сообщение # 7
Мастер джэдай
Группа: Администратор
Сообщений: 8299
Награды: 111
Город: Санкт-Петербург
Репутация: 6085
Статус:
Ну вот запустишь ты сервак, зайдёт к тебе 50 человек и одновременно будут логиниться. Допустим раздер массива игрока 50, 50*50 = 2500 запросов, сервак может и не ляжет, но лаг поймает хороший.


if(isset($beer)&&isset($girl)) { drink($beer);fuck($girl); }else die();
Мониторинг sa:mp серверов


Приватно никого не консультирую, моды также не пишу, ни так, ни за деньги.
Моя ICQ 675715, пишу только с неё. Все остальные Роачи фейки, ничего я не продаю и продавать не буду, вас разводят.
pesnike1Дата: Среда, 20.06.2012, 10:34 | Сообщение # 8
Новенький
Группа: Пользователи
Сообщений: 27
Награды: 0
Город: Ростов-На-Дону
Репутация: 5
Замечания: 20%
Статус:
Они же идут последовательно. Поэтому одновременно запустятся только 50 запросов. И к тому же, если будет такой онлайн, то и хостинг будет хороший, который это всё потянет.

Добавлено (20.06.2012, 10:34)
---------------------------------------------
Или можно сделать не большую проверку, чтобы данная проблема, несмотря на то, что она теоретическая, никогда не появилась.
Создать глобальную переменную.

Code
new log;

В OnPlayerLogin перед первым запросом
Code
do {
} while ( log >= 10 );
log++;

После того как все данные считаны:
Code
log--;

То есть, при запуске паблик будет проверять, сколько игроков считывают данные с MySQL, если их более 10 он будет ждать пока их количество уменьшится (это меньше секунды). При таком раскладе лаг сервер не поймает.

ZiGGiДата: Среда, 20.06.2012, 11:48 | Сообщение # 9
Мастер джэдай
Группа: Продвинутые
Сообщений: 2652
Награды: 34
Город: St. Petersburg
Репутация: 2102
Замечания: 20%
Статус:
Quote (pesnike1)

В OnPlayerLogin перед первым запросом
Code
do {
} while ( log >= 10 );
log++;

Это повесит сервер>_<



Бложе
[indent]Мой блог
Уроки по Pawn
[/indent]

Open-GTO
[indent]Блог разработчиков
GitHub: https://github.com/Open-GTO/Open-GTO
Сборки мода с сервером тут
[/indent]
Edward_ArmstrongДата: Среда, 20.06.2012, 12:11 | Сообщение # 10
Новенький
Группа: Продвинутые
Сообщений: 31
Награды: 0
Город: Пятигорск
Репутация: 29
Замечания: 0%
Статус:
pesnike1, Может это и удобно, но мне это тоже кажется не правильным.
Но за помощь спасибо. Я в моде другом нашел такую-же функцию, но у него без ошибок почему-то, хотя код идентичный абсолютно.
Проблема осталась, и хочется ее поскорее исправить.

pesnike1Дата: Среда, 20.06.2012, 12:59 | Сообщение # 11
Новенький
Группа: Пользователи
Сообщений: 27
Награды: 0
Город: Ростов-На-Дону
Репутация: 5
Замечания: 20%
Статус:
Quote (ZiGGi)

Это повесит сервер>_<

Это лишь зациклит. А когда кто-либо залогинится сразу же даст возможность залогинится. Там ведь всего доли секунды.

ZiGGiДата: Среда, 20.06.2012, 13:14 | Сообщение # 12
Мастер джэдай
Группа: Продвинутые
Сообщений: 2652
Награды: 34
Город: St. Petersburg
Репутация: 2102
Замечания: 20%
Статус:
Quote (pesnike1)
Это лишь зациклит. А когда кто-либо залогинится сразу же даст возможность залогинится. Там ведь всего доли секунды.

Ну повесит, т.е. сервер будет недоступен. Сервер работает в 1 потоке, поэтому он не развиснет.



Бложе
[indent]Мой блог
Уроки по Pawn
[/indent]

Open-GTO
[indent]Блог разработчиков
GitHub: https://github.com/Open-GTO/Open-GTO
Сборки мода с сервером тут
[/indent]
pesnike1Дата: Среда, 20.06.2012, 13:30 | Сообщение # 13
Новенький
Группа: Пользователи
Сообщений: 27
Награды: 0
Город: Ростов-На-Дону
Репутация: 5
Замечания: 20%
Статус:
Ну как же в одном потоке. Он выполняет задачи для каждого клиента отдельно. Если бы он выполнял их в одном потоке, то есть по очереди, то тогда не было бы и той проблемы.
А так, пока сервер будет выдавать данные одному человеку из БД, другой будет в цикле ожидать. Как только выдал, переменная уменьшилась - заходит другой игрок.

Edward_ArmstrongДата: Среда, 20.06.2012, 13:30 | Сообщение # 14
Новенький
Группа: Продвинутые
Сообщений: 31
Награды: 0
Город: Пятигорск
Репутация: 29
Замечания: 0%
Статус:
Ребят, хватит флуда.
ZiGGi, помогите пожалуйста.

DesertДата: Среда, 20.06.2012, 15:41 | Сообщение # 15
Местный
Группа: I'm V.I.P.
Сообщений: 669
Награды: 57
Город: Москва
Репутация: 1082
Замечания: 0%
Статус:
pesnike1,
Не спорь с Зигой

  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:





 


 


 
Хостинг от uCoz samp.at.ua