Inserção de dados em MySQL com PHP + AJAX

44 Comentários

Com a colaboração de Fernando Carvalho

A inserção de dados numa base de dados é uma tarefa relativamente simples para quem desenvolve soluções para a internet. Existem vários métodos para o efectuar, sendo talvez o mais comum a simples conexão a um ficheiro onde se encontra o código que faz toda a função de gravar na base dados. O único senão deste método é que existe a necessidade de um refreh na página, além de, no caso de não utilizar url’s amigáveis, irá aparecer o caminho e o nome do ficheiro que tem a função referida (www.dominio.pt/grava.php).

Programação WEB

O facto de poder aparecer o ficheiro onde está o ficheiro que tem a função gravar, pode por em causa todo o sistema e facilitar possíveis ataques.

Para evitar isso, além de poder utilizar url’s amigáveis, pode utilizar AJAX (claro que só estas duas “soluções”, não garantem segurança da base de dados ou da solução web).

O que é o AJAX?

Muito resumidamente Ajax é uma sigla para Asynchronous JavaScript and XML, que utiliza scripts client-side, fazendo com que se possa “chamar” dados sem necessidade de reload / refresh da página.

Com este pequeno tutorial irão verificar que é extremamente simples efectuar uma inserção de registos na base de dados utilizando PHP e AJAX.

1º Base de dados

CREATE DATABASE phpajax

2º Tabela: dados

CREATE TABLE dados(
id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
campo1bd VARCHAR(100) NULL,
campo2bd VARCHAR(100) NULL
);

3º Ficheiro index.php
Será neste ficheiro que teremos o formulário para registo.





Inserção de dados em MySQL com PHP + AJAX

Preencha o seguinte formulário:



* É necessário incluir a biblioteca JQuery.

4º Ficheiro grava.php onde estará a query de inserção de dados

//Conexão à base de dados
mysql_connect(“localhost”, “user”, “123”) or die(mysql_error());
mysql_select_db(“phpajax”) or die(mysql_error());

//recebe os parâmetros

$campo1 = $_REQUEST[‘campo1’];
$campo2 = $_REQUEST[‘campo2’];

try
{
//insere na BD
$sql = “INSERT INTO dados (campo1bd, campo2bd) VALUES(‘”.trim($campo1).”‘,’”.trim($campo2).”‘)”;
$result = mysql_query($sql) or die(mysql_error());

//retorna 1 para no sucesso do ajax saber que foi com inserido sucesso
echo “1”;
}
catch (Exception $ex)
{
//retorna 0 para no sucesso do ajax saber que foi um erro
echo “0”;
}

5º Inserimos a função em Javascript (AJAX) para gravar

function inserir registo()
{

//dados a enviar, vai buscar os valores dos campos que queremos enviar para a BD
var dadosajax = {
‘campo1’ : $(“#campo1”).val(),
‘campo2’ : $(“#campo2”).val()
};
pageurl = ‘grava.php’;
//para consultar mais opcoes possiveis numa chamada ajax
//http://api.jquery.com/jQuery.ajax/
$.ajax({

//url da pagina
url: pageurl,
//parametros a passar
data: dadosajax,
//tipo: POST ou GET
type: ‘POST’,
//cache
cache: false,
//se ocorrer um erro na chamada ajax, retorna este alerta
//possiveis erros: pagina nao existe, erro de codigo na pagina, falha de comunicacao/internet, etc etc etc
error: function(){
alert(‘Erro: Inserir Registo!!’);
},
//retorna o resultado da pagina para onde enviamos os dados
success: function(result)
{
//se foi inserido com sucesso
if($.trim(result) == ‘1’)
{
alert(“O seu registo foi inserido com sucesso!”);
}
//se foi um erro
else
{
alert(“Ocorreu um erro ao inserir o seu registo!”);
}

}
});
}

6º Por fim, basta chamar a função de gravar (javascript) no evento “onclick”.

O código final / completo do ficheiro index será:





Inserção de dados em MySQL com PHP + AJAX

Preencha o seguinte formulário:




E desta forma simples podemos inserir dados na base de dados sem necessidade de refresh / reload de qualquer página em PHP.

Para mim é um método bastante interessante e para vocês? O que preferem?

Nota importante: Este exemplo serve apenas para exemplificar a forma de inserir dados através de AJAX + PHP. No exemplo não estão implementados mecanismos de segurança e validação que obviamente serão necessários num projecto final.

Download: Exemplo Completo

Partilhar:
Tags:

Comentários

44

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de Lol
    Lol

    Fazerem um tutorial com recurso a uma tecnologia totalmente deprecated e desaconselhada (mysql), não é lá muito boa ideia.

    1. Avatar de LOL NOT
      LOL NOT

      mysql deprecated?
      php mysql extension for mysql é que foi passada ao estado de depracated, mas mysql tecnologia obsoleta? É só detido pela oracle, e está muito longe de ser obsoleto!

    2. Avatar de Miguel
      Miguel

      lol para ti, 80% dos servidores web usam mysql!

      1. Avatar de André
        André

        Já para não falar naquele site muito pequeno que é o facebook…

        1. Avatar de Lol
          Lol

          Bem, tentem lá ler novamente o que eu escrevi. Apenas uma pessoa conseguiu lá chegar e mesmo assim, mandou postas de bacalhau.

          1. Avatar de Hélio Moreira
            Hélio Moreira

            Caro “lol”,

            A extensão mysql pode ter sido considerada “deprecated”, mas se verificar a grande maioria dos servidores ainda a utilizam pois a grande maioria têm a versão 5.4 ou inferior a rodar.

            Apenas a partir da versão 5.5 é que foi “deprecated”.

            http://php.net/manual/en/migration55.deprecated.php

    3. Avatar de Nelson
      Nelson

      Que lol… O tutorial nem sequer é dependente de se é mysql ou outro, comandos SQL são transversais a qualquer dbms que use SQL, seja mysql, oracle, Maria, postgres, etc…

    4. Avatar de maxim
      maxim

      2017 aqui e ainda se usa muito, eu até estou a começar a aprender agora

  2. Avatar de PHP
    PHP

    Acho que faltou só fechar a ligação à Base de Dados.
    De resto está bastante fácil de entender. 🙂

    1. Avatar de André Rua
      André Rua

      Já agora podias explicar como fechar a ligação?
      Obrigado

      1. Avatar de Gonçalo
        Gonçalo

        Ja que falamos mysql

        mysqli_close($con);

        1. Avatar de Guilherme Cabral
          Guilherme Cabral

          os comandos mysqli são diferentes dos comandos mysql usados no tutorial… a conexão não é feita com mysqli, portanto não deve ser terminada com mysqli.

          deve ser usado mysql_close 🙂

        2. Avatar de Guilherme Cabral
          Guilherme Cabral

          os comandos mysqli são diferentes dos comandos mysql usados no tutorial… a conexão não é feita com mysqli, portanto não deve ser terminada com mysqli.

          deve ser usado mysql_close($con); 🙂

    2. Avatar de Hélio Moreira
      Hélio Moreira

      Olá “PHP”,

      Sim, faltou isso.

      Boa observação.

      Cumprimentos,
      Hélio Moreira

  3. Avatar de ZiLOG
    ZiLOG

    Uma pergunta:

    Se algum utilizador mal intencionado abrir o ficheiro “grava.php” tem acesso à password para editar a base de dados?

    1. Avatar de TelmoN
      TelmoN

      Que eu saiba não, pois não consegues ver o conteúdo do ficheiro “grava.php” já que o conteúdo está dentro das tags o que significa que é executado do lado do servidor. Mesmo que faças o download do ficheiro, virá em branco, a não ser que tenhas HTML, Javascript, etc já dentro fora das tags do php.

    2. Avatar de Rudi Rocha

      Se houver quebra de segurança, e o atacante conseguir obter o ficheiro sim… mas creio que o objectivo deste artigo foi demonstrar como usar o ajax em funções assíncronas de um browser.
      Para acrescentar segurança, isso já seriam precisos mais uns quantos artigos sobre o assunto.
      Bom artigo!

    3. Avatar de Ricardo
      Ricardo

      Oi Ziliog.

      Abrir o ficheiro php é impossivel, visto que php funciona no server side e nao no client side.

      A password pode nem estar nesse ficheiro.
      Espero ter exclarecido.

    4. Avatar de ZiLOG
      ZiLOG

      Pensava que se no Chromium fosse ao menu “Ferramentas”->”Ferramentas do Programador” desse para ver o conteúdo do ficheiro PHP.

      1. Avatar de António Riso
        António Riso

        Não dá.
        A linguagem php é uma linguagem executada do lado do servidor. Ou seja, antes de a página ser enviada para o teu browser, o servidor interpreta as instruções php e produz o seu resultado para apenas html, e de seguida envia esse resultado.

        Uma falha de segurança, como já aqui foi falado, poderia sim expor a password. Mas para isso era preciso o utilizador ter acesso aos ficheiros fonte do website que estão alojados no servidor. Mesmo que deixes a password assim “à mostra” num ficheiro, as empresas de alojamento garantem que ninguém acede aos ficheiros. Contudo deves sempre procurar outras técnicas de segurança. Nunca é demais. Uma muito simples passa por colocar ficheiros de configurações fora da pasta pública do website.

    5. Avatar de Guilherme Cabral
      Guilherme Cabral

      uma das técnicas de segurança é criar vários utilizadores na base de dados com diferentes níveis de acesso. assim, mesmo que a password seja descoberta, os danos sejam menos graves 🙂

      1. Avatar de William schoeffel
        William schoeffel

        Essa técnica ainda permite descobrir com qual usuário foi feita as alterações, por isso é recomendado cada pessoa ter seu usuário de banco.

  4. Avatar de Nelson
    Nelson

    Excelente, excelente tutorial! Parabéns! 🙂

    1. Avatar de Hélio Moreira
      Hélio Moreira

      Obrigado Nelson.

      Cumprimentos,
      Hélio Moreira

  5. Avatar de João
    João

    Já nem digo para fazerem tutoriais em coisas mais bleeding edge ou que ainda não se encontre facilmente na net.. mas ao menos podiam tentar seguir as boas práticas e as convenções atuais.

  6. Avatar de Gomes
    Gomes

    Falta um pormenor importante a nível de segurança, os parâmetros não estão devidamente tratados, para gerar erro basta colocar uma pelica num dos campos do formulário.

    1. Avatar de Hélio Moreira

      Olá Gomes,

      Sim, não estão implementados sistemas de segurança, mas o intuito também não é esse, é sim, exemplificar a facilidade que existe em utilizar PHP + AJAX.

      A questão da segurança dava uma série de tutoriais. O que eventualmente posso vir a escrever.

      Obrigado pelo seu comentário,
      Hélio Moreira

  7. Avatar de Gomes
    Gomes

    Outra sugestão, visto que o formulário está a ser enviado por “post”, o ideal seria usar $_POST ao invés de $_REQUEST, pois uma pessoa mal intencionada desse modo poderia enviar dados via GET ou COOKIES.

    1. Avatar de Guilherme Cabral
      Guilherme Cabral

      +1

    2. Avatar de Hélio Moreira

      Olá Gomes (novamente) :),

      Sim, ao passar em POST, devo receber em POST. Mais uma vez a questão de segurança é pertinente neste caso.

      Contudo, desta forma e para quem esteja a aprender, ao utilizar o REQUEST pode utilziar a função em qualquer situação, quer passe por GET ou POST.

      Mas sem dúvida que a boa prática será utilizar o mesmo método.

      Cumprimentos,
      Hélio Moreira

  8. Avatar de Batman O Justiceiro
    Batman O Justiceiro

    Atenção as falhas graves de segurança. Aconselho que a ligação a base de dados seja feita por PHP:PDO e que se corrigam falhas a nível de Sql injection.

    1. Avatar de Hélio Moreira

      Olá “Batman”,

      Sim, não estão implementados sistemas de segurança, mas o intuito também não é esse, é sim, exemplificar a facilidade que existe em utilizar PHP + AJAX.

      A questão da segurança dava uma série de tutoriais. O que eventualmente posso vir a escrever.

      Obrigado pelo seu comentário,
      Hélio Moreira

      1. Avatar de Filipe Sá
        Filipe Sá

        mysql_real_escape_string() não é um sistema de segurança, é uma função.

        Isto de deixar a segurança para os outros dá muito mau resultado…

  9. Avatar de NP
    NP

    Tirando o facto de ser um bom exemplo para quem estiver a dar os primeiros passos, é também importante dizer:

    Don’t try this at work!

  10. Avatar de Carlos Oliveira
    Carlos Oliveira

    Bom post para quem está a iniciar nesta área 🙂

  11. Avatar de Tiago
    Tiago

    Parabéns Hélio pelo tutorial e a todos que postam comentários que possa vir a nos servir com qualquer boa informação.

  12. Avatar de Gabriel

    Procurei em umas 20 paginas de tutorial. e este quase que com um ano de publicado foi o único que solucionou o problema, pois inves de usar Form, usa DIV…
    Muito obrigadooo

  13. Avatar de Danny Dantas
    Danny Dantas

    Ótimo post, parabéns!
    E se no caso fossem campos dinâmicos, como seria o recebimento e envio dos dados no Jquery?

  14. Avatar de Andréia
    Andréia

    Caso quisesse realizar um upload de imagem junto com o formulário, como seria?

  15. Avatar de marcelo
    marcelo

    Estou com mysqli
    mas aparece a mensagem cadastro efetuado com sucesso
    porem não insere no banco no final
    oque pode ser?

    1. Avatar de Hélio Moreira
      Hélio Moreira

      Olá Marcelo,

      Consegue partilhar o código?