Страница 1 из 17 12311 ... ПоследняяПоследняя
Показано с 1 по 10 из 162

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

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

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

    SQLite database ( a_sampdb.inc ) 2




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

    Для начала, рекомендую прочитать мой предыдущий урок:
    [ Читать! ]


    5. Создание и редактирование базы данных
    Новую базу данных можно создать либо используя функции a_sampdb.inc, либо с помощью редактора баз данных.
    Сначала я расскажу как создать базу данных в редакторе:

    5.1 Создаем в редакторе!
    Работать будем с программой SQLite Database Browser, она бесплатная и доступна для скачивания на сайте разработчика.
    [ Страница программы ][ Прямая ссылка на скачивание ]
    1. Извлекаем файлы из ZIP-архива, и запускаем программу.

    Рисунок 6 - Окно программы SQLite Database Browser

    2. Жмем [ File ] > [ New Database ]
    3. Появляется окно Save As, надо выбрать папку и имя для файла базы данных:
    - выбираем папку: scriptfiles (в папке с вашим samp-сервером)
    - вводим имя файла: MyDATA.db
    - жмем [ Сохранить ]
    4. Появляется окно Create Table, программа предлагает создать первую таблицу в новой базе данных

    Рисунок 7 - Процесс создания таблиц и столбцов
    1 Create Table
    - Table name: Вводим имя новой таблицы, пусть будет players
    - Жмем [ Add ], для добавления новых столбцов в таблицу.
    2 Add database field
    - Field name: Вводим имя для первого столбца таблицы, пусть будет name (для сохранения никнейма игрока)
    - Жмем [ ... ], для выбора типа данных в столбце
    3 Enter field type
    - Указываем тип данных VARCHAR (текстовый тип данных)
    - Жмем [ OK ]
    2 Add database field
    - Жмем [ Create ]

    Аналогично добавляем в таблицу еще 2 столбца, пусть это будут столбцы level и money. Не забываем, что тип данных для level и money следует выбрать INT (целые числа)

    После добавления столбцов, жмем кнопку [ Create ] в окне Create Table

    5. Сохраняем базу данных [ File ] > [ Save Database ]

    Если вы все сделали правильно, то должны увидеть это:

    Рисунок 8 - База данных с пустой таблицей

    Примечания:
    - Для добавления новой строки жмем кнопку [ New Record ]
    - Во вкладке [ Database Structure ] можно просмотреть структуру базы данных и таблиц, а во вкладке [ Execute SQL ] можно написать и отправить SQL-запрос к базе данных и просмотреть полученный результат

    Итак, с помощью программы SQLite Database Browser мы создали базу данных MyDATA.db, добавили в нее новую таблицу players и сохранили на жесткий диск. А теперь научимся создавать новую базу данных с помощью функций a_sampdb.inc

    5.2 Создаем с помощью a_sampdb.inc!

    Вообще, этот способ создания новой базы данных был обнаружен мною случайно
    Оказывается, если попытаться подключиться к базе данных которой не существует, то встроенный SQLite-сервер сам ее создаст...

    1. Вводим глобальные переменные:
    PHP код:
    new DB:ServerDB// объявляем особую переменную типа Data Base 
    #define DBNAME "MyDATA.db" // определяем имя файла базы данных 
    2. Добавляем в OnGameModInit проверку:
    - Если файл базы данных есть, то просто подключаемся к базе
    - Если файла базы данных нет, то создаем его и добавляем в него таблицу (см. пункт 3.4)
    PHP код:
    public OnGameModeInit()
    {
        if(
    fexist(DBNAME)) // файл базы данных на месте
        
    {
            
    ServerDB db_open(DBNAME); // просто открываем
        
    }
        else 
    // нет файла базы данных!
        
    {
            
    ServerDB db_open(DBNAME); // создаем файл базы данных ...
            
    db_query(ServerDB"CREATE TABLE players (name varchar, level int, money int)");
            
    // ... и создаем такую-же таблицу как создали с помощью SQLite Database Browser
        
    }
    // продолжение паблика OnGameModeInit
    return 1;

    Вот и вся магия база данных MyDATA.db с пустой таблицей players создана в папке scriptfiles

    5.3 Про доступ к файлу базы данных

    В прошлом уроке мне задали вопрос - "Что будет если редактировать базу данных через стороннюю программу при работающем samp-сервере?"
    Я несколько раз проверял, и не обнаружил никаких проблем в работе сервера.
    Обычно, если редактировать и сохранять один файл одновременно в двух программах, то конечный файл будет таким каким был при последнем сохранении в одной из программ. В случае с базой данных 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

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

    Звание: - весьма и весьма положительная личность
    6. Создание простой системы аккаунтов

    Теперь мы знаем все необходимое для создания системы аккаунтов, приступим к делу:
    Пусть у нас есть таблица:
    CREATE TABLE players (name varchar, pass varchar, level int, money int)
    Она ОТЛИЧАЕТСЯ от той, которую мы рассмотрели в пункте 5 !!!

    Не забываем про глобальные переменные:
    PHP код:
    new DB:ServerDB;
    #define DBNAME "MyDATA.db" 
    И про подключение к базе в OnGameModInit:
    PHP код:
    public OnGameModeInit()
    {
        if(
    fexist(DBNAME)) // файл базы данных на месте
        
    {
            
    ServerDB db_open(DBNAME); // просто открываем
        
    }
        else 
    // нет файла базы данных!
        
    {
            
    ServerDB db_open(DBNAME); // создаем файл базы данных ...
            
    db_query(ServerDB"CREATE TABLE players (name varchar, pass varchar, level int, money int)");
        }
    // продолжение паблика OnGameModeInit
    return 1;

    6.1 Подключение игрока к серверу

    Для начала нам потребуется набор глобальных переменных, для хранения информации о игроке:
    PHP код:
    enum pl_info {
    P_reg,
    P_name[32],
    P_pass[32],
    P_level,
    P_money
    }

    new 
    PlayerInfo[MAX_PLAYERS][pl_info]; 
    Паблик OnPlayerConnect:
    PHP код:
    public OnPlayerConnect(playerid)
    {

    PlayerInfo[playerid][P_reg] = 0// еще не залогинился    
    new DBResult:RESCONN// результат запроса
    new query[128]; // переменая для строки запроса
    GetPlayerName(playeridPlayerInfo[playerid][P_name], 32); // получаем имя игрока
    format(query,sizeof(query),"SELECT * FROM players WHERE name = '%s' LIMIT 1"PlayerInfo[playerid][P_name]);
    // запросили данные игрока
    RESCONN db_query(ServerDB,query); // отправляем запрос

    if(!db_num_rows(RESCONN)) // если имени игрока нет в таблице
    {
    format(query,sizeof(query),"Привет, %s!\nСначала зарегистрируйся!\nВведи свой пароль ниже:",PlayerInfo[playerid][P_name]);
    ShowPlayerDialog(playerid511"REGISTER"query"Далее""Выход"); // отправили диалог с ИД 51
    }
    else 
    // а если есть
    {
    new var[
    32];
    db_get_field(RESCONN1PlayerInfo[playerid][P_pass], 32); // вытащили пароль игрока из таблицы
    db_get_field(RESCONN2, var, 32); PlayerInfo[playerid][P_level] = strval(var); // вытащили уровень
    db_get_field(RESCONN3, var, 32); PlayerInfo[playerid][P_money] = strval(var); // вытащили деньги
    format(query,sizeof(query),"Добро пожаловать, %s!\nВведите ваш пароль:",PlayerInfo[playerid][P_name]);
    ShowPlayerDialog(playerid501"LOGIN"query"Вход""Выход"); // отправили диалог с ИД 50
    }

    // продолжение паблика OnPlayerConnect
    return 1;

    Диалоги:
    PHP код:
    public OnDialogResponse(playeriddialogidresponselistiteminputtext[])
    {

    if(
    dialogid == 50// диалог LOGIN
    {
    if(!
    response// нажал кнопку "Выход"
    Kick(playerid); return 1; }
    else 
    // нажал кнопку "Вход"
    {
    if(!
    strlen(inputtext)) // не ввел пароль
    {
    ShowPlayerDialog(playerid501"LOGIN""Забыл ввести пароль!\nВводи сюда:""Вход""Выход");
    return 
    1;
    }

    if(!
    strcmp(inputtextPlayerInfo[playerid][P_pass], false)) // если верный пароль
    {
    SendClientMessage(playerid0xFFFFFFFF"Вы успешно вошли");
    SetPlayerScore(playeridPlayerInfo[playerid][P_level]); // поставили уровень
    GivePlayerMoney(playeridPlayerInfo[playerid][P_money]); // дали денег
    PlayerInfo[playerid][P_reg] = 1// вошел на сервер (залогинился)
    }
    else 
    // если неверный
    {
    SendClientMessage(playerid0xFFFFFFFF"Вы ввели неверный пароль и были кикнуты с сервера");
    Kick(playerid);
    }
    return 
    1;
    }
    }

    if(
    dialogid == 51// диалог REGISTER
    {
    if(!
    response// нажал кнопку "Выход"
    Kick(playerid); return 1; }
    else 
    // нажал кнопку "далее"
    {
    if(
    strlen(inputtext) < || strlen(inputtext) > 16// слишком короткий или слишком длинный пароль
    {
    ShowPlayerDialog(playerid511"REGISTER""Пароль должен быть не длиннее 16 и не короче 3 символов\nВведи свой пароль:""Далее""Выход");
    return 
    1;
    }
    // проверяем пароль на допустимые символы
    new allowed 1;
    for (new 
    i=0;i<strlen(inputtext);i++)
    {
    if (
    inputtext[i]==0) { allowed 1; break; } // null
    if ((inputtext[i]<48) && (inputtext[i]!=32)) { allowed 0; break;}
    if (
    inputtext[i]>57 && inputtext[i]<65) { allowed 0; break;}
    if (
    inputtext[i]>90 && inputtext[i]<97) { allowed 0; break;}
    if (
    inputtext[i]>122) { allowed 0; break;}
    }
    // конец проверки
    if(!allowed// есть недопустимые символы
    {
    ShowPlayerDialog(playerid511"REGISTER""Недопустимые символы в пароле, используйте a-z, A-Z, 0-9\nВведи свой пароль:""Далее""Выход");
    return 
    1;
    }
    new 
    query[128]; // переменая для строки запроса
    GetPlayerName(playeridPlayerInfo[playerid][P_name], 32); // получаем имя игрока
    format(query,sizeof(query),"INSERT INTO players ( name, pass, level, money ) VALUES ( '%s', '%s', 0, 0)"PlayerInfo[playerid][P_name], inputtext); // добавить новую запись в таблицу
    db_query(ServerDB,query); // отправили запрос
    PlayerInfo[playerid][P_reg] = 1// залогинился
    SendClientMessage(playerid0xFFFFFFFF"Аккаунт создан!");
    PlayerInfo[playerid][P_level] = 0;
    PlayerInfo[playerid][P_money] = 0;
    return 
    1;
    }
    }

    // продолжение паблика OnDialogResponse
    return 0;

    6.2 Выдача score, money и прочего...

    Так как в пункте 6.1 мы ввели глобальную переменную PlayerInfo, она должна соответствовать действительному значению score, money и прочего.
    Поэтому везде, кроме диалога LOGIN рекомендую использовать модифицированные функции:
    PHP код:
    stock XSetPlayerScore(playeridscore)
    {
    PlayerInfo[playerid][P_level] = score;
    SetPlayerScore(playeridscore);
    }

    stock XGivePlayerMoney(playeridmoney)
    {
    PlayerInfo[playerid][P_money] += money;
    GivePlayerMoney(playeridmoney)

    6.3 Игрок покидает сервер

    Когда игрок выходит с сервера, надо сохранять его прогресс.
    Паблик OnPlayerDisconnect:
    PHP код:
    public OnPlayerDisconnect(playerid)
    {

    if(
    PlayerInfo[playerid][P_reg] == 1// если был залогинен
    {
    new 
    query[128]; // переменая для строки запроса
    GetPlayerName(playeridPlayerInfo[playerid][P_name], 32); // получаем имя игрока
    format(query,sizeof(query),"UPDATE players SET level=%d, money=%d WHERE name='%s'"PlayerInfo[playerid][P_level], PlayerInfo[playerid][P_money], PlayerInfo[playerid][P_name]); // обновить данные в таблице
    db_query(ServerDB,query); // отправили запрос
    }

    // продолжение паблика OnPlayerDisconnect
    return 1;


    7. [ВАЖНО] Наиболее частые вопросы [FAQ]

    Как удалять строку в таблице?
    Для этого используется запрос вида:
    DELETE FROM имя_таблицы WHERE условие


    Что неправильно в этом запросе?
    PHP код:
    new query[32];
    format(query,sizeof(query),"CREATE TABLE mytable (column1 int, column2 int, column3 int)");
    db_query(ServerDBquery); 
    Дело в том, что для строки запроса используется слишком маленький текстовый массив (32), я советую для всех запросов использовать минимум 512

    Можно, ли с помощью SQLite сделать статистику игроков на сайт?
    Да, если сайт и сервер находятся на одном хосте - просто нужен будет плагин для php

    Как добавить новый столбец в уже созданную таблицу?
    Ссылка: >>>

    Почему не происходит обновление?
    PHP код:
    format(query,sizeof(query),"UPDATE players SET pass=%s, tut=%d, level=%d, exp=%d, adminlevel=%d WHERE name='%s'",
    PlayerInfo[playerid][pPass],
    PlayerInfo[playerid][pTut],
    PlayerInfo[playerid][pLevel],
    PlayerInfo[playerid][pExp],
    PlayerInfo[playerid][pAdminLevel],
    PlayerInfo[playerid][pName]);
    db_query(MyDBquery); 
    Потомучто возле %s при форматировании строки запроса ВСЕГДА надо ставить ':
    pass='%s'



    - - - - -
    Вот теперь точно все 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

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

    Звание: пока не определено
    хороший, подробный урок. Лови плюс
    Урок: [Перевод сервера на MySQL]
    ________________________________________________

  4. #4
    [GM] Skill Training Mode Аватар для Gameyer
    Регистрация
    13.04.2010
    Адрес
    Россия
    Возраст
    28
    Сообщений
    2,296
    Репутация: 236

    Звание: - весьма и весьма положительная личность
    а какой тип переменной задать, если я хочу чтобы в бд сохранятся пароль, а например пароль такой "123456abcd"
    Skill Training Mode v3.1 Download
    Download

    Skill Training Mode Offical Web Site
    www.samp-stm.ru

    Skill Training Mode Offical Forum
    www.samp-stm.do.am

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

    Звание: - весьма и весьма положительная личность
    Цитата Сообщение от Gameyer Посмотреть сообщение
    а какой тип переменной задать, если я хочу чтобы в бд сохранятся пароль, а например пароль такой "123456abcd"
    VARCHAR
    И советую не разрешать игрокам создавать пароли с символами { \ ] ' ... только 0-9, a-z, A-Z
    [Θ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

  6. #6
    Активный пользователь Аватар для danildanil317
    Регистрация
    18.08.2010
    Адрес
    Los Santos
    Возраст
    26
    Сообщений
    765
    Репутация: 8

    Звание: пока не определено
    хороший урок лови +

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

    Звание: - весьма и весьма положительная личность
    +* - в периуде цифорок xDD Ты так сокро весь мод опишишь как написать))) с нуля)


    Можно как то использовать эту БД для сайта php ?


  8. #8
    Активный пользователь Аватар для Ym[0]n
    Регистрация
    30.03.2010
    Адрес
    Komsomolsk
    Сообщений
    442
    Репутация: 50

    Звание: скоро придёт к известности
    Цитата Сообщение от offreal Посмотреть сообщение
    varchar
    и советую не разрешать игрокам создавать пароли с символами { \ ] ' ... только 0-9, a-z, a-z
    или text
    (ололо пыщьщпыщь риальнэ)

    ЗаходиГруппа Pawno.RU

    Сайт ⇒ Ссылки в подписи запрещены !

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

    Звание: - весьма и весьма положительная личность
    или text, или varchar(n) ... это кому что больше нравится)
    [Θ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

  10. #10
    >_< Аватар для sk47
    Регистрация
    14.07.2010
    Адрес
    Магнитогорск
    Возраст
    31
    Сообщений
    1,233
    Репутация: 124

    Звание: скоро придёт к известности
    Сделал Важной

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

Похожие темы

  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 )
    от OFFREAL в разделе Уроки MySQL
    Ответов: 79
    Последнее сообщение: 19.01.2013, 07:30

Ваши права

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