Несколько вопросов о MySQL
#1

1. Если мне нужно выполнить запрос на сохранение аккаунта но не нужно обращаться к паблику какая функция за это отвечает? В данный момент я использую так: mysql_tquery(db, query, "", "");. Я правильно делаю или нет?
2. Если мне нужно проверить наличие аккаунта в бд я с OnPlayerConnect делаю запрос и обращяюсь к созданному паблику где проверяю акк таким способом:
PHP код:
    new rowsfields;
    
cache_get_data(rowsfields);
    if(
rows// Авторизация
    
else // Регистрация 
Могу ли я сделать без обращения к паблику эти действия? Типа так:
PHP код:
mysql_format(DBquery64"SELECT * FROM Accounts WHERE Name = '%s'"GN(playerid));
mysql_tquery(DBquery"""");
new 
rowsfields;
cache_get_data(rowsfields);
if(
rows) {
    
// Авторизация
}
else {
    
// Рега

3. В чем будет отличие если я буду юзать format вместо mysql_format или наоборот?
4. Если при сохранении данных я буду их сохранять допустим 5-тьма запросами так как у меня не вмещается все в один это как то повлияет на сервер? Нагрузка или еще что то..
5. В функциях типа cache_get_field_content_int имеется в самом начале аргумент который называется row. Пересмотрел некоторые моды и уроки где используют регистрация на мускуле и везде все ставят 0. Так для чего этот аргумент я не совсем это понял.
6. Говорят что сервера которые на MySQL сильно хрупкие и их можно легко взломать/положить. Это правда?
7. Что такое инъекция в MySQL и для чего она нужна?
Reply
#2

1. mysql_function_query(handle, query[], false, "", "")
2. Не можешь, ответ приходит не сразу.
3. Защита от инъекций, если будешь использовать %e вместо %s
4. Как не вмещается?
pawn Код:
new string[100500];
format(string, sizeof string, "lololo, lalala ...", ...);
format(string, sizeof string, "%s lalala, lololo ...", string, ...);
5. В ответе мускул может присылать несколько строк из таблицы, в этом случае он должен присылать одну, а 0 - номер первой строки
6. Если не использовался ни mysql_real_escape_string, ни mysql_format
7. Про инъекции именно в MySQL ничего сказать не смогу, но если игрок введет нужные символы, а потом они попадут в format, то сервер может лечь.
Reply
#3

А если делать сохранение таким методом:
Функция:
PHP код:
stock Update_Player(p,row[],value) {
    
format(SQL,128,"UPDATE `characters` SET `%s`='%d' WHERE `Name`='%s'",row,value,GPN(p));
    
mysql_tquery(DataBaseSQL"""");
    return 
1;

В паблик дисконекта:
PHP код:
Update_Player(playerid,"Level",PInfo[playerid][pLevel]);
Update_Player(playerid,"Admin",PInfo[playerid][pAdmin]);
Update_Player(playerid,"Sex",PInfo[playerid][pSex]);
Update_Player(playerid,"Money",PInfo[playerid][pMoney]);
... 
Нагрузка будет или чем этот метод хуже этого:
PHP код:
new string[100500];
format(stringsizeof string"lololo, lalala ...", ...);
format(stringsizeof string"%s lalala, lololo ..."string, ...); 
Reply
#4

С таким подходом могу только порекомендовать следующее: никогда не отправляй свое резюме на вакансию программиста. Не позорься.
PS
Quote:

new string[100500];

Вот это число вообще рекомендую забыть навсегда, и даже не смей упоминать его рядом с программистами. Только 42 или степень двойки.
Reply
#5

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
С таким подходом могу только порекомендовать следующее: никогда не отправляй свое резюме на вакансию программиста. Не позорься.
PS Вот это число вообще рекомендую забыть навсегда, и даже не смей упоминать его рядом с программистами. Только 42 или степень двойки.
Это вы мне?
Reply
#6

Quote:
Originally Posted by Kolstin
Посмотреть сообщение
Это вы мне?
А кому ещё.
Reply
#7

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
А кому ещё.
Естественно я бы не использовал в массиве такое огромное число. Я просто напросто спросил, хуже ли будет вариант с несколько запросами в бд. Если он хуже то чем, нагрузка на саму бд будет или что? И чем лучше вариант тот который Alexander_Petrov мне предложил?
Reply
#8

Quote:
Originally Posted by Kolstin
Посмотреть сообщение
Естественно я бы не использовал в массиве такое огромное число. Я просто напросто спросил, хуже ли будет вариант с несколько запросами в бд. Если он хуже то чем, нагрузка на саму бд будет или что? И чем лучше вариант тот который Alexander_Petrov мне предложил?
БД пофиг. А вот на сервер будет нагрузка по вызову всех этих запросов.
Reply
#9

Quote:
Originally Posted by Kolstin
Посмотреть сообщение
Спасибо, тогда такой вопрос:
Есть ли еще какие то варианты сделать все одним запросом? PS: Мне этот не совсем нрава:
Незнаю, или хорошо реализовано - но вот мой вариант.

PHP код:
        strcat(string_query"UPDATE `users` SET");
        
query_strcat(string_querysizeof(string_query), "Leader",PlayerInfo[playerid][pLeader]);
        
query_strcat(string_querysizeof(string_query), "Member",PlayerInfo[playerid][pMember]);
        
query_strcat(string_querysizeof(string_query), "Rank",PlayerInfo[playerid][pRank]);
        
query_strcat(string_querysizeof(string_query), "Job",PlayerInfo[playerid][pJob]);
        
mysql_format(MySQL_CHstring_querysizeof(string_query), "%s `VodPrava` = '%d' WHERE `Name` = '%e'"string_queryPlayerInfo[playerid][pVodPrava], name_player);
        
mysql_tquery(MySQL_CHstring_query"""");
stock query_strcat(query[], lenname[], integer)
{
    new 
string[100];
    
format(stringsizeof(string), " `%s` = '%d', "nameinteger);
    
strcat(querystringlen);
    return 
true;

Насколько я наслышан, mysql_format крашит при большем стринге..
Reply
#10

Вопрос о функции:
Имеется функция mysql_function_query, а в ней есть 3 аргумент с значением bool. Я вычитал что это кеширование. Но для чего оно нужно?
Еще заметил такой интересный факт что в инклуде a_mysql.inc стоит макрос
PHP код:
#define mysql_function_query(%0,%1,%2,%3,"%4"%5) mysql_tquery(%0,%1,%3,#%4%5) 
получается что то что я буду юзать true или false это вообще не нужный аргумент?
Reply
#11

Quote:
Originally Posted by Kolstin
Посмотреть сообщение
Вопрос о функции:
Имеется функция mysql_function_query, а в ней есть 3 аргумент с значением bool. Я вычитал что это кеширование. Но для чего оно нужно?
Еще заметил такой интересный факт что в инклуде a_mysql.inc стоит макрос
PHP код:
#define mysql_function_query(%0,%1,%2,%3,"%4"%5) mysql_tquery(%0,%1,%3,#%4%5) 
получается что то что я буду юзать true или false это вообще не нужный аргумент?
Да, %2 уходит в никуда ( это не нужный аргумент, мы можем указать там что хочешь или юзать сразу mysql_tquery ).
Reply
#12

Возможно ли сделать на MySQL R8 систему домов с добавлением с игры но что бы можно было добавлять дома безлимитное количество? То есть что бы не нужно было в моде указывать #define MAX_HOUSE Макс_колво_домов.
Reply
#13

Quote:
Originally Posted by Kolstin
Посмотреть сообщение
Возможно ли сделать на MySQL R8 систему домов с добавлением с игры но что бы можно было добавлять дома безлимитное количество? То есть что бы не нужно было в моде указывать #define MAX_HOUSE Макс_колво_домов.
Нет, просто укажите больше количество ячеек ( чем нужно ), в переменной с домами.
Ведь вы указуете перед компиляцией количество ячеек в переменной.
Reply
#14

Quote:
Originally Posted by Kolstin
Посмотреть сообщение
Возможно ли сделать на MySQL R8 систему домов с добавлением с игры но что бы можно было добавлять дома безлимитное количество? То есть что бы не нужно было в моде указывать #define MAX_HOUSE Макс_колво_домов.
С применением плагина типа: Gvar
Reply
#15

Можно и без плагинов, если применить самую малость смекалки. Укажите в MAX_HOUSE число, которое считаете для себя лимитом, все массивы и переменные для домов указывайте с размером MAX_HOUSE, добавьте переменную CURRENT_HOUSES и изменяйте, когда добавляете дом или удаляете (Только тогда, когда дом использует/использовал наибольший существующий id). В циклах тоже используйте CURRENT_HOUSES, везде используйте CURRENT_HOUSES, кроме объявлений переменных.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)