Доступ к архиву

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

SQLite database ( a_sampdb.inc )

Статус
В этой теме нельзя размещать новые ответы.

[DJ]Smagold

Ученик
Всем привет!
В этом уроке я расскажу о создании SQLite базы данных для своего сервера.

Если плохо грузятся картинки:


1. Вообще что такое SQLite ??​
SQLite - легкая (не требующая больших ресурсов) встраиваемая система управления базами данных. Работа системы построена по принципу клиент-сервер. SQLite хранит всю базу данных в единственном стандартном файле (.db) на том компьютере, на котором исполняется программа.
Все данные в базе представлены в виде таблиц, элементами которых являются:
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 символов)
Этих типов достаточно для создания системы аккаунтов.

2. Как управлять своей базой данных ??​
Напомню, еще раз, что система управления базами данных SQLite УЖЕ встроена в SAMP-сервер и никаких плагинов для ее работы подключать НЕ надо!
Вот как реализуется система клиент-сервер:
При запуске SAMP-сервера из вашего игрового мода происходит обращение к SQLite базе данных, ваш мод выступает в роли клиента, а SAMP-сервер это и есть SQLite-сервер. Обращения мода представляют собой текстовые запросы на специальном языке который понятен SQLite-серверу. В ответ на запрос приходит результат, который можно представить в виде переменной DBResult
PHP:
new DBResult:TEST; // объявляем переменную типа "Результат запроса"
Эта переменная представляет собой двумерный массив (небольшую таблицу) который получился отбрасыванием ненужной информации от главной (большой) таблицы.

3. Язык SQL запросов​
Этот язык на самом деле очень простой, и только на первый взгляд кажется ужасным майндфаком :)
Чтобы понять с чего начинать писать запрос надо понять чего мы хотим получить, итак:
(смотрите картинку выше)

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, ... )
Примечания:
- не важно строчными или заглавными буквами указывать тип переменных
- имя таблицы или столбца не должно начинаться с цифр
4. Функции a_sampdb.inc​
Давайте ознакомимся с функциями для управления базой данных:

db_open(name[]);​
- функция используется для подключения к базе данных. В качестве name указывается путь к файлу .db и его

имя. В случае успешного подключения эта функция вернет нам значение особой переменной типа DB
PHP:
#define DBNAME "MyDATA.db" // определяем неизменное имя файла ...
// ... базы данных, если назвать его так, то он будет находиться в папке scriptfiles ...
// ... Можно было написать и так: new DBNAME = "MyDATA.db";
new DB:ServerDB; // объявляем особую переменную типа Data Base
Далее пишем в OnGameModInit
PHP:
OnGameModInit()
{
ServerDB = db_open(DBNAME); // подключаемся к базе данных, ...
// ... особая переменная ServerDB теперь определена, подключение выполнено!

// продолжение паблика OnGameModInit
return 1;
}
db_close(DB:db);​
- функция используется для отключения от базы данных
PHP:
OnGameModExit()
{
db_close(ServerDB);
// продолжение паблика OnGameModExit
return 1;
}
Примечания: Я рекомендую не отключаться от базы данных на протяжении всей работы мода!

db_query(DB:db,query[]);​
- функция используется для отправки запросов (см. пункт 3) SQLite-серверу, и возвращает результат в виде особой переменной DBResult. Все следующие функции которые мы рассмотрим будут работать именно с DBResult.
PHP:
new DBResult:TEST; // объявляем переменную типа DBResult ( Результат запроса )
TEST = db_query(ServerDB, "SELECT id, name, pass FROM players WHERE lvl = 40"); //
В результате содержится двумерный массив в котором 3 столбца и 4 строки (см. рисунок ниже)

Рисунок 4 - зеленым отмечены ячейки выбранные из таблицы, это и есть результат​
А вот как выглядит сам результат запроса:

Рисунок 5 - результат запроса

db_free_result(DBResult:dbresult);​
- функция очищает результат запроса
PHP:
db_free_result(TEST); // в TEST теперь нет ни строк ни столбцов =(
db_num_rows(DBResult:dbresult);​
- функция проверяет результат запроса и возвращает количество строк в нем
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 строк в результате запроса!"
db_num_fields(DBResult:dbresult);​
- функция проверяет результат запроса и возвращает количество столбцов в нем
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 столбцов в результате запроса!"
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);​
- функция возвращает имя столбца результата запроса по номеру этого столбца
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(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) результата запроса
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"
Примечания: Эти две функции получают содержимое ячеек только в текстовом формате, и для преобразования некоторых значений в числа надо использовать strval или floatstr

- - - - - -

Спасибо всем кто прочитал до конца xD
Надеюсь, ваше понимание SQLite стало более ясным.

Автор урока: OFFREAL
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу