Заказать Сервер Заказать Плагин Контакты Поиск

[ вход ]
[ последние сообщения ]

Страница 1 из 212»
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » Работа с MYSQL & SQLite (Подключение, запросы, примеры)
Работа с MYSQL & SQLite
_wS_ Дата: Понедельник, 13.08.2012, 22:12:41 | Сообщение # 1
Работа с MYSQL & SQLite

Для начала вы должны добавить новую секцию в addons/sourcemod/configs/databases.cfg
Если MYSQL, то такую:

Code
"Nazvanie_Sekcii"
{
     "driver"    "mysql"
     "host"    "ip или домен"
     "database"    "база данных"
     "user"    "пользователь"
     "pass"    "пароль"
     "port"    "3306"
}

Если SQLite, то такую:

Code
"Nazvanie_Sekcii"
{
     "driver"    "sqlite"
     "host"    "localhost"
     "database"    "imya_bazi"
     "user"    "root"
     "pass"    ""
}

Само подключение можно осуществить таким образом:

Code
#include <sourcemod>

new Handle:g_SQL = INVALID_HANDLE, bool:MYSQL;

public OnPluginStart()
{
     if (!SQL_CheckConfig("Nazvanie_Sekcii"))
     {
         SetFailState("Секция \"Nazvanie_Sekcii\" не найдена в databases.cfg");
         return;
     }

     decl String:error[256];
     g_SQL = SQL_Connect("Nazvanie_Sekcii", true, error, 256);
     if (g_SQL == INVALID_HANDLE)
     {
         LogError(error);
         SetFailState("Не удалось установить SQL соединение");
         return;
     }

     // тип соединения (mysql или sqlite)
     new String:driver[15]; SQL_ReadDriver(g_SQL, driver, 15);
     MYSQL = StrEqual(driver, "mysql", false);
     LogMessage("Установлено %s соединение", MYSQL ? "MYSQL" : "SQLite");

     // создаем таблицу
     if (!MYSQL)
     {
         SQL_TQuery(g_SQL, SQL_DefCallback, "CREATE TABLE IF NOT EXISTS `my_tab` (\
             steamid TEXT PRIMARY KEY, \
             points NUMERIC, \
             nick TEXT)", 0);
     }
     else
     {
         SQL_TQuery(g_SQL, SQL_DefCallback, "CREATE TABLE IF NOT EXISTS `my_tab` (\
             `steamid` varchar(25) NOT NULL, \
             `points` int(20) NOT NULL, \
             `nick` varchar(32) NOT NULL, \
             PRIMARY KEY (`steamid`))", 0);
     }
}

public SQL_DefCallback(Handle:owner, Handle:hndl, const String:error[], any:data)
{
     if (hndl == INVALID_HANDLE) LogError(error);
}

Чтобы лучше это понимать, вы должны ознакомиться с запросами, какие они бывают (например, SELECT, DELETE, UPDATE), какой их синтаксис и т.д. - есть немало статей об этом и готовых примеров.

g_SQL - глобальная Handle переменная для хранения результата подключения к БД.
Если g_SQL == INVALID_HANDLE, то подключение не удалось.

SQL_ReadDriver - позволяет определить драйвер, тип подключения.
Это полезно, т.к. есть небольшая разница между MYSQL и SQLite запросами (а именно в синтаксисе).

Если используется SQLite соединение, то база будет храниться в addons/sourcemod/data/sqlite
Вместо SQL_CheckConfig и SQL_Connect("Nazvanie_Sekcii" .. можно использовать и это:

Code
new Handle:kv = CreateKeyValues("");
KvSetString(kv, "driver", "sqlite");
KvSetString(kv, "host", "localhost");
KvSetString(kv, "database", "imya_bazi");
KvSetString(kv, "user", "root");
KvSetString(kv, "pass", "");

decl String:error[255];
g_SQL = SQL_ConnectCustom(kv, error, 255, true);
CloseHandle(kv);

Чтобы создать SQLite соединение, есть более простой вариант:

Code
decl String:error[256];
g_SQL = SQLite_UseDatabase("imya_bazi", error, 256);

Прикрепления: urok.zip(1Kb)
 
_wS_ Дата: Понедельник, 13.08.2012, 22:22:31 | Сообщение # 2
место занято
 
Scarface_slv Дата: Среда, 26.09.2012, 13:58:00 | Сообщение # 3
Сообщений: 749
Репутация: 61 [ +/- ]
Можно команды получения данных, изменения, добавления а то вообще без понятий как все работает, понятно только как можно создать базу, и подключиться. grust
 
_wS_ Дата: Среда, 26.09.2012, 16:43:29 | Сообщение # 4
Попробуй посмотреть примеры, например, в RankMe, да и вообще об этом много инфы повсюду.
Позже напишу тут примеры, сейчас пока нет времени, обновляю свои плаги.
 
Scarface_slv Дата: Четверг, 27.09.2012, 18:42:56 | Сообщение # 5
Сообщений: 749
Репутация: 61 [ +/- ]
в RankMe слишком большой код и много лишнего=( буду ждать примеры от вас=)
 
«Ba[r]oN» Дата: Вторник, 13.11.2012, 12:43:48 | Сообщение # 6
Сообщений: 3
Репутация: 0 [ +/- ]
как произвести запись в таблицу MYSQL
 
Scarface_slv Дата: Вторник, 13.11.2012, 13:37:56 | Сообщение # 7
Сообщений: 749
Репутация: 61 [ +/- ]
как то так вроде) сам толком ничего незнаю
Code

decl String:query[255];
Format(query, sizeof(query), "INSERT OR REPLACE INTO my_tab VALUES ('STEAM_0:0:987654322', '1');");
SQL_TQuery(g_SQL, SQL_CallBack, query);  
 
TEIN Дата: Суббота, 10.08.2013, 18:41:04 | Сообщение # 8
Сообщений: 550
Репутация: 73 [ +/- ]
некоторые наброски

// ---

Код
LineNumber     String                    StringLen
1                    Вау, как красиво!                     16
2                    Красивый вечер был впереди    26


// Как создать такую таблицу?
Код
Format(query, sizeof(query), "CREATE TABLE table_name ('LineNumber' varchar (256), 'String' varchar (256), 'StringLen' int (10), PRIMARY KEY ('LineNumber'));");


// Как добавить строку?
Код
// Номер строки
#define test_number 3

// Строка
#define test_string "Да, да! Это именно это!"

// Длина строки
#define test_len 23

Format(query, sizeof(query), "INSERT INTO table_name ('LineNumber', 'String', 'StringLen') VALUES (%d, '%s', %d);", test_number, test_string, test_len);


// Как получить вторую строку?
Код
Format(query, sizeof(query), "SELECT String FROM table_name WHERE LineNumber = 2;");


// Как обновить первую строку?
Код
// На какую строку заменить?
#define test2_string "Тоже тест"

// Длина новой строки
#define test2_len 9

Format(query, sizeof(query), "UPDATE table_name SET String = '%s', StringLen = %d WHERE LineNumber = 1;", test2_string, test2_len);


// Как удалить вторую строку?
Код
Format(query, sizeof(query), "DELETE FROM table_name WHERE LineNumber = 2;");


Добавлено (10.08.2013, 18:41:04)
---------------------------------------------
Часто используемые команды :

Цитата
// ---
WHERE - Загружает данные, которые удовлетворяют условию
Пример использования: Есть ниже
// ---

// ---
CREATE TABLE - Создает таблицу
Вместе с этой командой следует использовать IF NOT EXISTS, эта команда добавляет условие, если таблица не была создана ранее
Пример использования: CREATE TABLE IF NOT EXISTS Имя_Базы_Данных (Строка_1 varchar (Длина строки), Число_1 int (Длина числа));
// ---

// ---
INSERT INTO - Создает данные в базе данных
Пример использования: INSERT INTO Имя_Базы_Данных (Ячейка_1, Ячейка_2) VALUES (Значение_1, Значение_2);
// ---

// ---
SELECT - Загружает данные из базы данных
Можно загружать все данные сразу (*), а можно выбирать
Пример использования: SELECT * FROM Имя_Базы_Данных WHERE blabla = 1; - Загрузит все данные, где blabla = 1
SELECT test1, test2 FROM Имя_Базы_Данных WHERE blabla = 1; - Загрузит только две ячейки (test1 и test2), где blabla = 1
// ---

// ---
UPDATE - Обновляет данные в базе данных
Пример использования: UPDATE Имя_Базы_Данных SET Ячейка_1 = Значение_1, Ячейка_2 = Значение_2 WHERE blabla = 1;
// ---

// ---
DELETE - Удаляет данные из базы данных
Пример использования: DELETE FROM Имя_Базы_Данных WHERE blabla = 1;
// ---


Ну и некоторые полезные команды:
Цитата
// ---
ORDER BY - Сортировка данных
Сортировать в порядке: Убывания - DESC || Возрастания - ASC
Пример использования: SELECT * FROM Имя_Базы_Данных ORDER BY Столбец_Который_Нужно_Сортировать (ASC или DESC, Без скобок);
// ---

// ---
COUNT - Количество данных
Пример использования: SELECT COUNT(Название_Столбца) FROM Имя_Базы_Данных;
Если хотите узнать общее количество записей во всех ячейках, то замените Название_Столбца на *
// ---


Сообщение отредактировал TEIN - Суббота, 10.08.2013, 18:42:07
 
panorama Дата: Пятница, 20.09.2013, 12:47:46 | Сообщение # 9
Сообщений: 206
Репутация: 2 [ +/- ]
У меня вопрос , смотрите если я делаю подключение и отправлю запрос на запись данных то в момент отправки сервер на секунду подвисает . В чем может быть проблема ?
 
_wS_ Дата: Пятница, 20.09.2013, 14:31:15 | Сообщение # 10
С SQL_TQuery не должно подвисать.
 
panorama Дата: Суббота, 21.09.2013, 16:58:59 | Сообщение # 11
Сообщений: 206
Репутация: 2 [ +/- ]
Цитата (_wS_)
С SQL_TQuery не должно подвисать.

Проверю отпишусь !
 
dron216 Дата: Среда, 09.10.2013, 13:21:56 | Сообщение # 12
Сообщений: 152
Репутация: 18 [ +/- ]
Как получить первые 10 значений из столбца?


Сообщение отредактировал dron216 - Среда, 09.10.2013, 13:22:16
 
TEIN Дата: Среда, 09.10.2013, 13:36:03 | Сообщение # 13
Сообщений: 550
Репутация: 73 [ +/- ]
Пробуй запрос
SELECT * FROM name_table WHERE ORDER BY tvoi_stolbec DESC LIMIT 10
затем в Callback
Код
while (SQL_FetchRow(hndl))
{
       PrintToServer("%d", SQL_FitchInt(hndl, 0));
}
 
dron216 Дата: Среда, 09.10.2013, 15:18:38 | Сообщение # 14
Сообщений: 152
Репутация: 18 [ +/- ]
Код
public Action:jtop(client, args)
{
  new String:queryTOP[100];
  Format(queryTOP, sizeof(queryTOP), "SELECT * FROM 'JailDays' WHERE ORDER BY DaysInJail DESC LIMIT 10");
  SQL_TQuery(g_SQL, SQL_TOP, queryTOP, 0);
   
  return Plugin_Handled;
}
public SQL_TOP(Handle:owner, Handle:hndl, const String:error[], any:data)  
{  
  if (hndl == INVALID_HANDLE) LogError(error);  
   
  while (SQL_FetchRow(hndl))
  {
   PrintToServer("%d", SQL_FetchInt(hndl, 0));
  }
}


Код
L 10/09/2013 - 16:16:34: [jailed_reasons.smx] near "ORDER": syntax error
L 10/09/2013 - 16:16:34: [SM] Native "SQL_FetchRow" reported: Invalid query Handle 0 (error: 4)
L 10/09/2013 - 16:16:34: [SM] Displaying call stack trace for plugin "jailed_reasons.smx":
L 10/09/2013 - 16:16:34: [SM]   [0]  Line 91, jailed_reasons.sp::SQL_TOP()
 
TEIN Дата: Среда, 09.10.2013, 15:51:16 | Сообщение # 15
Сообщений: 550
Репутация: 73 [ +/- ]
Where убери. попробуй
 
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » Работа с MYSQL & SQLite (Подключение, запросы, примеры)
Страница 1 из 212»
Поиск: