PHP – Inserir registos numa tabela através de um formulário HTML

By | 22 Dezembro, 2017

Neste artigo vamos demonstrar uma forma de realizar a inserção de registos, a partir de um formulário simples em HTML, numa tabela existente num servidor MySQL  e recorrendo à linguagem de script PHP.  O servidor utilizado no exemplo é o localhost, acessível com o utilizador root e password 1234. A base de dados chama-se empresa e contém a tabela departamento. O objectivo será inserir novos registos na tabela departamento.

Criação da base de dados

Começamos por criar a base de dados com o seguinte script:

CREATE DATABASE empresa DEFAULT CHARACTER SET utf8;

USE empresa;

CREATE TABLE departamento (
  id VARCHAR(10) NOT NULL,
  nome VARCHAR(50) NOT NULL,
  PRIMARY KEY (id));
  
INSERT INTO departamento (id, nome) VALUES ('DI', 'Departamento de Informática');
INSERT INTO departamento (id, nome) VALUES ('DL', 'Departamento de Limpeza');
INSERT INTO departamento (id, nome) VALUES ('DC', 'Departamento de Contabilidade');
INSERT INTO departamento (id, nome) VALUES ('DRH', 'Departamento de Recursos Humanos');
INSERT INTO departamento (id, nome) VALUES ('DS', 'Departamento de Segurança');

Como podemos observar no código sql, a inserção de registos é realizada através do comando INSERT INTO. No nosso exemplo vai ser criado um script php, que através da função query() da extensão mysqli, executará o comando de inserção de um registo na tabela departamento.
Para este exemplo vamos utilizar dois ficheiros php:

  • formdepartamento.php – vai conter o código html do formulário para que o utilizador possa introduzir os dados do departamento, o id e o nome. Note-se que apesar de só conter código html podemos manter a extensão php.
  • inseredepartamento.php – vai conter o código php responsável por receber os dados do formulário, validar os dados , estabelecer a ligação com o servidor MySQL e executar a consulta de inserção de dados na tabela.

 Formulário para introdução de dados.

No ficheiro formdepartamento.php criamos o seguinte código, que é responsável por fornecer um formulário para que o utilizador possa introduzir os dados relativos a um departamento.

<html>
    <head>
        <title>Inserir Departamento</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <form method="POST" action="inseredepartamento.php">
            Id: <br> 
            <input type="text" name="T_id"><br>
            Nome:<br>
            <input type="text" name="T_nome"><br>
            <input type="submit" value="Inserir">
        </form>
    </body>
</html>

Principais elementos html utilizados no código:

  • <form method=”POST” action=”inseredepartamento.php”> – define um formulário para recolha de dados. O atributo method especifica o modo como os dados do formulário são passados para a página especificada pelo atributo action, que irá receber e processar os dados do formulário. Com method=”POST” os dados enviados não são visíveis no URL, são anexados ao corpo do pedido HTTP.
  • <input type=”text” name=”T_id”> – elemento de uma linha para introdução de texto, neste caso para o id. O atributo name serve para referenciar os dados após a submissão do formulário. Se o atributo name não existir os dados não são enviados quando o formulário é submetido. Ao atributo name pode ser dado qualquer valor, no entanto convém ser coerente e seguir uma lógica que facilite a identificação do elemento. No exemplo, para o atributo name demos o valor T_id, uma vez que estamos perante um elemento do tipo texto (T) e referente ao campo id (_id).
  • <input type=”submit” value=”Inserir”> – elemento que define um botão para submeter o formulário. O parâmetro value corresponde ao texto que vai aparecer no botão.

 

Receber dados do formulário e inserir na tabela

Sempre que o formulário é submetido é executado o código do ficheiro definido pelo atributo action do formulário, no nosso caso, o ficheiro inseredepartamento.php. É neste ficheiro que será escrito o código necessário para enviar os dados do nosso formulário, para a tabela da base de dados. Vamos criar as instruções para:

  • Verificar se o formulário foi submetido e validar os dados recebidos.
  • Estabelecer a ligação com a base de dados.
  • Criar e executar a consulta de inserção na tabela.

Verificar se o formulário foi submetido e validar os dados recebidos
O PHP fornece várias variáveis predefinas, denominadas de “superglobals” e que podem ser acedidas a qualquer altura ou em qualquer local no nosso código. Para verificar informações relativas à execução do servidor utilizamos a variável $_SERVER. Através desta variável podemos verificar se foi utilizado o método POST no envio de um formulário, acedendo a $_SERVER[‘REQUEST_METHOD’]. No nosso código vamos fazer esse teste, evitando assim erros caso se tente executar o ficheiro diretamente através do seu URL. Recorrendo à variável $_POST podemos aceder aos valores de variáveis enviadas através do método POST. No nosso caso, as variáveis a aceder correspondem aos elementos do formulário para o id e para o nome do departamento, variáveis essas que têm como nome T_id e T_nome. Por questões de segurança, filtragem e validação não devemos aceder diretamente à variável $_POST, assim utilizamos a função filter_input().

/* Verificar se o formulário foi submetido */
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $id = filter_input(INPUT_POST, 'T_id');
    $nome = filter_input(INPUT_POST, 'T_nome');

    /* validar os dados recebidos do formulario */
    if (empty($id) || empty($nome)){
        echo "Todos os campos do formulário devem conter valores ";
        exit();
    }    
}
else{
   echo " Erro, formulário não submetido ";
   exit();
}

Como podemos observar, no código utilizado foram ainda criadas as variáveis $id e $nome para guardar os valores que serão enviados para a tabela departamento da nossa base de dados.

Estabelecer a ligação com a base de dados.
Para criar a ligação à nossa base de dados vamos recorrer à extensão mysqli no modo orientado objetos, na qual indicamos os dados de acesso: servidor, utilizador, password e base de dados. Mais detalhes em (PHP – Ligação a uma base de dados MySQL utilizando a extensão mysqli no modo orientado a objetos).

/* estabelece a ligação à base de dados */
$ligacao = new mysqli("localhost", "root", "1234", "empresa");

/* verifica se ocorreu algum erro na ligação */
if ($ligacao->connect_errno) {
    echo "Falha na ligação: " . $ligacao->connect_error; 
    exit();
}

Criar e executar a consulta de inserção na tabela.
A inserção do registo na base de dados é realizada através da execução de uma consulta SQL. Para isso criamos uma variável $consulta que contém o texto da consulta já com as variáveis $id e $nome que trazem os respetivos valores a enviar para a tabela.

(Mais detalhes sobre consultas em PHP – Visualizar registos de uma tabela numa base de dados MySQL).

/* texto sql da consulta*/
$consulta = "INSERT INTO departamento (id, nome) VALUES ('$id', '$nome' )";

/* executar a consulta e testar se ocorreu erro */
if (!$ligacao->query($consulta)) {
    echo " Falha ao executar a consulta: \"$consulta\" <br>" . $ligacao->error;
    $ligacao->close();  /* fechar a ligação */
}
else{
    /* percorrer os registos (linhas) da tabela e mostrar na página */
    echo " Novo registo inserido com sucesso" ;
    }

$ligacao->close();       /* fechar a ligação */

 

Código completo do ficheiro inseredepartamento.php

<?php

/* Verificar se o formulário foi submetido */
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $id = filter_input(INPUT_POST, 'T_id');
    $nome = filter_input(INPUT_POST, 'T_nome');

    /* validar os dados recebidos do formulario */
    if (empty($id) || empty($nome)){
        echo "Todos os campos do formulário devem conter valores ";
        exit();
    }    
}
else{
   echo " Erro, formulário não submetido ";
   exit();
}


/* estabelece a ligação à base de dados */
$ligacao = new mysqli("localhost", "root", "1234", "empresa");

/* verifica se ocorreu algum erro na ligação */
if ($ligacao->connect_errno) {
    echo "Falha na ligação: " . $ligacao->connect_error; 
    exit();
}
    
/* texto sql da consulta*/
$consulta = "INSERT INTO departamento (id, nome) VALUES ('$id', '$nome' )";

/* executar a consulta e testar se ocorreu erro */
if (!$ligacao->query($consulta)) {
    echo " Falha ao executar a consulta: \"$consulta\" <br>" . $ligacao->error;
    $ligacao->close();  /* fechar a ligação */
}
else{
    /* percorrer os registos (linhas) da tabela e mostrar na página */
    echo " Novo registo inserido com sucesso" ;
    }

$ligacao->close();       /* fechar a ligação */

 

Referências