Inserção de dados em MySQL com PHP + AJAX
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).
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.
* É 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á:
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
Este artigo tem mais de um ano
Fazerem um tutorial com recurso a uma tecnologia totalmente deprecated e desaconselhada (mysql), não é lá muito boa ideia.
Nao é bem assim..
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!
lol para ti, 80% dos servidores web usam mysql!
Já para não falar naquele site muito pequeno que é o facebook…
Bem, tentem lá ler novamente o que eu escrevi. Apenas uma pessoa conseguiu lá chegar e mesmo assim, mandou postas de bacalhau.
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
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…
2017 aqui e ainda se usa muito, eu até estou a começar a aprender agora
Acho que faltou só fechar a ligação à Base de Dados.
De resto está bastante fácil de entender. 🙂
Já agora podias explicar como fechar a ligação?
Obrigado
Ja que falamos mysql
mysqli_close($con);
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 🙂
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); 🙂
Olá “PHP”,
Sim, faltou isso.
Boa observação.
Cumprimentos,
Hélio Moreira
Uma pergunta:
Se algum utilizador mal intencionado abrir o ficheiro “grava.php” tem acesso à password para editar a base de dados?
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.
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!
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.
Pensava que se no Chromium fosse ao menu “Ferramentas”->”Ferramentas do Programador” desse para ver o conteúdo do ficheiro PHP.
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.
+1
+1
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 🙂
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.
Excelente, excelente tutorial! Parabéns! 🙂
Obrigado Nelson.
Cumprimentos,
Hélio Moreira
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.
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.
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
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
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
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.
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
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…
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!
Bom post para quem está a iniciar nesta área 🙂
Parabéns Hélio pelo tutorial e a todos que postam comentários que possa vir a nos servir com qualquer boa informação.
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
Ótimo post, parabéns!
E se no caso fossem campos dinâmicos, como seria o recebimento e envio dos dados no Jquery?
Caso quisesse realizar um upload de imagem junto com o formulário, como seria?
Estou com mysqli
mas aparece a mensagem cadastro efetuado com sucesso
porem não insere no banco no final
oque pode ser?
Olá Marcelo,
Consegue partilhar o código?