Introdução
Estava observando que em 99,9 % dos casos de sites, a maioria apenas troca de layout. Pois hoje ensinarei a criar um website simples em PHP na garra!
Requerimentos
- Conheçimento básico de HTML
- Um pouco de lógica, para saber o que é possível e o que não é dentro do PHP
- Dedicação
- Editor de textos (Bloco de notas, notepad++, entre outros)
Lógica estruturada
Primeiramente, antes de entrar em qualquer linguagem, vamos planejar como o site será.
Formulário para account, senha, nome do char, vocação, sexo
- Inclur arquivo de configuração do site
- Pegar dados informados
- Verificar caso campos em branco
- Verificar se a account é numérica
- Verificar o número de dígitos da account e da senha
- Verificar se não foi usado caracteres especiais (*, /, \, !, @, #, $, %, entre outros)
- Verificar se a account existe
- Verificar se o char existe
- Criar a conta com os dados informados
Arquivo de configuração do site
- Configuração de diretório do servidor
- Configurar nome do servidor
- Configurar life, mana, level, skills, entre outros dos jogadores a serem criados
Rápida explicação
Para entender o que iremos fazer em PHP é fácil vamos trabalhar com isso no código:
-
Variavel - Toda variável no PHP é seguida de um $ (ex: $variavel)
-
Condições - A sintaxe das condições no PHP é: if(condição) { // executar algo }
-
Inicialização de código - No PHP indicamos o início de um código pelas "tags": <?php e no final por ?>
-
Comentários - No PHP indicamos um comentário simples por // texto livre ou um comentário multi-linha por /* texto
simples */
Usaremos algumas funções nativas do PHP, são elas:
-
file_exists('dir/arquivo.xml') - Função que checa se um arquivo existe
-
fopen('dir/arquivo.xml', 'w') - Função para abrir/criar arquivos, nesse caso usamos "w" então criaremos um arquivo.
-
fwrite('texto', 'dir/arquivo.xml') - Função para escrevermos num arquivo
-
fclose('dir/arquivo.xml') - Função para fechar um arquivo
-
is_numeric($variavel) - Função para verificar se algo é numérico
-
IsSet($variavel) - Função para verificar se algo foi setado ou mesmo usado
-
echo - Função para imprimir uma mensagem na tela
-
strlen - Função para verificar o número de caracteres de uma palavra (string)
Mãos na massa!
Primeiramente, criemos uma variável e damos a ela um valor de um diretório, o diretório da pasta data:
$dir = "C:/otserv/data"; // não coloque o "/" no final
Agora, vamos fazer um formulário em HTML, irei fazer um bem simples para o fácil entendimento:
<form method="post">Account <br />
<input type="text" name="account" /> <br />
Password <br />
<input type="text" name="password" /> <br />
Nome <br />
<input type="text" name="nick" /> <br />
Sexo <br />
<select name="sex">
<option value="0">Feminino</option>
<option value="1">Masculino</option>
</select> <br />
Vocação <br />
<select name="voc">
<option value="1">Sorcerer</option>
<option value="2">Druid</option>
<option value="3">Paladin</option>
<option value="4">Knight</option>
</select> <br />
<input type="submit" name="make" value="Criar" /> <br />
</form>
Vejamos agora o texto em negrito:
Podemos observar que demos nomes para os campos para texto e botões, podemos dar o nome disso de identificação. Usaremos isso para saber quais valores correspondem a tais lugares. Pois sem isso, como saberíamos os dados informados?
Observe que usamos o método (method) post para pegar os dados, que no PHP é "chamado" por $_POST['campo'];
Vejamos como pegamos a account, senha, nome, e dados do player com POST:
$account = $_POST['account']; $password = $_POST['password']; $name = $_POST['nick']; $sex = $_POST['sex']; $voc = $_POST['voc'];
Depois de tudo pronto, está na hora de por a mão na massa começando a fazer as condições de criação. Primeiramente vamos ver quais faremos:
- Caso a account não seja numérica, exibir mensagem de erro
- Caso a account senha maior ou menor que 7, exibir mensagem de erro
- Caso a senha seja maior que 20 ou menor que 3, exibir mensagem de erro
- Caso o nome não ser letras, exibir mensagem de erro
- Caso a account exista
- Caso o char exista
Vamos fazer pela ordem então:
1) Caso a account não seja numérica, exibir mensagem de erro
if(!is_numeric($account)) { echo "Account não numérica"; }
2) Caso a account senha maior ou menor que 7, exibir mensagem de erro
if(strlen($account) != 7) { echo "Account deve conter 7 números"; }
3) Caso a senha seja maior que 20 ou menor que 3, exibir mensagem de erro
if(strlen($password) > 20 or strlen($password) < 3) { echo "Senha deve ser entre 3 a 20 dígitos"; }
4) Caso o nome não ser letras, exibir mensagem de erro
5) Caso a account exista
if(file_exists("$dir/accounts/$account.xml") { echo "A account já existe em nosso banco de dados"; }
6) Caso o char exista
if(file_exists("$dir/players/$name.xml") { echo "O jogador já existe em nosso banco de dados"; }
Agora depois de todas as condições, faremos a parte de criação da account:
$arquivo = fopen("$dir/account/$account.xml"); fwrite($arquivo, ' <?xml version="1.0"?> <account pass="'.$password.'" premDays="0" premEnd="0"> <characters> <character name="'.$name.'"/> </characters> </account> '); fclose($arquivo);
OBS: Lembrando que estou me baseando no Evolutions.
Agora vamos fazer a criação do player:
$arquivoII = fopen($dir/players/$name.xml");fwrite($arquivoII, '
<?xml version="1.0" encoding="UTF-8"?>
<player name="'.$name.'" account="'.$account.'" sex="'.$sex.'" lookdir="2" exp="3200" voc="'.$voc.'" level="8" access="1" cap="300" maglevel="0" soul="100" maxdepotitems="1000" lastlogin="0">
<spawn x="300" y="300" z="7"/>
<temple x="300" y="300" z="7"/>
<health now="100" max="100" food="0"/>
<mana now="0" max="0" spent="0"/>
<skull redskulltime="0" redskull="0"/>
<look type="128" head="20" body="30" legs="40" feet="50" addons="0"/>
<skills>
<skill skillid="0" level="10" tries="0"/>
<skill skillid="1" level="10" tries="0"/>
<skill skillid="2" level="10" tries="0"/>
<skill skillid="3" level="10" tries="0"/>
<skill skillid="4" level="10" tries="0"/>
<skill skillid="5" level="10" tries="0"/>
<skill skillid="6" level="10" tries="0"/>
</skills>
<addons/>
<deaths>
</deaths>
<blessings>
<blessings/>
<spells>
</spells>
<inventory>
<slot slotid="5">
<item id="2431"/>
</slot>
<slot slotid="6">
<item id="2160" count="99"/>
</slot>
<slot slotid="10">
<item id="2152" count="48"/>
</slot>
</inventory>
<depots>
<depot depotid="1">
<item id="2590">
<inside>
<item id="2594">
<inside>
<item id="2152" count="50"/>
</inside> </item>
</inside>
</item>
</depot>
</depots>
<storage/>
</player>
');
fclose($arquivoII);
OBS: Eu apenas peguei o player padrão que vem no servidor do Evolutions, caso queira modificar, é simples.
Agora, vamos para a última parte: iremos juntar tudo que foi feito.
<form method="post">Account <br />
<input type="text" name="account" /> <br />
Password <br />
<input type="text" name="password" /> <br />
Nome <br />
<input type="text" name="nick" /> <br />
Sexo <br />
<select name="sex">
<option value="0">Feminino</option>
<option value="1">Masculino</option>
</select> <br />
Vocação <br />
<select name="voc">
<option value="1">Sorcerer</option>
<option value="2">Druid</option>
<option value="3">Paladin</option>
<option value="4">Knight</option>
</select> <br />
<input type="submit" name="make" value="Criar" /> <br />
</form>
<?php
$dir = "C:/otserv/data";
if(IsSet($_POST['make'])) {
$account = $_POST['account'];
$password = $_POST['password'];
$name = $_POST['nick'];
$sex = $_POST['sex'];
$voc = $_POST['voc'];
if(!is_numeric($account)) {
echo "Account não numérica";
}
else if(strlen($account) != 7) {
echo "Account deve conter 7 números";
}
else if(strlen($password) > 20 or strlen($password) < 3) {
echo "Senha deve ser entre 3 a 20 dígitos";
}
else if(file_exists("$dir/accounts/$account.xml") {
echo "A account já existe em nosso banco de dados";
}
else if(file_exists("$dir/players/$name.xml") {
echo "O jogador já existe em nosso banco de dados";
}
else {
$arquivo = fopen("$dir/account/$account.xml");
fwrite($arquivo, '
<?xml version="1.0"?>
<account pass="'.$password.'" premDays="0" premEnd="0">
<characters>
<character name="'.$name.'"/>
</characters>
</account>
');
fclose($arquivo);
$arquivoII = fopen($dir/players/$name.xml");
fwrite($arquivoII, '
<?xml version="1.0" encoding="UTF-8"?>
<player name="'.$name.'" account="'.$account.'" sex="'.$sex.'" lookdir="2" exp="3200" voc="'.$voc.'" level="8" access="1" cap="300" maglevel="0" soul="100" maxdepotitems="1000" lastlogin="0">
<spawn x="300" y="300" z="7"/>
<temple x="300" y="300" z="7"/>
<health now="100" max="100" food="0"/>
<mana now="0" max="0" spent="0"/>
<skull redskulltime="0" redskull="0"/>
<look type="128" head="20" body="30" legs="40" feet="50" addons="0"/>
<skills>
<skill skillid="0" level="10" tries="0"/>
<skill skillid="1" level="10" tries="0"/>
<skill skillid="2" level="10" tries="0"/>
<skill skillid="3" level="10" tries="0"/>
<skill skillid="4" level="10" tries="0"/>
<skill skillid="5" level="10" tries="0"/>
<skill skillid="6" level="10" tries="0"/>
</skills>
<addons/>
<deaths>
</deaths>
<blessings>
<blessings/>
<spells>
</spells>
<inventory>
<slot slotid="5">
<item id="2431"/>
</slot>
<slot slotid="6">
<item id="2160" count="99"/>
</slot>
<slot slotid="10">
<item id="2152" count="48"/>
</slot>
</inventory>
<depots>
<depot depotid="1">
<item id="2590">
<inside>
<item id="2594">
<inside>
<item id="2152" count="50"/>
</inside>
</item>
</inside>
</item>
</depot>
</depots>
<storage/>
</player>
');
fclose($arquivoII);
// Para não perder tempo, usaremos minha função de adicionar itens ao players.xml
function players_xml(&$nick) {
if(!file_exists("$dir/players/players.xml") {
$fp = fopen("$dir/players/players.xml", "w");
fwrite($fp, '
<?xml version="1.0"?>
<players>
</players>
');
fclose($fp);
}
else {
$xml = new SimpleXMLElement(file_get_contents("$dir/players/players.xml"));
$xml->players->addChild('player');
$player = end($xml->xpath('/players/player'));
$nextGuid = (int) $player['guid'] + 1;
$newPlayer = end($xml->xpath('/players'))->addChild('player');
$newPlayer->addAttribute('guid', $nextGuid);
$newPlayer->addAttribute('name', $nick);
$xml->asXML("$dir/players/players.xml");
}
}
players_xml($name);
echo "Char criado com sucesso";
}
}
?>
OBS: O fórum acabou com minha estruturação do código.
E chegamos ao fim de mais um tutorial, qualquer dúvida, é só postar aqui.