[Tutorial] SQLite: Comeзando
#1


Aprendendo conceitos bбsicos de SQLite.


  • Нndice:
    Veja oque serб abordado neste tуpico.
    1. Introduзгo ao SQLite
      • Oque й, e sua Histуria
      • Como conectar com o banco de dados.
      • Criando meu banco de dados!
    2. Conhecendo as funзхes do SQLite
    3. Atualizando, selecionando, inserindo e deletando dados da tabela.
    4. Perguntas & Respostas
    5. Sistema de login & registro em SQL
    6. Conclusхes finais


  • Intruduзгo ao SQLite
    • Oque й, e sua Histуria
      SQLite й uma biblioteca em linguagem C que implementa um banco de dados SQL embutido. Programas que usam a biblioteca SQLite podem ter acesso a banco de dados SQL sem executar um processo SGBD separado. SQLite nгo й uma biblioteca cliente usada para conectar com um grande servidor de banco de dados, mas sim o prуprio servidor. A biblioteca SQLite lк e escreve diretamente para e do arquivo do banco de dados no disco. O uso do SQLite й recomendado onde a simplicidade da administraзгo, implementaзгo e manutenзгo sгo mais importantes que incontбveis recursos que SGBDs mais voltados para aplicaзхes complexas possivelmente implementam. As situaзхes onde a simplicidade й a melhor escolha sгo muito mais freqьentes do que pode-se imaginar. E vocк sabia que SQLite, faz quase, ou atй o mesmo papel que o MySQL? Isto porque o SQLite foi criado, assim como o MySQL com uma linguagem chamada de Structured Query Language, ou Linguagem de Consulta Estruturada(SQL), que й a linguagem de pesquisa declarativa padrгo para banco de dados relacional (base de dados relacional), daн vem o nome SQLite, ou MySQL como tantos conhecem . SQL foi desenvolvido originalmente no inнcio dos anos 70 nos laboratуrios da IBM em San Jose, dentro do projeto System R, que tinha por objetivo demonstrar a viabilidade da implementaзгo do modelo relacional proposto por E. F. Codd. O nome original da linguagem era SEQUEL, acrфnimo para "Structured English Query Language", vindo daн o facto de, atй hoje, a sigla, em inglкs, ser comumente pronunciada "sнquel" ao invйs de "йs-kiъ-йl", letra a letra. No entanto, em portuguкs, a pronъncia mais corrente й a letra a letra: "йsse-quк-йle". Entгo gente, vamos comeзar a falar certo o correto й 'йsse-quк-йle'.
    • Como conectar com o banco de dados.
      No sa-mp para ter acesso as funзхes do SQLite nativo, basta adicionar a include padrгo do sa-mp(a_samp), pois a mesma jб carrega com sigo mesmo a a_sampdb, que й responsбvel pelas funзхes do SQLite.
      Entгo:

      PHP код:
      #include <a_samp> 
      Porйm, alйm de incluir a a_samp precisamos tambйm fazer a 'conexгo' com o banco de dados.

      PHP код:
      #include <a_samp>
      main(){}
      new 
      DB:Connect;
      public 
      OnGameModeInit()
      {
          
      Connect db_open("mydb.db");  
          return 
      1;

      Com isto jб podemos comeзar usar o SQLite da forma mais bбsica possнvel.
    • Criando meu banco de dados!
      Para criarmos nosso banco de dados eu optei por usar um programa muito bom, e que muitos usam o SQLite Browser que й um programa muito bom para manipulaзгo, e que eu uso e recomendo. Com ele vocк poderб deletar, inserir e atualizar.. Vamos lб entгo, acompanhe o vнdeo abaixo!
      [ame="http://www.youtube.com/watch?v=q-X4jLNH3i8"]Tutorial..[/ame]

      Caso queira aprender a criar seu banco de dados, manualmente sem ajuda de programas veja meu outro tutorial que й relacionado a exatamente isso, veja.
  • Conhecendo as funзхes do SQLite:
    Para vocк poder usar o SQLite em seu servidor, certamente terгo funcхes na qual vocк irб utilizar para abrir, fechar uma db e atй mesmo inserir, atualizar, selecionar dados de uma tabela. Hoje, conheceremos algumas delas!
    • db_open: Como jб vimos acima, й usada para abrir uma conexгo com um banco de dados SQLite. O modo de uso, й muito simples e nуs jб vimos, porйm vamos tambйm aprender a aprimorar a nossa conexгo, veja como:
      PHP код:
      #include <a_samp>
      main(){}
      new 
      DB:Connect;
      public 
      OnGameModeInit()
      {
          if((
      Connect db_open("mydb.db")) == DB:0)
          {
              return 
      SendRconCommand("exit");
          }
          return 
      1;

      a funзгo acima, verificarб se a conexгo foi efetuada com sucesso, e se isso for igual a falso, ou seja.. se a conexгo falhar ao conectar o servidor serб desligado.
    • db_close: Se temos uma funзгo para abrir uma conexгo, certamente teremos outra para fechar essa mesma conexгo. A db_close, ficarб responsбvel em fechar um banco de dados SQLite que foi aberto com db_open, como nуs fizemos acima...entгo usando a mesma handle de conexгo(Connect) fecharemos essa conexгo..
      PHP код:
      public OnGameModeExit()
      {
          
      db_close(Connect);
          return 
      1;

      lembrando, que nгo podemos fechar algo que nгo foi aberto, ou ao menos nem criado.
    • db_query: Essa, serб sem dъvidas a funзгo mais usada por vocк. Pois serб com ela que vocк terб todas as possibilidades de inserir, atualizar, deletar e tudo oque o SQLite oferece. Vamos ver um exemplo simples dessa funзгo:
      PHP код:
      new DB:db_handle;
      // ...
      public OnGameModeInit()
      {
          
      // Cria uma conexгo com o banco de dados.
          
      if((db_handle db_open("example.db")) == DB:0)
          {
              
      // Printa um erro no console caso o banco de dados nгo seja encontrado.
              
      print("Nao foi possivel encontrar \"example.db\".");
              
      SendRconCommand("exit");
          }
          else
          {
              
      // Se o banco foi encontrado, gera uma mensagem de sucesso.
              
      print("Conecao com \"example.db\" efetuada!");
          }
          
      // ...
          
      return 1;
      }
       
      public 
      OnGameModeExit()
      {
          
      // Fecha a conexгo com o banco de dados...
          
      db_close(db_handle);
          
      // ...
          
      return 1;
      }
        
      public 
      OnPlayerSpawn(playerid

          
      // Declara query e p_name.
          
      static query[98], p_name[MAX_PLAYER_NAME+1]; 
        
          
      // Guarda o nome do jogador na vбriavel p_nome.
          
      GetPlayerName(playeridp_namesizeof p_name); 
        
          
      // Formata a "query" 
          
      format(querysizeof query"INSERT INTO `spawn_log` (`PlayerID`,`PlayerName`) VALUES (%d,'%s')"playeridp_name); 
        
          
      // Libera o resultado e insere um log na tabela 'spawn_log'..
          
      db_free_result(db_query(db_handlequery)); 
          
      // ... 
          
      return 1

      Vamos a outro exemplo.
      PHP код:
      //Selecionando.
      db_query(db_handle"SELECT * FROM `contas` WHERE `nome`='HaRdiiZin'");
      // Selecionar tudo da tabela contas onde o nome for HaRdiiZin.
      //Atualizar.
      db_query(db_handle"UPDATE `contas` SET `nome`='HaRdiiZola' WHERE `nome`='HaRdiiZin'");
      // Atualizar a tabela colunas e alterar o nome para HaRdiiZola onde o nome for HaRdiiZin. 
    • db_free_result: Essa funзгo, libera um resultado da memуria alocada a partir db_query. O modo de uso й suuuuper fбcil, veja vocк mesmo: Vamos supor que estamos criando um sistema de login & registro para nosso servidor, e precisamos checar se o player jб й registrado ou nгo.. fariamos da seguinte forma:
      PHP код:
      //... 
      public OnPlayerConnect(playerid)
      {
          
      // Declara nome e query.
          
      new nome[MAX_PLAYERS], query[128], DBResult:Resultado;
          
          
      // Guarda o nome do player na vбriavel nome.
          
      GetPlayerName(playeridnomesizeof nome);
          
      // Formata a query.
          
      format(querysizeof query"SELECT * FROM `contas` WHERE `nome`='%q'"nome);
          
      // Seleciona tudo da tabela contas que conter o nome do player.
          
      Resultado db_query(db_handle,query);
          
      // Retorna o nъmero de linhas da query, nesse caso se nгo houver nenhuma linha signfica que o player nгo tem uma conta no servidor. 
          
      if(db_num_rows(Resultado) == 0
          {
              
      // Nгo tem uma conta.
          
      }
          else 
          {
              
      // Tem uma conta.
          
      }
          
      db_free_result(Resultado);
          return 
      1;

      Explicaзгo: Para este caso, a gente precisou guardar o resultado da query para saber se o player era registrado e depois liberamos esse resultado usando db_free_result. Tambйm, utilizamos a db_num_rows, que a gente vai falar jб,jб para que serve..
    • db_num_rows: Essa funзгo й responsбvel por retornar o nъmero de linhas de uma query, e deve ser usada em conjunto com a db_free_result. Veja como usa-la:
      PHP код:
      //... 
      public OnPlayerConnect(playerid)
      {
          
      // Declara nome e query.
          
      new nome[MAX_PLAYERS], query[128], DBResult:Resultado;
          
          
      // Guarda o nome do player na vбriavel nome.
          
      GetPlayerName(playeridnomesizeof nome);
          
      // Formata a query.
          
      format(querysizeof query"SELECT * FROM `contas` WHERE `nome`='%q'"nome);
          
      // Seleciona tudo da tabela contas que conter o nome do player.
          
      Resultado db_query(db_handle,query);
          
      // Retorna o nъmero de linhas da query, nesse caso se nгo houver nenhuma linha signfica que o player nгo tem uma conta no servidor. 
          
      if(db_num_rows(Resultado) == 0
          {
              
      // Nгo tem uma conta.
          
      }
          else 
          {
              
      // Tem uma conta.
          
      }
          
      db_free_result(Resultado); 
      Vamos entender melhor:
      • PHP код:
            // Formata a query.
            
        format(querysizeof query"SELECT * FROM `contas` WHERE `nome`='%q'"nome);
            
        // Seleciona tudo da tabela contas que conter o nome do player.
            
        Resultado db_query(db_handle,query); 
        Aqui criamos nossa query, oque vocк pode nгo ter percebido й que antes da funзгo db_query utilizamos a vбriavel Resultado, que foi declarada lб em cima, junto com a query.. Para cria-la, basta usar por exemplo: "new DBResult:Resultado;";

      • PHP код:
        if(db_num_rows(Resultado) == 0
        Aqui fazemos a verificar, perguntando se o nъmero de linhas retornadas da query й igual a zero. Se for, й porque o player nгo tem uma conta.

      • PHP код:
        db_free_result(Resultado); 
        Liberamos o resultado da memуria alocada.
    • db_get_field_assoc: Obtem o conteъdo do campo com o nome especificado, lembrando que hб uma funзгo bastante semelhante, a db_get_field porйm neste tutorial nгo comentбremos sobre ela.

      PHP код:
      public OnPlayerConnect(playerid)
      {
          
      // Declara nome e query.
          
      new nome[MAX_PLAYERS], query[128], DBResult:Resultado;
          
          
      // Guarda o nome do player na vбriavel nome.
          
      GetPlayerName(playeridnomesizeof nome);
          
      // Formata a query.
          
      format(querysizeof query"SELECT * FROM `contas` WHERE `nome`='%q'"nome);
          
      // Seleciona tudo da tabela contas que conter o nome do player.
          
      Resultado db_query(db_handle,query);
          
      // Retorna o nъmero de linhas da query, nesse caso se nгo houver nenhuma linha signfica que o player nгo tem uma conta no servidor. 
          
      if(db_num_rows(Resultado) == 0
          {
              
      // Nгo tem uma conta.
              
      ShowPlayerDialog(...
          }
          else 
          {
              
      // Tem uma conta.
              
      new field[10];
              
      db_get_field_assoc(Resultado"level"fieldsizeof(field));
              
      level strval(field);
          }
          
      db_free_result(Resultado); 

      Certo, agora vamos entender o cуdigo do exemplo:
      • PHP код:
        new field[10];
                
        db_get_field_assoc(Resultado"level"fieldsizeof(field)); 
        Aqui declaramos a vбriavel field com 10 celulas, e usamos nossa funзгo para pegar os dados da coluna level.

      • PHP код:
        level strval(field); 
        Nessa parte, na vбriavel level que foi usada somente de exemplo, inserimos nela o valor do field. Ai vocк deve estar perguntando, mais porque eu jб nгo fiz isso direto, assim poupando declarar a vбriavel field? Bom, isto porque se vocк tentar fazer desta maneira irб gerar um erro no seu cуdigo, por isso foi feito assim. Agora vamos a outro exemplo.

        PHP код:
                new field[10], Float:PosX[MAX_PLAYERS];
                
        db_get_field_assoc(Resultado"PosicaoX"fieldsizeof(field));
                
        PosX[playerid] = float(strval(field)); 
      E assim terminamos de analizar algumas das funзхes do SQLite. Lembrando que este tutorial foi feito exclusivamente para novatos, e por isso nгo foi abordado algumas funзхes do SQL, se vocк quiser conferir todas elas recomendo que veja a wiki-samp.
  • Atualizando, selecionando, inserindo e deletando dados da tabela.
    Vamos entгo para as instruзхes que vocкs usarгo e muito, muito mesmo. Vamos comeзar com a de inserзгo a INSERT, com ela vocк poderб inserir dados em sua tabela. Mas antes, vamos entender oque й tabela, coluna, e dados. Tabela, й como se fosse um armбrio, jб as colunas seriam suas gavetas, e os dados, obviamente seriam oque hб dentro destas gavetas.. pensando desta maneira, tenho certeza que vocк nunca irб se esquecer.. Entгo vamos lб. Para vocк usar qualquer uma das instruзхes que vou passar a baixo vocк deverб a funзгo db_query, que й uma nativa que vem com a a_sampdb que nуs jб vimos como instala-la. A linguagem SQL й dividida em subconjuntos de acordo com as operaзхes que queremos efetuar sobre um banco de dados, porйm sу veremos algumas.. Comeзaremos com a Linguagem de Manipulaзгo de Dados.
    • Linguagem de Manipulaзгo de Dados.
      DML(sigla em inglкs) й um subconjunto da linguagem SQL que й utilizado para realizar inclusхes, consultas, alteraзхes e exclusхes de dados presentes em registros, dentro dela temos as instruзхes INSERT, UPDATE e DELETE.
      • INSERT
        A insert, como proprio nome jб diz insere um dado em seu banco de dados, ela й uma das sintaxes mais simples que tem, veja.
        PHP код:
        db_query(db"INSERT INTO `minhatabela` (`coluna01`, `coluna02`) VALUES ('0', 'HaRdiiZin')"
        Vamos entender o cуdigo, como jб vimos estamos usando a tabela que criamos no vнdeo que eu deixei a cima, ensinando como criava um banco de dados. Nele, a gente definiu que a coluna03 seria do tipo AUTOINCREMENT, e por isso nгo precisaremos inseri-lo em nossa query, pois o sql jб faz isso sozinho e insere um novo id para a coluna. A coluna01, receberб entгo o valor de 0, e a coluna02, o valor HaRdiiZin. Lembre-se, que isso sу й possнvel pois na hora que criarmos nosso banco de dados definimos que nossa coluna seria do tipo TEXT, caso contrбrio nгo poderiamos inserir, por isso й muito importante prestar muita atenзгo na hora de criar uma db. A sintaxe do INSERT, й muito bбsica.. vamos observar:
        PHP код:
        INSERT INTO `tabela` (`colunas`) VALUES ('valores'
        Sendo assim, a onde temos `tabela`, seria o nome da tabela que vocк gostaria de inserir um dado, nesse por exemplo, caso vocк quisesse adicionar um dado na tabela jogadores, bastaria fazer do seguinte modo: INSERT INTO `jogadores`... continuando, teriamos que definir as colunas em que desejariamos adicionar o dado, vamos supor que vocк estб cadastrando um novo usuбrio, e gostaria de salvar o nick e a senha do mesmo. Entгo, ficaria do seguinte modo: INSERT INTO `jogadores` (`nick`, `senha`) e para complementar a sintaxe, temos a clausula VALUE que como o proprio nome jб diz, seria os valores que esse 'comando' iria inserir na tabela jogadores, nas colunas nick e senha. O modo й muito simples: INSERT INTO `jogadores` (`nick`, `senha`) VALUES ('HaRdiiZin', 'higor123'). Entгo o resultado final, seria:
        PHP код:
        INSERT INTO `jogadores` (`nick`, `senha`) VALUES ('HaRdiiZin''higor123'
        que retornaria para gente, uma inserзгo perfeita na tabela jogadores, inserindo nas colunas nick e senha, HaRdiiZin e higor123 respectivamente.

        -
        Lembrando, que isso й o modo bбsico de como usar a intruзгo INSERT, se vocк quiser se aprofundar no SQL recomendo que aguarde meu proximo tutorial(se tiver) ou que saia a procura de alguns pela internet nгo relacionados a SA-MP.
      • DELETE
        A instruзгo delete, como o proprio nome jб diz deleta algum valor de sua tabela, e o modo de uso й extremamente fбcil.
        PHP код:
        DELETE FROM `minhatabelaWHERE `coluna01` = 'HaRdiiZin' 
        e para usa-la, ela tambйm deve ser colocada dentro da db_query do seguinte modo.
        PHP код:
        public OnPlayerConnect(playerid)
        {
            
        db_query(db"DELETE * FROM `minhatabela` WHERE `coluna01` = 'HaRdiiZin'");
            return 
        1;

      • UPDATE
        A instruзгo update, й responsбvel por fazer a atualizaзгo dos dados de sua tabela, basicamente para usa-la vocк sу precisara informar a tabela que quer atualizar, os dados que serгo atualizados e opcionalmente onde ela teria efeito.

        PHP код:
        public OnPlayerConnect(playerid)
        {
            
        // Declara nome e query. 
            
        new nome[MAX_PLAYERS], query[128]; 
             
            
        // Guarda o nome do player na vбriavel nome. 
            
        GetPlayerName(playeridnomesizeof nome); 
            
        format(querysizeof query"UPDATE `contas` SET `ultlogin`='%d' WHERE `nome`='%q'"nomegettime());
            
        db_query(dbquery);
            return 
        1;

        Dessa maneira, fariamos que cada vez que o player logasse no servidor fosse atualizado a ъltima data de login dele. Simples nгo й?
    • Linguagem de Consulta de Dados
      Embora tenha apenas um comando, a DQL й a parte da SQL mais utilizada. O comando SELECT permite ao usuбrio especificar uma consulta ("query") como uma descriзгo do resultado desejado. Esse comando й composto de vбrias clбusulas e opзхes, possibilitando elaborar consultas das mais simples аs mais elaboradas.
      • SELECT
        O Select й o principal comando usado em SQL para realizar consultas a dados pertencentes a uma tabela, vamos ver um simples exemplo de como usa-lo no pawn.

        PHP код:
        public OnPlayerConnect(playerid)
        {
            
        db_query(db"SELECT * FROM `minhatabela` WHERE `coluna`='%s'");
            return 
        1;

        Mais para vocк entender melhor, vamos ver as clausulas que o SELECT tem consigo:
        PHP код:
                FROM – Utilizada para especificar a tabela que se vai selecionar os registros.
                
        WHERE – Utilizada para especificar as condiзхes que devem reunir os registros que serгo selecionados
        OBS: Sу veremos duas nesse tutorial, mais saнba que hб mais de duas!

        Entгo como vocк viu, e se vocк sabe um pouquinho de inglкs jб sabemos que a FROM й o local, e WHERE й a mesma coisa que perguntar a onde.
        E para complementar um pouquinho mais o seu conhecimento, vamos ver tambйm como usar Operadores Lуgicos no SQL.
        PHP код:
                AND – E lуgicoAvalia as condiзхes e devolve um valor verdadeiro caso ambos sejam corretos.
                OR  
        – OU lуgicoAvalia as condiзхes e devolve um valor verdadeiro se algum for correto.
                
        NOT – Negaзгo lуgicaDevolve o valor contrбrio da expressгo
        Entгo vamos ver um exemplo usando oque a gente viu atй aqui.
        PHP код:
                // Exemplo 01:
                
        db_query(db"SELECT * FROM `contas` WHERE `nome` = 'HaRdiiZin' AND `senha` = 'teste'");
                
        // Exemplo 02:
                
        db_query(db"SELECT * FROM `teste` WHERE `teste01` = '5' OR `teste02` = '6'"); 
        Mais uma coisa que precisamos entender, como vocк pode ter visto eu estou utilizando apуs o SELECT um asterisco (*) com este asterisco estamos indicando que iremos selecionar todas as colunas, porйm podemos tambйm selecionar apenas as colunas que quisermos da seguinte forma:
        PHP код:
                db_query(db"SELECT `id, senha` FROM `contas` WHERE `nome` = 'HaRdiiZin'"); 
  • Perguntas & Respostas
    • Pergunta: Qual й melhor MySQL ou SQLite? Qual a diferenзa de um ao outro?
      Resposta:
      Quote:
      Originally Posted by Day_
      Посмотреть сообщение
      SQLite й local, MySQL pode nгo ser, estб й a maior diferenзa que eu vi.

      Agora no SA-MP, MySQL й mais rбpido com o multi-threading, SQL
    • Pergunta: Й possнvel fazer as mesmas coisas em SQLite do que em MySQL?
      Resposta:
      Quote:
      Originally Posted by PT
      Посмотреть сообщение
      Sim atй incluнdo ligar a um website embora muitos falem sem saber. Sу que claro com mysql e mais fбcil ligar a um website.
  • Sistema de login & registro em SQL
    PHP код:
    /*
                                         ___       ____        _________ ______               ______      /
                                        /         /    \   /\      |     |     \   |      |  /        |  /
                                                  |    |   \/      |     |         |      | |         | / 
                                        \______   |    |           |     |_____/   |      | |         |/\
                                               \  |----|           |     |    \    |      | |         |  \ 
                                                  |    |   /\      |     |    |    |      | |         |   \
                                        _______/  |    |   \/      |     |    |    \______/  \______  |    |
                                                                San Andreas Truck - 2015® 
    */
      
    /*
     *
     * Autor do gamemode: HaRdiiZin
     *   Data de criaзгo: 26/10/15
     *   Nome do projeto: San Andreas Truck
     *         Descriзгo: Este projeto foi iniciado somente para relembrar as funзхes do sqlite,
     *                    e tambйm porque eu iria iniciar um projeto de trucking mais acabei desistindo
     *                    dele por falta de tempo, jб que eu tenho outro projeto em andamento..
     *
     */
    /*
     *
     * O que hб no gamemode?
     * Como eu desisti nos primeiros dias de desenvolvimento, praticamente nem fiz nada no gamemode. Ele й uma base, uma base na qual
     * novatos na linguagem possam aprender mais, e tambйm conhecer o quгo ъtil й o sqlite no sa-mp e como podemos utiliza-lo, atualmente o gamemode
     * sу tem o sistema de login e registro, ambos funcionando 100% e salvando, admin, skin, e ъltima posiзгo. Espero que gostem!
     *
     */
    //--------------------------------------------------------------
    /* Includes necessбrias para o bom funcionamento do servidor. */
    #include <a_samp>
    #include <foreach>
    #include <mSelection>
    /* Configuraзхes gerais do servidor. */
    #define serverNome          "hostname San Andreas Truck | HaRdiiZin®"
    #define serverPass          "password 0"
    #define serverLang          "language Portugues - Brasil"
    #define serverMod           "by HaRdiiZin® - v0.1 R1"
    #define serverMap           "mapname San Andreas"
    #define serverSite          "weburl www.forum.sa-mp.com"
    #define     Kick(%0) SetTimerEx("Kicka", 100, false, "i", %0)
    #define     Ban(%0)  SetTimerEx("Bana", 100, false, "i", %0)
    /* Enums e outras vбriaveis.. */
    enum 
    {
        
    Branco   0xFFFFFFFF,
        
    Verde    0x29BF33FF,
        
    Vermelho 0xFF0000FF
        
    Azul     0x1DA7B9FF,
        
    Rosa     0xB837C1FF,
        
    Roxo     0xB11BCFFF,
        
    Amarelo  0xFFF300FF,
        
    Laranja  0xFFC000FF
    };
    enum 
    {
        
    Login,
        
    Registro,
        
    SelectSkin
    };
    enum player_data
    {
        
    Admin,
        
    Skin,
        
    Float:px,
        
    Float:py,
        
    Float:pz,
        
    Float:pa
    };
    new 
    DB:Connect;
    new 
    pInfo[MAX_PLAYERS][player_data];
    /* Necessarias para o script */
    main() { print("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n> HaRdiiZin®"); }
    public 
    OnGameModeInit()
    {
        
    LoadServerConfig();
        
    /* Carrega o banco de dados */
        
    Connect db_open("sql.db"); // Abre o banco de dados..
        
    db_free_result(db_query(Connect"CREATE TABLE IF NOT EXISTS `contas` (`id`    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,`nome`  TEXT NOT NULL,`senha` TEXT NOT NULL,`admin` INTEGER NOT NULL,`skin`  INTEGER NOT NULL,`px`    INTEGER NOT NULL,`py`    INTEGER NOT NULL,`pz`    INTEGER NOT NULL,`pa`    INTEGER NOT NULL);"));
            
    // Cria as tabelas caso elas nгo existam..
        /* Inserir uma conta na tabela, caso a AutoRegister esteja habilitada. */
        #if defined AutoRegister
            
    db_query(Connect"INSERT INTO `contas` (`nome`, `senha`, `admin`, `skin`, `px`, `py`, `pz`, `pa`) VALUES ('HaRdiiZin', 'teste', '0', '4', '0.0', '0.0', '0.0', '0.0')");
                
    //Somente para testes..
        #endif
        
    return 1;
    }
    public 
    OnGameModeExit()
    {
        for(new 
    0MAX_PLAYERSi++) SavePlayer(i);
        return 
    1;
    }
    public 
    OnPlayerConnect(playerid)
    {
        
    SetTimerEx("OnPlayerConnected"100false"i"playerid);
        return 
    1;
    }
    forward OnPlayerConnected(playerid);
    public 
    OnPlayerConnected(playerid)
    {
        
    /* Seta a camera do player e outras funзхes .*/
        
    TogglePlayerSpectating(playeridtrue);
        
    InterpolateCameraPos(playerid1462.9407, -867.8122105.37061322.1545, -956.1140136.510510000CAMERA_MOVE);
        
    InterpolateCameraLookAt(playerid1462.3888, -866.9811104.95061322.5913, -955.2172136.145510000CAMERA_MOVE);
        
    /* Verifica se o player tem ou nгo uma conta, caso ele tenha ele serб jogado para dialog de login, se nгo ele irб para de registro. */
        
    new query[61], DBResult:Result;
        
    format(querysizeof(query), "SELECT * FROM `contas` WHERE `nome` = '%s'"DB_Escape(GetName(playerid)));
        
    Result db_query(Connectquery);
        if(
    db_num_rows(Result) == 0)
        {
            
    //Nгo tem uma conta..
            
    ShowPlayerDialog(playeridRegistroDIALOG_STYLE_PASSWORD"{FF0000}# {FFFFFF}San Andreas: Truck""{FFFFFF}Digite uma senha segura para que vocк se registre.""Registrar""");
        }
        else
        {
            
    //Tem uma conta..
            
    ShowPlayerDialog(playeridLoginDIALOG_STYLE_PASSWORD"{FF0000}# {FFFFFF}San Andreas: Truck""{FFFFFF}Digite a sua senha para logar-se""Logar""");
        }
        
    db_free_result(Result);
        return 
    1;
    }
    public 
    OnPlayerDisconnect(playeridreason)
    {
        
    SavePlayer(playerid);
        return 
    1;
    }
    public 
    OnDialogResponse(playeriddialogidresponselistiteminputtext[])
    {
        if(
    dialogid == Registro)
        {
            if(!
    responseKick(playerid);
            new 
    query[300];
            
    format(querysizeof(query), "INSERT INTO `contas` (`nome`, `senha`, `admin`, `skin`, `px`, `py`, `pz`, `pa`) VALUES ('%s', '%s', '0', '0', '0.0', '0.0', '0.0', '0.0')"DB_Escape(GetName(playerid)), DB_Escape(inputtext));
            
    db_free_result(db_query(Connectquery));    
            
    pInfo[playerid][Admin] = 0;
            
    pInfo[playerid][Skin] = 0;
            
    pInfo[playerid][px] = 0.0;
            
    pInfo[playerid][py] = 0.0;
            
    pInfo[playerid][pz] = 0.0;
            
    pInfo[playerid][pa] = 0.0;
            new 
    skins_array[] =
            {
                
    20,23,26,27,29,32,33,34,37,43,44,45,49,51,52,57,58,59,60,68,72,73,81,96,97,101
            
    };
            
    ShowModelSelectionMenuEx(playeridskins_array26"Selecione sua skin"SelectSkin0.00.00.0);  
            return 
    1
        }
        if(
    dialogid == Login)
        {
            if(!
    responseKick(playerid);
            new 
    query[118], DBResult:Result;
            
    format(querysizeof(query), "SELECT * FROM `contas` WHERE `nome` = '%s' AND `senha` = '%s'"DB_Escape(GetName(playerid)), DB_Escape(inputtext));
            
    Result db_query(Connectquery);     
            if(
    db_num_rows(Result) == 0)
            {
                
    SendClientMessage(playeridVermelho"* Vocк errou sua senha!");
                
    Kick(playerid);
                return 
    0;
            }
            else 
            {
                
    //Acertou a senha
                
    new Field[20];
                
    db_get_field_assoc(Result"admin"Fieldsizeof(Field));
                
    pInfo[playerid][Admin] = strval(Field);
                
    db_get_field_assoc(Result"skin"Fieldsizeof(Field));
                
    pInfo[playerid][Skin] = strval(Field);
                
    db_get_field_assoc(Result"px"Fieldsizeof(Field));
                
    pInfo[playerid][px] = float(strval(Field));
                
    db_get_field_assoc(Result"py"Fieldsizeof(Field));
                
    pInfo[playerid][py] = float(strval(Field));
                
    db_get_field_assoc(Result"pz"Fieldsizeof(Field));
                
    pInfo[playerid][pz] = float(strval(Field));
                
    db_get_field_assoc(Result"pa"Fieldsizeof(Field));
                
    pInfo[playerid][pa] = float(strval(Field));
                
    TogglePlayerSpectating(playeridfalse);
                
    LoadPlayer(playerid);
            }
            
    db_free_result(Result);        
            return 
    1;
        }
        return 
    1;
    }
    public 
    OnPlayerModelSelectionEx(playeridresponseextraidmodelid)
    {
        if(
    extraid == SelectSkin)
        {
            if(!
    response)
            {
                
    pInfo[playerid][Skin] = 4;
                
    TogglePlayerSpectating(playeridfalse);
                
    LoadPlayer(playerid);
            }
            else 
            {
                
    pInfo[playerid][Skin] = modelid;
                
    TogglePlayerSpectating(playeridfalse);
                
    LoadPlayer(playerid);
            }
            return 
    1;
        }
        return 
    1;
    }
    /* Funзхes necessбrias */
    LoadPlayer(playerid)
    {
        
    SpawnPlayer(playerid);
        
    SetPlayerPos(playeridpInfo[playerid][px], pInfo[playerid][py], pInfo[playerid][pz]);
        
    SetPlayerFacingAngle(playeridpInfo[playerid][pa]);
        
    SetPlayerSkin(playeridpInfo[playerid][Skin]);
        return 
    1;
    }
    SavePlayer(playerid)
    {
        new 
    query[300], DBResult:Result;
        
    GetPlayerPos(playeridpInfo[playerid][px], pInfo[playerid][py], pInfo[playerid][pz]);
        
    GetPlayerFacingAngle(playeridpInfo[playerid][pa]);
        
    format(querysizeof(query), "UPDATE `contas` SET `admin`='%d', `skin`='%d', `px`='%f', `py`='%f', `pz`='%f', `pa`='%f' WHERE `nome` = '%s'"
            
    pInfo[playerid][Admin],
            
    GetPlayerSkin(playerid),
            
    pInfo[playerid][px],
            
    pInfo[playerid][py],
            
    pInfo[playerid][pz],
            
    pInfo[playerid][pa],
            
    DB_Escape(GetName(playerid)));
        
    Result db_query(Connectquery);  
        
    db_free_result(Result);
        return 
    1;
    }
    LoadServerConfig()
    {
        new 
    input[40]; // Cria a variavel com 40 cйlulas necessбrias..
        /* Setando as configuraзхes de nome, etc */
        
    format(inputsizeof(input), serverNome); // Seta o hostname do servidor.
        
    SendRconCommand(input);
        
    format(inputsizeof(input), serverPass); // Seta a senha do servidor.
        
    SendRconCommand(input);
        
    format(inputsizeof(input), serverLang); // Seta a linguagem que o servidor terб.
        
    SendRconCommand(input);
        
    format(inputsizeof(input), serverMod); // Seta o mode do servidor.
        
    SetGameModeText(input);
        
    format(inputsizeof(input), serverMap); // Seta o nome do mapa do servidor..
        
    SendRconCommand(input);
        
    format(inputsizeof(input), serverSite); // Seta o nome do mapa do servidor..
        
    SendRconCommand(input);
        
    #undef serverNome
        #undef serverPass
        #undef serverLang
        #undef serverMod
        #undef serverMap
        #undef serverSite
        /* Seta as configuraзхes para como o GTA deverб se portar em relaзгo ao servidor. */
        
    ShowPlayerMarkers(PLAYER_MARKERS_MODE_OFF); 
        
    ShowNameTags(1); 
        
    AllowAdminTeleport(1);
        
    UsePlayerPedAnims();
        
    DisableInteriorEnterExits(); 
        
    EnableStuntBonusForAll(true);
        
    LimitGlobalChatRadius(15.0);  
        
    EnableTirePopping(1);
        
    //ManualVehicleEngineAndLights();
        
    return 1;
    }
    GetName(playerid)
    {
        new
        
    gName[MAX_PLAYER_NAME 1];
        
    GetPlayerName(playeridgNamesizeof(gName));
        return 
    gName;
    }
    forward Kicka(p); public Kicka(p)
    {
        
    #undef Kick
        
    Kick(p);
        
    #define Kick(%0) SetTimerEx("Kicka", 100, false, "i", %0)
        
    return 1;
    }
    forward Bana(p); public Bana(p)
    {
        
    #undef Ban
        
    Ban(p);
        
    #define Ban(%0) SetTimerEx("Bana", 100, false, "i", %0)
        
    return 1;
    }
    DB_Escape(text[])
    {
            new
            
    ret[80 2],
            
    ch,
            
    i,
            
    j;
            while ((
    ch text[i++]) && sizeof (ret))
            {
     
                    if (
    ch == '\'')
                    {
     
                            if (
    sizeof (ret) - 2)
                            {
     
                                    
    ret[j++] = '\'';
                                    
    ret[j++] = '\'';
                            }
                    }
                    else if (
    sizeof (ret))
                    {
     
                            
    ret[j++] = ch;
                    }
                    else
                    {
     
                            
    j++;
                    }
            }
            
    ret[sizeof (ret) - 1] = '\0';
            return 
    ret;
            
    // '''

    Tуpico original.
  • Conclusхes finais
    Espero que consiga entender o tutorial, eu criei com muito carinho para vocк! Bons estudos para vocк, se tiver qualquer erro por favor me reporte.

    Agradecimentos а:
    • Wikipйdia
    • Wiki-samp
    • EditPawn por dar sugestхes do que adicionar.
Reply
#2

eu tenho o a_sampdb e nem sabia XDxd
Reply
#3

curti seu tutorial HardZiin, se fizer outro, explicando como criar a DB, iniciando do 0 um servidor bem dizendo, eu tentaria aprender, espero que faзa.

Abraзos, espero respostas...
Reply
#4

GAMMIX fez uma include q facilita pra cara$#% o uso desse sistema SQL. Leiam:
https://github.com/Gammix/Easy-Datab...er-easydb.inc-
Reply
#5

Quote:
Originally Posted by F1N4L
Посмотреть сообщение
GAMMIX fez uma include q facilita pra cara$#% o uso desse sistema SQL. Leiam:
https://github.com/Gammix/Easy-Datab...er-easydb.inc-
Facilitar mais do que jб й? Mas sim, eu jб tinha visto essa include, mas nгo cheguei a usa-la;

Quote:
Originally Posted by matheusspohr
Посмотреть сообщение
curti seu tutorial HardZiin, se fizer outro, explicando como criar a DB, iniciando do 0 um servidor bem dizendo, eu tentaria aprender, espero que faзa.

Abraзos, espero respostas...
Certo, irei fazer sim.. Havia me esquecido desses pequenos detalhes, hehe..
Reply
#6

Bacana, serб ъtil na implementaзгo de novos servidores.

Quote:
Originally Posted by matheusspohr
Посмотреть сообщение
curti seu tutorial HardZiin, se fizer outro, explicando como criar a DB, iniciando do 0 um servidor bem dizendo, eu tentaria aprender, espero que faзa.

Abraзos, espero respostas...
Boa ideia, eu poderia criar.. Mas o Hard jб se comprometeu, entгo vamos deixar pra lб.
Reply
#7

[QUOTE=HaRdiiZin;3625003]Facilitar mais do que jб й? Mas sim, eu jб tinha visto essa include, mas nгo cheguei a usa-la;

A verdade й q sim, й fбcil, mas esta include te resume tudo. Nada mais que TODOS os codes do SQL simplificados e facilitados para todos, eu particularmente, prefiro com include.
Reply
#8

Belo tutorial, ajudarб muitos.
Reply
#9

O como comeзar esta errado diz que й no OnGameModeExit mas nгo й, й no OnGameModeInit.

No samp sempre usei SQLite e continuo a pensar que й mais que suficiente para qualquer projeto de samp...

Ainda mais com a ъltima atualizaзгo ficou ainda melhor.

Й sempre bom ver alguйm investir nisso na board PT,

Bom trabalho
Reply
#10

Quote:
Originally Posted by PT
Посмотреть сообщение
O como comeзar esta errado diz que й no OnGameModeExit mas nгo й, й no OnGameModeInit.

No samp sempre usei SQLite e continuo a pensar que й mais que suficiente para qualquer projeto de samp...

Ainda mais com a ъltima atualizaзгo ficou ainda melhor.

Й sempre bom ver alguйm investir nisso na board PT,

Bom trabalho
Nossa, que erro tosco meu kkk.
Vou corrigir.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)