Страница 1 из 8 123 ... ПоследняяПоследняя
Показано с 1 по 10 из 80

Тема: SQLite database ( a_sampdb.inc )

  1. #1
    ?????? ??????? Аватар для OFFREAL
    Регистрация
    31.03.2010
    Адрес
    Калининград
    Возраст
    33
    Сообщений
    2,521
    Репутация: 249

    Звание: - весьма и весьма положительная личность

    SQLite database ( a_sampdb.inc )




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

    Если плохо грузятся картинки:
    [Рисунок 1][Рисунок 2][Рисунок 3][Рисунок 4][Рисунок 5]


    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 - [email protected]
    UPDATE players SET email = '[email protected]' 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, ... )
    Примечания:
    - не важно строчными или заглавными буквами указывать тип переменных
    - имя таблицы или столбца не должно начинаться с цифр

    3.5 DELETE FROM
    Этот запрос применяется для удаления строки из таблицы:
    DELETE FROM, далее имя таблицы из которой хотим удалить строку, пусть будет players, далее пишем WHERE, и условия.
    Схема запроса:
    DELETE FROM имя_таблицы WHERE условия
    Примечания:
    - строка НЕ очищается а полностью удаляется, как будто ее никогда не было!
    [Θpposing Force]

    Урок: [SQLite Database]
    Урок: [Оптимизация Циклов]
    Урок: [Битовые Операции]
    Полезные функции: [Useful Tools]
    #include [Pickup Portal System]
    Filterscript [Simple AFK System]
    Filterscript [Лазерное Наведение Ракет]
    Filterscript [TextDraw Arcanoid]
    Разное: [Func Tests]
    [Рейтинг Пользователей]

    Реклама в подписи запрещена!!!
    Я ВКонтакте: [vk.com/offreal]

    [SIGPIC][/SIGPIC]

    Код:
                  C---C  GTO  C---C
           \     /     \     /     \     /
            C---C   E   C---C   I   C---C
           /     \     /     \     /     \
       ---C   R   C---C   N   C---C   N   C---
           \     /     \     /     \     /
            C---C   U   C---C   O   C---C
           /     \     /     \     /     \
                  C---C  R11  C---C
                 /     \     /     \
                        C---C

  2. #2
    ?????? ??????? Аватар для OFFREAL
    Регистрация
    31.03.2010
    Адрес
    Калининград
    Возраст
    33
    Сообщений
    2,521
    Репутация: 249

    Звание: - весьма и весьма положительная личность
    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(TEST2f_name32); // хотим узнать имя 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(TEST1, var, 128); // получаем значение ячейки результата (столбец 1, строка 0)
    printf("Значение ячейки 1: %s", var); // выводим в консоль сервера
    // там будет: "Значение ячейки 1: OFFREAL"
    db_get_field(TEST0, var, 128); // получаем значение ячейки результата (столбец 0, строка 0)
    printf("Значение ячейки 0: %s", var); // выводим в консоль сервера
    // там будет: "Значение ячейки 0: 1" 
    Примечания: Эти две функции получают содержимое ячеек только в текстовом формате, и для преобразования некоторых значений в числа надо использовать strval или floatstr

    - - - - - -

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

    Задавайте свои вопросы по этой теме, я постараюсь на них ответить!

    [ Второй урок по SQLite ]
    [Θpposing Force]

    Урок: [SQLite Database]
    Урок: [Оптимизация Циклов]
    Урок: [Битовые Операции]
    Полезные функции: [Useful Tools]
    #include [Pickup Portal System]
    Filterscript [Simple AFK System]
    Filterscript [Лазерное Наведение Ракет]
    Filterscript [TextDraw Arcanoid]
    Разное: [Func Tests]
    [Рейтинг Пользователей]

    Реклама в подписи запрещена!!!
    Я ВКонтакте: [vk.com/offreal]

    [SIGPIC][/SIGPIC]

    Код:
                  C---C  GTO  C---C
           \     /     \     /     \     /
            C---C   E   C---C   I   C---C
           /     \     /     \     /     \
       ---C   R   C---C   N   C---C   N   C---
           \     /     \     /     \     /
            C---C   U   C---C   O   C---C
           /     \     /     \     /     \
                  C---C  R11  C---C
                 /     \     /     \
                        C---C

  3. #3
    3-2-*-?
    Регистрация
    30.03.2010
    Адрес
    Урал
    Сообщений
    1,573
    Репутация: 117

    Звание: скоро придёт к известности
    Отличный урок, молодец .

  4. #4
    ?????? ??????? Аватар для OFFREAL
    Регистрация
    31.03.2010
    Адрес
    Калининград
    Возраст
    33
    Сообщений
    2,521
    Репутация: 249

    Звание: - весьма и весьма положительная личность
    Картинки с радикала не очень хорошо грузятся (
    [Θpposing Force]

    Урок: [SQLite Database]
    Урок: [Оптимизация Циклов]
    Урок: [Битовые Операции]
    Полезные функции: [Useful Tools]
    #include [Pickup Portal System]
    Filterscript [Simple AFK System]
    Filterscript [Лазерное Наведение Ракет]
    Filterscript [TextDraw Arcanoid]
    Разное: [Func Tests]
    [Рейтинг Пользователей]

    Реклама в подписи запрещена!!!
    Я ВКонтакте: [vk.com/offreal]

    [SIGPIC][/SIGPIC]

    Код:
                  C---C  GTO  C---C
           \     /     \     /     \     /
            C---C   E   C---C   I   C---C
           /     \     /     \     /     \
       ---C   R   C---C   N   C---C   N   C---
           \     /     \     /     \     /
            C---C   U   C---C   O   C---C
           /     \     /     \     /     \
                  C---C  R11  C---C
                 /     \     /     \
                        C---C

  5. #5
    3-2-*-?
    Регистрация
    30.03.2010
    Адрес
    Урал
    Сообщений
    1,573
    Репутация: 117

    Звание: скоро придёт к известности
    Цитата Сообщение от OFFREAL Посмотреть сообщение
    Картинки с радикала не очень хорошо грузятся (
    У меня всё сразу про-грузилось .

  6. #6
    Активный пользователь
    Регистрация
    28.06.2010
    Адрес
    хммм
    Сообщений
    187
    Репутация: 11

    Звание: на пути к лучшему
    Хороший урок многим полезен!!!

  7. #7
    Активный пользователь Аватар для StUNt71
    Регистрация
    02.06.2010
    Адрес
    Y-ola
    Сообщений
    1,601
    Репутация: 66

    Звание: скоро придёт к известности
    Давно не видел отличного урока! Который научит чему-нибудь.

  8. #8
    ?????? ??????? Аватар для OFFREAL
    Регистрация
    31.03.2010
    Адрес
    Калининград
    Возраст
    33
    Сообщений
    2,521
    Репутация: 249

    Звание: - весьма и весьма положительная личность
    Хе-хе ))) вот теперь все быстро грузится ))) vk.com в качестве хостинга изображений xD
    [Θpposing Force]

    Урок: [SQLite Database]
    Урок: [Оптимизация Циклов]
    Урок: [Битовые Операции]
    Полезные функции: [Useful Tools]
    #include [Pickup Portal System]
    Filterscript [Simple AFK System]
    Filterscript [Лазерное Наведение Ракет]
    Filterscript [TextDraw Arcanoid]
    Разное: [Func Tests]
    [Рейтинг Пользователей]

    Реклама в подписи запрещена!!!
    Я ВКонтакте: [vk.com/offreal]

    [SIGPIC][/SIGPIC]

    Код:
                  C---C  GTO  C---C
           \     /     \     /     \     /
            C---C   E   C---C   I   C---C
           /     \     /     \     /     \
       ---C   R   C---C   N   C---C   N   C---
           \     /     \     /     \     /
            C---C   U   C---C   O   C---C
           /     \     /     \     /     \
                  C---C  R11  C---C
                 /     \     /     \
                        C---C

  9. #9
    Активный пользователь Аватар для vanincheg
    Регистрация
    04.06.2010
    Адрес
    Планета Земля
    Сообщений
    407
    Репутация: 8

    Звание: пока не определено
    хм... я так понял что сервер mysql ну нужен а только сама БД в корне сервера(САМП)?

  10. #10
    ?? ḇẙ Ḉṍṁṕaṅẙ Lik? ☺↔☻
    Регистрация
    23.10.2010
    Адрес
    Россия
    Сообщений
    2,476
    Репутация: 224

    Звание: - весьма и весьма положительная личность
    Чётко сделано=)) Респект))


Страница 1 из 8 123 ... ПоследняяПоследняя

Похожие темы

  1. sqlite
    от system. в разделе Вопросы по скриптингу
    Ответов: 1
    Последнее сообщение: 06.07.2014, 22:01
  2. SQLite
    от VirvolF в разделе Вопросы по скриптингу
    Ответов: 9
    Последнее сообщение: 01.05.2014, 17:53
  3. Баг SQLite
    от R1S1us в разделе Заказы
    Ответов: 2
    Последнее сообщение: 24.10.2013, 15:11
  4. [PR,Database] Услуги от pavelost
    от pavelost в разделе Услуги
    Ответов: 14
    Последнее сообщение: 12.07.2013, 12:03
  5. [MySQL] SQLite database ( a_sampdb.inc ) 2
    от OFFREAL в разделе Уроки MySQL
    Ответов: 161
    Последнее сообщение: 09.10.2012, 01:13

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •