Pokédex em PHP: Banco de Dados
Autor: 4luada | Publicado: 2014-04-10T23:58:00-03:00



Apesar de tudo que aprendi anteriormente, a forma de se criar um database do W3Schools não estava bem funcionando para mim. Portanto, fui atrás de um passo-a-passo: Home and Learn. Seguindo o tutorial, criei um database chamado pokemon_db.

Criando um Database

Seguindo o tutorial, abri o Administrador de PHP do WAMP: clique no ícone do WAMP na barra de ferramentas e selecione 'phpMyAdmin'. Abrirá uma janela (ou aba) do seu navegador padrão com uma página de login. O login e senha do administrador é "root", sem senha (é possível adicionar uma senha depois de logar, mas não farei isso - pelo menos por enquanto). O "root" tem acesso a tudo, e permissão a tudo. Vá para a aba "Databases/Bancos de Dados". Lá está a lista de todos os databases existentes do seu servidor, além de um pequeno formulário para se criar um database novo, logo no topo. No campo, coloque o nome do novo database (coloquei 'pokemon_db') e clique em 'Create/Criar'. Pronto, seu database está criado.

O query correspondente para se criar a database seria:


mySQL query

CREATE DATABASE IF NOT EXISTS `pokemon_db` DEFAULT CHARACTER SET ascii COLLATE ascii_bin;



Esse query foi o criado pelo phpMyAdmin, e ele determina também o conjunto de caracteres do database.

Criando as tabelas

Vou criar uma série de tabelas, ao invés de uma única, a fim de realmente explorar o máximo que der do mySQL e PHP. A primeira e principal tabela a ser criada: Pokemon6 (da geração 6). Logo depois de se criar um database, você poderá criar uma tabela (senão, na página do database criado, na aba "Structure"), há um pequeno formulário onde você coloca o nome da nova tabela a ser criada e o número de colunas (é possível acrescentar ou remover colunas depois) - recordando: as colunas são os campos das tabelas. Ao dar 'Go/Executar', uma página com um grande formulário será aberta, onde você colocará as características de cada coluna da nova tabela (nome da coluna, o tipo de dado na coluna, tamanho do dado - ou valores em caso de SET ou ENUM, valor padrão, conjunto de caracteres a ser usado, atributos extras dos valores, se pode aceitar valor nulo, formato de índice, se os valores devem ser automaticamente incrementados, e comentários). Para a tabela de Pokémons, criei os seguintes campos:


ID : SMALLINT NOT NULL PRIMARY AUTO_INCREMENT
Name : VARCHAR(20) NOT NULL
Types : SET('Bug','Dark','Dragon',...)
Weakness : SET('Bug','Dark','Dragon',...)
Resistance : SET('Bug','Dark','Dragon',...)
HP : TINYINT(3) UNSIGNED NOT NULL
Attack : TINYINT(3) UNSIGNED NOT NULL
Defense : TINYINT(3) UNSIGNED NOT NULL
Sp.Attack : TINYINT(3) UNSIGNED NOT NULL
Sp.Defense : TINYINT(3) UNSIGNED NOT NULL
Speed : TINYINT(3) UNSIGNED NOT NULL
Height : FLOAT NOT NULL
Weight : FLOAT NOT NULL
Abilities : VARCHAR(200)
Evolution : VARCHAR(20)
Pre-Evolution : VARCHAR(20)
Mega-Evolution : TINYINT(1)
Description : VARCHAR(350)
Image : VARCHAR(200) NOT NULL
Icon : VARCHAR(200) NOT NULL
Hatch : INT(11) UNSIGNED
Color : ENUM('Red','Blue',...) NOT NULL
Generation : TINYINT(3) UNSIGNED NOT NULL
Locations : set('Kanto','Sevii Islands','Johto','Hoenn','Sinnoh','Unova','Kalos')
Egg Group: SET('Amorphus','Bug',...)


Farei outras tabelas a fim de obter outros tipos de informações. A segunda tabela a ser criada é a chamada Abilities:


ID : SMALLINT PRIMARY NOT NULL AUTO_INCREMENT
Name : VARCHAR(20) NOT NULL
Effect : VARCHAR(500) NOT NULL
Generation: TINYINT(3) UNSIGNED NOT NULL


Em seguida criei a tabela de Moves:


ID : INT(10) PRIMARY NOT NULL AUTO_INCREMENT
Name : VARCHAR(20) NOT NULL
Type : ENUM('Bug','Dark','Dragon',...)
Category : ENUM('Status','Physical','Special') NOT NULL DEFAULT='Physical'
Power : TINYINT(3) UNSIGNED
Accuracy : TINYINT(3) UNSIGNED
PP : TINYINT(3) UNSIGNED NOT NULL
TM : SMALLINT(5) UNSIGNED
HM : TIMYINT(3) UNSIGNED


E a última tabela a ser criada foi Locations:


ID : INT(10) PRIMARY NOT NULL UNSIGNED AUTO_INCREMENT
Name : VARCHAR(20) NOT NULL,
Region :SET('Kanto','Sevii Islands','Johto','Hoenn','Sinnoh','Unova','Kalos') NOT NULL DEFAULT 'Kanto'
Route : INT(11)
Floors : TINYINT(3) UNSIGNED
Pokemon : VARCHAR(500)


De fato, eu poderia ter criado o database, as tabelas e até os registros por códigos de HTML. Verei no futuro se refaço todo o database por querys ao invés de usar o myPHPAdmin. O myPHPAdmin facilita muito a criação e manutenção dos databases, mas acho que é bom eu saber fazer manualmente também. Mas deixarei para um próximo post.

Só para constar, para se criar uma tabela em mySQL (no exemplo, a tabela abilities) seria com a seguinte query:


mySQL query

CREATE TABLE IF NOT EXISTS `abilities` (
&nbsp;&nbsp;`ID` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
&nbsp;&nbsp;`Name` varchar(20) COLLATE ascii_bin NOT NULL,
&nbsp;&nbsp;`Effect` varchar(500) COLLATE ascii_bin NOT NULL,
&nbsp;&nbsp;`Generation` tinyint(3) unsigned NOT NULL,
&nbsp;&nbsp;PRIMARY KEY (`ID`)
) ENGINE=InnoDB  DEFAULT CHARSET=ascii COLLATE=ascii_bin AUTO_INCREMENT=81 ;



Criando Registros

Para se criar registros me uma tabela, primeiro acesse a tabela na aba 'Estrutura' de um database. Vou adicionar umas habilidades na tabela abilities. Vá na aba 'Inserir'. Irá aparecer um formulário em que você pode criar vários registros de uma vez, mostrando os campos de cada tabela e seus respectivos tipos. Mas recomendo criar poucos de cada vez para não ter problemas. Estou criando de 20 em 20 registros.

É possível usar uma função para se calcular o valor do campo, mas não vou utilizar esse recurso por enquanto. Colocarei os valores direto, exceto no campo ID, que deixarei para o sistema crie o valor automaticamente (já que todos os IDs de todas as tabelas são chaves primárias - PRIMARY -, e AUTO-INCREMENT, ou seja, auto-incrementadas).

Em mySQL, o query equivalente para se criar o registro de um pokémon (no exemplo, o Chesnaught) seria:


mySQL query

INSERT INTO  `pokemon_db`.`pokemon6` (
&nbsp;&nbsp;`ID` ,`Name` ,`Types` ,`Weakness` ,`Resistance` ,`HP` ,`Attack` ,`Defense` ,`Sp.Attack` ,`Sp.Def` ,`Speed` ,`Height` ,`Weight` ,`Abilities` ,`Pre-Evolution` ,`Evolution` ,`Mega-Evolution` ,`Description` ,`Image` ,`Icon` ,`Hatch Steps` ,`Color` ,`Generation` ,`Locations` ,`Egg Group`
) VALUES (
&nbsp;&nbsp;'2',
&nbsp;&nbsp;'Ivysaur',
&nbsp;&nbsp;'Grass,Poison',
&nbsp;&nbsp;'Fire,Flying,Ice,Psychic',
&nbsp;&nbsp;'Electric,Fairy,Fighting,Grass,Water',
&nbsp;&nbsp;'60',
&nbsp;&nbsp;'62',
&nbsp;&nbsp;'63',
&nbsp;&nbsp;'80',
&nbsp;&nbsp;'80',
&nbsp;&nbsp;'60',
&nbsp;&nbsp;'1',
&nbsp;&nbsp;'13',
&nbsp;&nbsp;'Overgrow,Chlorophyll,Hidden Ability',
&nbsp;&nbsp;'Bulbasaur',
&nbsp;&nbsp;'Venusaur',
&nbsp;&nbsp;'0',
&nbsp;&nbsp;'When the bulb on its back grows large, it appears to lose the ability to stand on its hind legs. The bulb on its back grows by drawing energy. It gives off an aroma when it is ready to bloom.',
&nbsp;&nbsp;'http://cdn.bulbagarden.net/upload/thumb/7/73/002Ivysaur.png/250px-002Ivysaur.png',
&nbsp;&nbsp;'http://cdn.bulbagarden.net/upload/6/6b/002MS.png',
&nbsp;&nbsp;'5609',
&nbsp;&nbsp;'Green',
&nbsp;&nbsp;'1',
&nbsp;&nbsp;NULL ,
&nbsp;&nbsp;'Grass,Monster'
);



O ato de adicionar registros em umat tabela pode ser chamado também de "popular" uma tabela.

Acessando um Banco de Dados por PHP

Depois de popular a tabela pokemon6 (a fim de realizar alguns testes com PHP), incrementei o script.php e o código php dentro do body para ver se tudo funcionava bem:


script.php

&lt;?php
&nbsp;&nbsp;$gen = 6;
&nbsp;&nbsp;
&nbsp;&nbsp;$user_name = "root";
&nbsp;&nbsp;$password = "";
&nbsp;&nbsp;$database = "pokemon_db";
&nbsp;&nbsp;$server = "127.0.0.1";
&nbsp;&nbsp;$conection = mysqli_connect($server, $user_name, $password, $database);
&nbsp;&nbsp;if (mysqli_connect_errno()){
&nbsp;&nbsp;&nbsp;&nbsp;echo "Failed to connect to MySQL: " . mysqli_connect_error();
&nbsp;&nbsp;}
?&gt;




index.php (trecho)

&lt;body&gt;
&lt;div id="Container"&gt;
&nbsp;&nbsp;&lt;div id="Display"&gt;
&nbsp;&nbsp;&lt;?php
&nbsp;&nbsp;&nbsp;&nbsp;if($gen==6){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo '&lt;form id="SeachField" class="op"&gt;&lt;input type="text" maxlength="18" /&gt;&lt;input type="submit" value="" /&gt;&lt;/form&gt;';
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;$selection = mysqli_query($conection,"SELECT * FROM pokemon");
&nbsp;&nbsp;&nbsp;&nbsp;while($row = mysqli_fetch_array($selection)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo '&lt;div class="pokemon"&gt;' . $row['Name'] . "&lt;/div&gt;";
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;?&gt;
&nbsp;&nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;



O código funcionou perfeitamente, imprimindo o nome de cada Pokémon da tabela Pokemon em diferentes divs. Apenas para teste, pois no futuro, haverão ícones dos monstrinhos ao invés de seus nomes. Veja a seguir como está ficando a Pokédex:



É, lá está o campo de pesquisa, que ainda não funciona. E lá estão os nomes dos pokémons impressos no canto do visor da Pokédex. Em seguida, vou popular o restante das tabelas, que é a parte mais chata de todo o processo.