Работа с MYSQL & SQLite
| |
_wS_
|
Дата: Понедельник, 13.08.2012, 22:12:41 | Сообщение # 1 |
|
Работа с MYSQL & SQLite
Для начала вы должны добавить новую секцию в addons/sourcemod/configs/databases.cfg Если MYSQL, то такую:
Код "Nazvanie_Sekcii" { "driver" "mysql" "host" "ip или домен" "database" "база данных" "user" "пользователь" "pass" "пароль" "port" "3306" } Если SQLite, то такую:
Код "Nazvanie_Sekcii" { "driver" "sqlite" "host" "localhost" "database" "imya_bazi" "user" "root" "pass" "" } Само подключение можно осуществить таким образом:
Код #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" .. можно использовать и это:
Код 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 соединение, есть более простой вариант:
Код decl String:error[256]; g_SQL = SQLite_UseDatabase("imya_bazi", error, 256);
Гости не могут скачивать файлы
|
|
|
| |
_wS_
|
Дата: Понедельник, 13.08.2012, 22:22:31 | Сообщение # 2 |
|
место занято
|
|
| |
Scarface_slv
|
Дата: Среда, 26.09.2012, 13:58:00 | Сообщение # 3 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
Можно команды получения данных, изменения, добавления а то вообще без понятий как все работает, понятно только как можно создать базу, и подключиться.
|
|
| |
_wS_
|
Дата: Среда, 26.09.2012, 16:43:29 | Сообщение # 4 |
|
Попробуй посмотреть примеры, например, в RankMe, да и вообще об этом много инфы повсюду. Позже напишу тут примеры, сейчас пока нет времени, обновляю свои плаги.
|
|
| |
Scarface_slv
|
Дата: Четверг, 27.09.2012, 18:42:56 | Сообщение # 5 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
в RankMe слишком большой код и много лишнего=( буду ждать примеры от вас=)
|
|
| |
«Ba[r]oN»
|
Дата: Вторник, 13.11.2012, 12:43:48 | Сообщение # 6 |
|
Сообщений: 3
Репутация: 0 [ +/- ]
|
|
как произвести запись в таблицу MYSQL
|
|
| |
Scarface_slv
|
Дата: Вторник, 13.11.2012, 13:37:56 | Сообщение # 7 |
|
Сообщений: 737
Репутация: 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 |
|
Сообщений: 563
Репутация: 78 [ +/- ]
|
|
некоторые наброски
// ---
Код 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 |
|
Сообщений: 203
Репутация: 2 [ +/- ]
|
|
У меня вопрос , смотрите если я делаю подключение и отправлю запрос на запись данных то в момент отправки сервер на секунду подвисает . В чем может быть проблема ?
|
|
| |
_wS_
|
Дата: Пятница, 20.09.2013, 14:31:15 | Сообщение # 10 |
|
С SQL_TQuery не должно подвисать.
|
|
| |
panorama
|
Дата: Суббота, 21.09.2013, 16:58:59 | Сообщение # 11 |
|
Сообщений: 203
Репутация: 2 [ +/- ]
|
|
Цитата (_wS_) С SQL_TQuery не должно подвисать. Проверю отпишусь !
|
|
| |
dron216
|
Дата: Среда, 09.10.2013, 13:21:56 | Сообщение # 12 |
|
Сообщений: 151
Репутация: 18 [ +/- ]
|
|
Как получить первые 10 значений из столбца?
Сообщение отредактировал dron216 - Среда, 09.10.2013, 13:22:16 |
|
| |
TEIN
|
Дата: Среда, 09.10.2013, 13:36:03 | Сообщение # 13 |
|
Сообщений: 563
Репутация: 78 [ +/- ]
|
|
Пробуй запрос 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 |
|
Сообщений: 151
Репутация: 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 |
|
Сообщений: 563
Репутация: 78 [ +/- ]
|
|
Where убери. попробуй
|
|
| |
|