Pushistik↯❤
Команда форума
- Регистрация
- 6 Июл 2017
- Сообщения
- 393
- Реакции
- 97
- Баллы
- 28
[SourcePawn] Урок 13 - Работа с базами данных (MySQL, SQLite)
<= К содержанию
Основные типы при работе с базами данных- Database - производный тип от Handle, который являет собой соеденение с базой.
- Методы Database
- Connect - Подключается к базе данных
PHP:
void Connect(SQLConnectCallback callback, const char[] name="default", any data=0);
- SQLConnectCallback callback - Обратный вызов.
- char[] name - Имя секции для подключения в файле databases.cfg.
- any data - Данные для передачи в обратный вызов. По умолчанию = 0.
- Connect - Подключается к базе данных
PHP:Database g_hDatabase; // Глобальная переменная для соеденения с базой [/LIST] public void OnPluginStart() { Database.Connect(ConnectCallBack, "sp_lessons"); // sp_lessons Имя секции в databases.cfg } public void ConnectCallBack (Database hDB, const char[] error, any data) // Пришел результат соеденения { if (hDB == null) // Соединение не удачное { SetFailState("Database failure: %s", sError); // Отключаем плагин return; } g_hDatabase = hDB; // Присваиваем глобальной переменной соеденения значение текущего соеденения CreateTables(); // Функция пока не реализована, но по имени, думаю, ясно что она делает }
- SetCharset - Устанавливает набор символов при работе с базой.
PHP:
bool SetCharset(const char[] charset)
- char[] charset - Набор символов (Например: "utf8" или "latin1")
PHP:
g_hDatabase.SetCharset("utf8");
- Query - Выполняет запрос к базе.
PHP:
void Query(SQLQueryCallback callback, const char[] query, any data, DBPriority prio)
- SQLQueryCallback callback - Обратный вызов.
- char[] query - Запрос
- any data - Данные для передачи в обратный вызов. По умолчанию = 0.
- DBPriority prio - Приоритет выполнения. По умолчанию = DBPrio_Normal.
PHP:
public void OnClientPostAdminCheck(int iClient) [/LIST] [/LIST] { if(IsFakeClient(iClient) == false) { char szQuery[256], szAuth[32]; GetClientAuthId(iClient, AuthId_Engine, szAuth, sizeof(szAuth), true); FormatEx(szQuery, sizeof(szQuery), "SELECT `id`, `points` FROM `table_players` WHERE `auth` = '%s';", szAuth); // Формируем запрос g_hDatabase.Query(SQL_Callback_SelectClient, szQuery, GetClientUserId(iClient)); } } public void SQL_Callback_SelectClient(Database hDatabase, DBResultSet results, const char[] sError, any iUserID) // Обратный вызов { if(sError[0]) // Если произошла ошибка { LogError("SQL_Callback_SelectClient: %s", sError); // Выводим в лог return; // Прекращаем выполнение ф-и } int iClient = GetClientOfUserId(iUserID); if(iClient) { // Игрок всё еще на сервере } }
- Execute - Отправляет транзакцию.
PHP:
void Execute(Transaction txn, SQLTxnSuccess onSuccess, SQLTxnFailure onError, any data, DBPriority priority)
- Transaction txn - Экземпляр типа Transaction.
- SQLTxnSuccess onSuccess - Обратный вызов в случае успеха.
- SQLTxnFailure onError - Обратный вызов в случае неудачи.
- any data - Данные для передачи в обратный вызов. По умолчанию = 0.
- DBPriority priority - Приоритет выполнения. По умолчанию = DBPrio_Normal.
PHP:void MyFunc() { Transaction hTxn = new Transaction(); hTxn.AddQuery("запрос 1;", 8); // Как данные передадим число 8 hTxn.AddQuery("запрос 2;", 20); // Как данные передадим число 20 // ... hTxn.AddQuery("запрос 52;"); g_hDatabase.Execute(hTxn, SQL_TxnCallback_Success, SQL_TxnCallback_Failure, 150); // Как данные передадим число 150 } public void SQL_TxnCallback_Success(Database hDatabase, any Data, int iNumQueries, DBResultSet[] results, any[] QueryData) { // SQL_TxnCallback_Success // Data = 150 // iNumQueries = кол-во запросов // DBResultSet[] results = массив результатов запросов // any[] QueryData = массив данных запросов } public void SQL_TxnCallback_Failure(Database hDatabase, any Data, int iNumQueries, const char[] szError, int iFailIndex, any[] QueryData) { // Один или больше запросов прошли неудачно LogError("SQL_TxnCallback_Failure: %s", szError); }
- Escape - Экранирует символы ' в строке.'
PHP:
bool Escape(const char[] string, char[] buffer, int maxlength, int &written)
- char[] string - Исходная строка
- char[] buffer - Буфер, куда будет помещен результат (Размер должен быть 2*strlen(string)+1)
- int maxlength - Размер буфера
- int &written - Буфер, в который будет записано количество записанных байт. По умолчанию = 0.
PHP:char szName[MAX_NAME_LENGTH]; GetClientName(iClient, szName, sizeof(szName)); char[] szEscapedName = new char[2*strlen(szName)+1]; g_hDatabase.Escape(szName, szEscapedName, sizeof(szEscapedName));
- IsSameConnection - Проверяет совпадают ли соеденения.
PHP:
bool IsSameConnection(Database other)
- Database other - Соединение с базой данных
PHP:Database g_hDatabase2 // Другое соединение if(g_hDatabase.IsSameConnection(g_hDatabase2)) { PrintToServer("Подключения ведут к одной базе данных!"); } else { PrintToServer("Это разные соединения"); }
- Свойства Database
- Driver - Возвращает драйвер подключения к базе данных (тип DBDriver).
- DBDriver - драйвер базы данных.
- Методы DBDriver
- Find - Находит драйвер по имени.
PHP:
DBDriver Find(const char[] name);
- char[] name - Строка идентификации драйвера ("mysql" или "sqlite")
- GetIdentifier - Получает имя драйвера.
PHP:
void GetIdentifier(char[] ident, int maxlength)
- char[] ident - Буфер, куда будет помещена строка идентификации драйвера ("mysql" или "sqlite")
- int maxlength - Размер буфера
- GetProduct - Получает продукт драйвера.
PHP:
void GetProduct(char[] product, int maxlength)
- char[] product - Буфер, куда будет помещен продукт ("MySQL" или "SQLite")
- int maxlength - Размер буфера
- Find - Находит драйвер по имени.
- Методы DBDriver
- DBStatement - представляет собой предварительно скомпилированный запрос SQL, который может выполняться несколько раз с различными параметрами.
- Методы DBStatement
- BindInt - Назначает параметр в подготовленном запросе для целого значения.
PHP:
void BindInt(int param, int number, bool signed)
- int param - Индекс параметра (начинается с 0)
- int number - Число для назначения
- bool signed - true - знаковое число, false - беззнаковое
- BindFloat - Назначает параметр в подготовленном запросе для числа с плавающей точкой.
PHP:
void BindFloat(int param, float value)
- int param - Индекс параметра (начинается с 0)
- float value - Число для назначения
- BindString - Назначает параметр в подготовленном запросе для строки.
PHP:
void BindString(int param, const char[] value, bool copy)
- int param - Индекс параметра (начинается с 0)
- char[] value - Строка для назначения
- bool copy - Если true - будет использована копия переменной (если значение переменной изменится то в запросе оно останется тем же).
- BindInt - Назначает параметр в подготовленном запросе для целого значения.
- Методы DBStatement
- Transaction - транзакция (набор запросов, которые связанны между собой и либо выполняются все, либо ни один из них).
- Методы Transaction
- Transaction - Создает объект типа Transaction.
PHP:
Transaction hTxn = new Transaction();
- AddQuery - Добавляет запрос в транзакцию. Возвращает индекс запроса в списке транзакции.
PHP:
int AddQuery(const char[] query, any data)
- char[] query - Запрос.
- any data - Данные для передачи в обратный вызов. По умолчанию = 0.
PHP:Transaction hTxn = new Transaction(); hTxn.AddQuery("UPDATE `table_players` SET `points` = 0;"); hTxn.AddQuery("UPDATE `table_players` SET `points` = 100 WHERE `id` = 5;", 5); // Как данные передадим цифру 5
- Transaction - Создает объект типа Transaction.
- Методы Transaction
- DBResultSet - набор результатов, возвращаемых из запроса.
- Методы DBResultSet
- FetchRow - Возвращает строку из текущего набора результатов. Это нужно выполнять перед извлечением результатов. Возвращает true в случае успеха.
PHP:if(hResult.FetchRow()) // Если условие выполнено - можно получать данные { // Здесь будем получать данные } // Если запрос должен вернуть не 1, а несколько строк то можно сделать так: while(hResult.FetchRow()) // Тело цикла будет выполнятся пока можно получать данные { // Здесь будем получать данные }
- FetchInt - Возвращает целочисленное значение из текущей строки. Если NULL - вернет 0.
PHP:
int FetchInt(int field, DBResult &result)
- int field - Индекс поля (начинается с 0).
- DBResult &result - Буфер, для сохранения статуса, возвращаемого значения. По умолчанию = 0.
- FetchFloat - Возвращает значение с плавающей точкой из текущей строки. Если NULL - вернет 0.0.
PHP:
float FetchFloat(int field, DBResult &result)
- int field - Индекс поля (начинается с 0).
- DBResult &result - Буфер, для сохранения статуса, возвращаемого значения. По умолчанию = 0.
PHP:// "SELECT (CAST(kills as float)/CAST(daths as float)) as kdr FROM `table_players` WHERE `id` = 6;" // Получим соотношение кол-ва убийств к кол-ву смертей float fKDR = hResult.FetchFloat(0);
- FetchString - Возвращает строковое значение из текущей строки. Если NULL - вернет "".
PHP:
int FetchString(int field, char[] buffer, int maxlength, DBResult &result)
- int field - Индекс поля (начинается с 0).
- char[] buffer - Буфер, для записи строки.
- int maxlength - Размер буфера.
- DBResult &result - Буфер, для сохранения статуса, возвращаемого значения. По умолчанию = 0.
PHP:// "SELECT `clan_tag` FROM `table_players` WHERE `id` = 8;" // Получим соотношение кол-ва убийств к кол-ву смертей char szClanTag[32]; hResult.FetchString(0, szClanTag, sizeof(szClanTag));
- FetchSize - Возвращает размер строки в текущей строке набора. Это нужно вызывать только для строк, чтобы определить какого размера необходимо создать буфер. Обратите внимание, что возвращаемое значение не включает в себя нулевой символ.
PHP:
int FetchSize(int field)
- int field - Индекс поля (начинается с 0).
PHP:// С использованием этого метода, предыдущий код можно написать так: int iSize = hResult.FetchSize(0)+1; char[] szClanTag = new char[iSize]; hResult.FetchString(0, szClanTag, iSize );
- IsFieldNull - Возвращает является ли поле NULL.
PHP:
bool IsFieldNull(int field)
- int field - Индекс поля (начинается с 0).
PHP:if(hResult.IsFieldNull(0)) { // поле `clan_tag` является NULL }
- FieldNumToName - Получает имя поля по его индексу.
PHP:
void FieldNumToName(int field, char[] name, int maxlength)
- int field - Индекс поля (начинается с 0).
- char[] name - Буфер, для записи имени поля.
- int maxlength - Размер буфера.
PHP:char szFieldName[32]; hResult.FieldNumToName(0, szFieldName, sizeof(szFieldName)); // szFieldName = "clan_tag"
- FieldNameToNum - Получает индекс поля по его имени.
PHP:
bool FieldNameToNum(const char[] name, int &field)
- char[] name - Имя поля.
- int &field - Буфер, для записи индекса пол).
PHP:int iField; if(FieldNameToNum("clan_tag", iField)) { // iField = 0 }
- FetchMoreResults - Переход к следующему набору результатов.
В некоторых реализациях SQL, несколько наборов результатов могут существовать на одном запросе. Это возможно в MySQL с помощью простых запросов при выполнении запроса CALL. Если дело обстоит именно так, то все наборы результатов должны быть обработаны до того как другой запрос был сделан.PHP:bool FetchMoreResults()
- FetchRow - Возвращает строку из текущего набора результатов. Это нужно выполнять перед извлечением результатов. Возвращает true в случае успеха.
- Свойства DBResultSet
- HasResults - Возвращает, существует ли или нет набор результатов. Это возвращает true, даже если были возвращены 0 результаты, но false на запросах как UPDATE, INSERT или DELETE.
- RowCount - Возвращает количество строк в последнем наборе результатов.
- FieldCount - Возвращает количество полей в последнем наборе результатов.
- MoreRows - Возвращает, есть ли еще строки.
- AffectedRows - Возвращает, измененнных/удаленных (затронутых) запросом строк.
- InsertId - Возвращает, последний id из INSERT запроса.
- Методы DBResultSet
- Transaction - представляет собой набор запросов SQL, который являются зависимыми друг от друга. Либо все должны быполнены успешно, либо не будет выполнен ни один.
- Методы Transaction
- Transaction - Создает новую транзакцию.
PHP:
Transaction hTxn = new Transaction();
- AddQuery - Добавляет SQL запрос в транзакцию.
PHP:
int AddQuery(const char[] query, any data)
- char query - SQL запрос
- any data - Данные для передачи
PHP:hTxn.AddQuery("запрос 1;", 8); // Как данные передадим число 8
- Transaction - Создает новую транзакцию.
- Методы Transaction
- Execute - Отправляет транзакцию.
- char[] charset - Набор символов (Например: "utf8" или "latin1")
- Методы Database
В качестве примера простой плагин статистики (вложение)
Вложения
-
6,8 KB Просмотры: 6
Последнее редактирование: