[DJ]Smagold
Ученик
Всем привет!
В этом уроке я расскажу о создании SQLite базы данных для своего сервера.
Если плохо грузятся картинки:
Все данные в базе представлены в виде таблиц, элементами которых являются:
rows - строки
fields - столбцы (поля)
У каждого столбца есть свое имя, но кроме имени они имеют и свой порядковый номер (начиная с нуля)
Ниже дан пример таблицы players которая используется на моем сервере:
Рисунок 1 - пример таблицы SQLЗдесь можно увидеть 7 столбцов. Заголовки: id, name, ip, pass, email, gang,lvl - это и есть имена столбцов. Столбец id я сделал специально для нумерации строк, а также эти значения являются уникальными для каждого аккаунта.
Строки имеют только номер, но средствами a_sampdb.inc нельзя найти строку по указанному номеру.
У каждого столбца есть свой тип данных, давайте рассмотрим некоторые из них:
INT - целые числа от -2 147 483 648 до 2 147 483 647
SMALLINT -целые числа от -32 768 до 32 767
TINYINT - целые числа от -128 до 127
VARCHAR - строки переменной длинны (НЕ длиннее 255 символов)
Этих типов достаточно для создания системы аккаунтов.
Вот как реализуется система клиент-сервер:
При запуске SAMP-сервера из вашего игрового мода происходит обращение к SQLite базе данных, ваш мод выступает в роли клиента, а SAMP-сервер это и есть SQLite-сервер. Обращения мода представляют собой текстовые запросы на специальном языке который понятен SQLite-серверу. В ответ на запрос приходит результат, который можно представить в виде переменной DBResult
Эта переменная представляет собой двумерный массив (небольшую таблицу) который получился отбрасыванием ненужной информации от главной (большой) таблицы.

Чтобы понять с чего начинать писать запрос надо понять чего мы хотим получить, итак:
(смотрите картинку выше)
3.1 SELECTЕсли требуется выбрать (получить) данные из таблицы используем слово SELECT, после него ставим пробел и указываем столбцы из которых хотим получить данные:
Если хотим получить только один столбец: SELECT name
Если несколько (разделяем запятой): SELECT name, pass, gang
Если все столбцы (ставим звездочку): SELECT *
Все, со столбцами определились, далее пишем слово FROM - это слово указывает из какой таблицы требуется выбрать столбцы. Добавляем имя таблицы, например players
Делее следует слово WHERE с помощью него задаются особые условия выборки:
Например требуется получить имена и IP-адреса игроков уровень которых больше 30:
SELECT name, ip FROM players WHERE lvl > 30
Рисунок 2 - логика выборки SELECTНадо получить пароль игрока имя которого OFFREAL:
SELECT pass FROM players WHERE name = 'OFFREAL'
Рисунок 3 - логика выборки SELECTПримечание: если в запросе используются текстовые данные (VARCHAR см. выше), их следует заключать в одинарные кавычки 'текст'
Схема запроса:
SELECT имя_столбца_А, имя_столбца_Б, ... FROM имя_таблицы WHERE условия LIMIT N
Примечание: Слово LIMIT указывает сколько строк данных будет в результате, N - количество строк
3.2 UPDATEЕсли требуется обновить данные в таблице, запрос начинается со слова UPDATE после которого указывается имя таблицы (например players) Далее следует слово SET и перечисляются данные которые надо изменить. Заканчивается запрос особым условием WHERE (см. описание выше)
Пример: требуется сохранить уровень игрока OFFREAL равный 25
UPDATE players SET lvl = 25 WHERE name = 'OFFREAL'
Требуется сохранить новый E-mail игрока Crysis - crysis@mail.ru
UPDATE players SET email = 'crysis@mail.ru' WHERE name = 'Crysis'
Примечание: Результат запроса UPDATE - простое число, равное 0 если запись в базу не произошла, 1 если все прошло успешно.
Схема запроса:
UPDATE имя_таблицы SET имя_столбца_А = новые_данные_в_столбец_А, имя_столбца_Б = новые_данные_в_столбец_Б, ...WHERE условия
3.3 INSERT INTOИспользуется для добавления новой строки, пишем: INSERT INTO, далее имя таблицы (например players), далее в скобках перечисляем столбцы в которые вносим данные: ( name, ip, lvl ), далее пишем слово VALUES и в скобках перечисляем значения переменных: ( 'MySAN', '92.38.226.4', 35 ). Целиком получилось:
INSERT INTO players ( name, ip, lvl ) VALUES ( 'MySAN', '92.38.226.4', 35 )
Мы внесли в таблицу players информацию о игроке MySAN, IP-адрес которого 92.38.226.4, уровень которого 35
Схема запроса:
INSERT INTO имя_таблицы ( имя_столбца_А, имя_столбца_Б, ... ) VALUES ( значение_в_столбец_А, значение_в_столбец_Б, ... )
Примечания:
- При создании нового аккаунта, я рекомендую в INSERT INTO заполнять все столбцы, так как при попытке выбора (SELECT) целочисленных (INT, BIGINT ...)данных из пустых ячеек SAMP-сервер падает!
- Будьте аккуратнее при оформлении запросов с указанием текстовых (VARCHAR) переменных, если забыть поставить ' это приведет к образованию пустых ячеек во всей строке!
3.4 CREATE TABLEЭтот запрос применяется крайне редко для создания таблиц, тут все предельно просто, пишем:
CREATE TABLE, далее имя для новой таблицы, пусть будет vehicles, далее ставим скобки ( ), внутри которых через запятую перечисляем по порядку имена бушующих столбцов и тип данных в них (см. выше):
CREATE TABLE vehicles ( model int, x_coord varchar, y_coord varchar, z_coord varchar, a_coord varchar )
Схема запроса:
CREATE TABLE имя_новой_таблицы ( имя_столбца_0 тип_данных_в_столбце_0, имя_столбца_1 тип_данных_в_столбце_1, ... )
Примечания:
- не важно строчными или заглавными буквами указывать тип переменных
- имя таблицы или столбца не должно начинаться с цифр
db_open(name[]);- функция используется для подключения к базе данных. В качестве name указывается путь к файлу .db и его
имя. В случае успешного подключения эта функция вернет нам значение особой переменной типа DB
Далее пишем в OnGameModInit
db_close(DB:db);- функция используется для отключения от базы данных
Примечания: Я рекомендую не отключаться от базы данных на протяжении всей работы мода!
db_query(DB:db,query[]);- функция используется для отправки запросов (см. пункт 3) SQLite-серверу, и возвращает результат в виде особой переменной DBResult. Все следующие функции которые мы рассмотрим будут работать именно с DBResult.
В результате содержится двумерный массив в котором 3 столбца и 4 строки (см. рисунок ниже)
Рисунок 4 - зеленым отмечены ячейки выбранные из таблицы, это и есть результатА вот как выглядит сам результат запроса:
Рисунок 5 - результат запроса
db_free_result(DBResult:dbresult);- функция очищает результат запроса
db_num_rows(DBResult:dbresult);- функция проверяет результат запроса и возвращает количество строк в нем
db_num_fields(DBResult:dbresult);- функция проверяет результат запроса и возвращает количество столбцов в нем
db_next_row(DBResult:dbresult);- функция для переключения на следующую строку результата. Сразу после того как мы получили результат запроса, он переключен на 0 строку (см. рисунок 5), и теперь указав номер (или имя) столбца мы получим значение ячейки.
Например указав столбец номер 1 мы получим значение ячейки 'OFFREAL', а если потом один раз воспользуемся db_next_row, то получим '[EPG]_KOT'
Примечания: Чаще всего в запросах SELECT (см. выше) используют LIMIT 1 и получают результаты в которых только одна строка, но много столбцов, и использовать db_next_row не приходится.
db_field_name(DBResult:dbresult, field, result[], maxlength);- функция возвращает имя столбца результата запроса по номеру этого столбца
db_get_field(DBResult:dbresult, field, result[], maxlength);
и
db_get_field_assoc(DBResult:dbresult, const field[], result[], maxlength);
- функции получают значение ячейки которая находится на пересечении указанного в них столбца (field или field[]) и строки на которую переключен результат запроса (см. описание db_next_row).
В db_get_field указывается номер столбца (параметр field),
а в db_get_field_assoc указывается имя столбца (параметр field[])
Пример: требуется получить значение ячейки (строка 0, столбец 1) результата запроса
Примечания: Эти две функции получают содержимое ячеек только в текстовом формате, и для преобразования некоторых значений в числа надо использовать strval или floatstr
- - - - - -
Спасибо всем кто прочитал до конца xD
Надеюсь, ваше понимание SQLite стало более ясным.
Автор урока: OFFREAL
В этом уроке я расскажу о создании SQLite базы данных для своего сервера.
Если плохо грузятся картинки:
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
1. Вообще что такое SQLite ??
SQLite - легкая (не требующая больших ресурсов) встраиваемая система управления базами данных. Работа системы построена по принципу клиент-сервер. SQLite хранит всю базу данных в единственном стандартном файле (.db) на том компьютере, на котором исполняется программа.Все данные в базе представлены в виде таблиц, элементами которых являются:
rows - строки
fields - столбцы (поля)
У каждого столбца есть свое имя, но кроме имени они имеют и свой порядковый номер (начиная с нуля)
Ниже дан пример таблицы players которая используется на моем сервере:
Рисунок 1 - пример таблицы SQL
Строки имеют только номер, но средствами a_sampdb.inc нельзя найти строку по указанному номеру.
У каждого столбца есть свой тип данных, давайте рассмотрим некоторые из них:
INT - целые числа от -2 147 483 648 до 2 147 483 647
SMALLINT -целые числа от -32 768 до 32 767
TINYINT - целые числа от -128 до 127
VARCHAR - строки переменной длинны (НЕ длиннее 255 символов)
Этих типов достаточно для создания системы аккаунтов.
2. Как управлять своей базой данных ??
Напомню, еще раз, что система управления базами данных SQLite УЖЕ встроена в SAMP-сервер и никаких плагинов для ее работы подключать НЕ надо!Вот как реализуется система клиент-сервер:
При запуске SAMP-сервера из вашего игрового мода происходит обращение к SQLite базе данных, ваш мод выступает в роли клиента, а SAMP-сервер это и есть SQLite-сервер. Обращения мода представляют собой текстовые запросы на специальном языке который понятен SQLite-серверу. В ответ на запрос приходит результат, который можно представить в виде переменной DBResult
PHP:
new DBResult:TEST; // объявляем переменную типа "Результат запроса"
3. Язык SQL запросов
Этот язык на самом деле очень простой, и только на первый взгляд кажется ужасным майндфаком Чтобы понять с чего начинать писать запрос надо понять чего мы хотим получить, итак:
(смотрите картинку выше)
Если хотим получить только один столбец: SELECT name
Если несколько (разделяем запятой): SELECT name, pass, gang
Если все столбцы (ставим звездочку): SELECT *
Все, со столбцами определились, далее пишем слово FROM - это слово указывает из какой таблицы требуется выбрать столбцы. Добавляем имя таблицы, например players
Делее следует слово WHERE с помощью него задаются особые условия выборки:
Например требуется получить имена и IP-адреса игроков уровень которых больше 30:
SELECT name, ip FROM players WHERE lvl > 30
Рисунок 2 - логика выборки SELECT
SELECT pass FROM players WHERE name = 'OFFREAL'
Рисунок 3 - логика выборки SELECT
Схема запроса:
SELECT имя_столбца_А, имя_столбца_Б, ... FROM имя_таблицы WHERE условия LIMIT N
Примечание: Слово LIMIT указывает сколько строк данных будет в результате, N - количество строк
Пример: требуется сохранить уровень игрока OFFREAL равный 25
UPDATE players SET lvl = 25 WHERE name = 'OFFREAL'
Требуется сохранить новый E-mail игрока Crysis - crysis@mail.ru
UPDATE players SET email = 'crysis@mail.ru' WHERE name = 'Crysis'
Примечание: Результат запроса UPDATE - простое число, равное 0 если запись в базу не произошла, 1 если все прошло успешно.
Схема запроса:
UPDATE имя_таблицы SET имя_столбца_А = новые_данные_в_столбец_А, имя_столбца_Б = новые_данные_в_столбец_Б, ...WHERE условия
INSERT INTO players ( name, ip, lvl ) VALUES ( 'MySAN', '92.38.226.4', 35 )
Мы внесли в таблицу players информацию о игроке MySAN, IP-адрес которого 92.38.226.4, уровень которого 35
Схема запроса:
INSERT INTO имя_таблицы ( имя_столбца_А, имя_столбца_Б, ... ) VALUES ( значение_в_столбец_А, значение_в_столбец_Б, ... )
Примечания:
- При создании нового аккаунта, я рекомендую в INSERT INTO заполнять все столбцы, так как при попытке выбора (SELECT) целочисленных (INT, BIGINT ...)данных из пустых ячеек SAMP-сервер падает!
- Будьте аккуратнее при оформлении запросов с указанием текстовых (VARCHAR) переменных, если забыть поставить ' это приведет к образованию пустых ячеек во всей строке!
CREATE TABLE, далее имя для новой таблицы, пусть будет vehicles, далее ставим скобки ( ), внутри которых через запятую перечисляем по порядку имена бушующих столбцов и тип данных в них (см. выше):
CREATE TABLE vehicles ( model int, x_coord varchar, y_coord varchar, z_coord varchar, a_coord varchar )
Схема запроса:
CREATE TABLE имя_новой_таблицы ( имя_столбца_0 тип_данных_в_столбце_0, имя_столбца_1 тип_данных_в_столбце_1, ... )
Примечания:
- не важно строчными или заглавными буквами указывать тип переменных
- имя таблицы или столбца не должно начинаться с цифр
4. Функции a_sampdb.inc
Давайте ознакомимся с функциями для управления базой данных:
имя. В случае успешного подключения эта функция вернет нам значение особой переменной типа DB
PHP:
#define DBNAME "MyDATA.db" // определяем неизменное имя файла ...
// ... базы данных, если назвать его так, то он будет находиться в папке scriptfiles ...
// ... Можно было написать и так: new DBNAME = "MyDATA.db";
new DB:ServerDB; // объявляем особую переменную типа Data Base
PHP:
OnGameModInit()
{
ServerDB = db_open(DBNAME); // подключаемся к базе данных, ...
// ... особая переменная ServerDB теперь определена, подключение выполнено!
// продолжение паблика OnGameModInit
return 1;
}
PHP:
OnGameModExit()
{
db_close(ServerDB);
// продолжение паблика OnGameModExit
return 1;
}
PHP:
new DBResult:TEST; // объявляем переменную типа DBResult ( Результат запроса )
TEST = db_query(ServerDB, "SELECT id, name, pass FROM players WHERE lvl = 40"); //
Рисунок 4 - зеленым отмечены ячейки выбранные из таблицы, это и есть результат
Рисунок 5 - результат запроса
PHP:
db_free_result(TEST); // в TEST теперь нет ни строк ни столбцов =(
PHP:
new DBResult:TEST; // объявляем переменную типа DBResult ( Результат запроса )
TEST = db_query(ServerDB, "SELECT id, name, pass FROM players WHERE lvl = 40"); //
// В результате содержится двумерный массив в котором 3 столбца и 4 строки (см. рисунок 5)
new Nrows = db_num_rows(TEST); // Nrows будет равно 4
printf("Я нашел %d строк в результате запроса!", Nrows); // выводим сообщение в ...
//консоль сервера. Там будет следующее: "Я нашел 4 строк в результате запроса!"
PHP:
new DBResult:TEST; // объявляем переменную типа DBResult ( Результат запроса )
TEST = db_query(ServerDB, "SELECT id, name, pass FROM players WHERE lvl = 40"); //
// В результате содержится двумерный массив в котором 3 столбца и 4 строки (см. рисунок 5)
new Nfield = db_num_fields(TEST); // Nfield будет равно 3
printf("Я нашел %d столбцов в результате запроса!", Nfield); // выводим сообщение в ...
//консоль сервера. Там будет следующее: "Я нашел 3 столбцов в результате запроса!"
Например указав столбец номер 1 мы получим значение ячейки 'OFFREAL', а если потом один раз воспользуемся db_next_row, то получим '[EPG]_KOT'
Примечания: Чаще всего в запросах SELECT (см. выше) используют LIMIT 1 и получают результаты в которых только одна строка, но много столбцов, и использовать db_next_row не приходится.
PHP:
new f_name[32]; // объявляем переменную для имени столбца
new DBResult:TEST; // объявляем переменную типа DBResult ( Результат запроса )
TEST = db_query(ServerDB, "SELECT id, name, pass FROM players WHERE lvl = 40");
db_field_name(TEST, 2, f_name, 32); // хотим узнать имя 2 столбца результата запроса
printf("Имя второго столбца: %s",f_name); // выводим сообщение в консоль сервера
// там будет: "Имя второго столбца: pass"
и
В db_get_field указывается номер столбца (параметр field),
а в db_get_field_assoc указывается имя столбца (параметр field[])
Пример: требуется получить значение ячейки (строка 0, столбец 1) результата запроса
PHP:
new DBResult:TEST; // объявляем переменную типа DBResult ( Результат запроса )
TEST = db_query(ServerDB, "SELECT id, name, pass FROM players WHERE lvl = 40"); // рисунок 5
// результат сейчас переключен на 0 строку
new var[128]; // объявляем переменную, которая будет хранить значения ячеек результата
db_get_field(TEST, 1, var, 128); // получаем значение ячейки результата (столбец 1, строка 0)
printf("Значение ячейки 1: %s", var); // выводим в консоль сервера
// там будет: "Значение ячейки 1: OFFREAL"
db_get_field(TEST, 0, var, 128); // получаем значение ячейки результата (столбец 0, строка 0)
printf("Значение ячейки 0: %s", var); // выводим в консоль сервера
// там будет: "Значение ячейки 0: 1"
- - - - - -
Спасибо всем кто прочитал до конца xD
Надеюсь, ваше понимание SQLite стало более ясным.
Автор урока: OFFREAL
