• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

pluis3103

Impedir que o utilizador faça refresh e a informação duplique na bd

33 mensagens neste tópico

Boas pessoal,

Sou um iniciante no php e tou a construir um backoffice mas deparei-me com o seguinte :

O meu projecto tem um formulário que envia os dados inseridos para uma outra página php onde tenho um código que pega nesses dados através do $_REQUEST e os insere na base de dados,depois lista os dados inseridos. Até aqui tudo bem,mas reparei que se fizer refresh ou go no browser ele volta a inserir os mesmos dados na bd , ficando assim duplicados.

Alguém me dá uma dica de como impedir isso??

Já pensei em ter uma página php onde apenas faz a inserção dos dados e depois redirectiona-la para uma onde mostrar o novo registo , mas já sem o código de inserir...é a melhor maneira ou há outras formas??como poderia fazer este redirecionamento em php??

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Já pensei em ter uma página php onde apenas faz a inserção dos dados e depois redirectiona-la para uma onde mostrar o novo registo

Esta é a maneira mais simples.

como poderia fazer este redirecionamento em php?

http://php.net/header

<?php
/* validate */
/* insert */
header('Location: mostra.php');
exit('<a href="mostra.php">Mostra</a>');
?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O melhor é mesmo verificares se estás a adicionar dados em duplicado. Redireccionar o utilizador para outra página é esconder o problema. :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

exactamente crias uma regra , fazes uma consulta a base de dados, e fazes por exemplo;

if($dados_consultados==$dados_inseridos){

exit;

}

ou seja se ja existir os dados digitados pelo utilizador por mais refresh que faca vai dar sempre exit.. esta e uma das muitas maneiras secalhar das mais simples.

os $dados_consultados seria uma $_request por exemplo, e os dados inseridos seria um $row na base de dados para verificar se ja la existem dados iguais e para impedir que os mesmos sejam reinseridos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes usar um timestamp para controlo.

Se o timestamp for válido executas a operação, caso contrário, ignoras.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Penso que redireccionar te resolvia problema de forma simples e eficaz, como te sugeriu o pmg.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes na base de dados criar um campo chamado `codigo`, com um índice do tipo único

no formulário tens um campo escondido com um valor único, como por exemplo microtime()

assim não tens que te preocupar com nada, o registo nunca vai ser inserido duas vezes porque a base de dados não o vai permitir uma vez que o campo `codigo` tem que ser único e estás a inserir o mesmo valor novamente

é esta a minha sugestão!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

user a opçao unique, imagina que ele pode ter todos os campos repetidos, esse campo unique nao vai ser util, nao pode usar essa opçao,

mesmo que crie um campo so para isso e que seja unique, e se aparecer o mesmo codigo nesse campo, ja da barraca.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não consegui acompanhar o teu raciocínio, os índices unique servem para isso mesmo impedir que haja duplicação de dados

O microtime vai te dar sempre um valor único, que  é o numero de microsegundos do tempo actual a contar de 1 de janeiro de 1970, portanto a probabilidade de dois códigos iguais é nula para o tipo de aplicações que é

Ele não quer que a tabela não contenha dados iguais (ou pelo menos não o disse), apenas quer que o utilizador ao fazer refresh não insira duas vezes o mesmos dados, se não quiser ter dados iguais na tabela põe os campos todos como unique e tem o problema resolvido!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim ele pode querer ter campos repetidos, logo nao pode utilizar unique,

e a soluçao do microtime tambem nao da, porque ele escreve agora na base de dados, quando faz um refresh ja passou tempo em relaçao a quando escreveu logo o valor que o microtime vai atriubuir e diferente,  conclusao o tempo e outro e repetiu os valores na base de dados, penso eu

eu tive este problma e resolvi com cookies andei atras de uma funçao mas nao encontrei nada para isto

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quando fazes refresh a uma página o browser volta a enviar os mesmos dados, não inventa dados novos!

<?php
echo $_POST['value']
?>

<form method="post"><input type="text" name="value"><input type="submit"></form>

tenta la escrever qq coisa na input box faz submit e depois faz refresh, vais ver que os dados são sempre os mesmos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A solução para isto é adicionar um identificador único num hidden field na form, e ver se já foi inserido previamente na base de dados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tu falaste no elemento unique, e e dize que eu posso querer que exista campos repetidos, logo esta opçao sai

e falaste de criar uma coluna na base de dados em que utilizavas a funçao microtime()

e tu ao escrever na base de dados com a funcao microtime()

quando fazes refresh os dados sao os mesmo, isso eu sei, nao alteram em nada....mas a funcao microtime devolve outro valor, logo os dados sao inseridos novamente

experimenta sven com essa funçao, posso estar errado, e eu nao sou profissional a programar, isto nem e o meu emprego, é um hobbie, e tou aqui para aprender e ajudar no que sei,

deixa aqui um exemplo de como estares a dizer sven

nao fui eu que abrir, mas agora tou curioso

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

triton, e se cada user poder fazer quandos anuncios quiser, que exista campos podem ser todos repetidos so nao podem ser naquele momento do anuncio, se se tratar de um site de anuncios, logo como nos vamos impedir que todos os utilizadores que existem se forem muitos nao exista esse valor repetido no formulario, é facil criar uma funçao com o mt_rand por exemplo de um numero aleatorio, e ate podemos acrescentar letras nesse numero que nao e dificil aleatorias.

ao escrever na coluna esse valor aletarorio na base de dados estar a utilizar o elemento unique, e so escreve uma vez, ate aqui tudo bem e a funcionar

mas se a funçao mt_rand() da o numero conforme o relogio, imaginemos que temos varios usuarios ao mesmo tempo decidem fazer um anuncio, esse valor dado pelo mt_rand() vai ser o mesmo em todos, é dificil de acontecer mas pode

ou tou errado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu não especifiquei a forma como obter esse identificador único, mas existem várias formas.

Podes usar por exemplo um UUID.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

elcsat, taz a fazer uma confusão enorme no que toca à inserção de dados e aos indices unicos

Tambem não percebeste o que eu disse, mas recapitulando:

criar na bd um campo `codigo` associado a um index do tipo unique, portanto não vamos poder ter dados repetidos para esse campo.

no formulário tens um campo escondido com um valor único

se o refresh, como tu já percebeste, envia os mesmos dados novamente, a inserção não vai ser feita pois o valor do campo `codigo` vai ser duplicado e a bd gera um erro

Agora um explicação resumida dos indices unique na bd.

Tu não define um campo como unique, defines um indice como unique.

Como.com certeza sabes, um indice pode conter mais do que um campo, ou seja se definir um indice unique com os campos nome e email vou poder inserir quantas vezes quiser o mesmo email e também o mesmo nome, com a condição de que  o par (nome, email) não se repita

exemplo

nome1, email1

nome1, email2

nome2, email1

vão ser inseridos

agora

nome1,email1 já não vai ser inserido novamente

A probabilidade de teres o mesmo código único duas vezes é inexistente sobretudo para este tipo de aplicações, existem outros algoritmos que que te permitem ter com uma certeza um pouco maior um código único

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

nem me lembrei do uuid :wallbash:

tava em pensar em funcoes para gerar o alteatorio do tipo rand(), e nem me lembrei disso, assim é possivel criar o ideintificador unico

;):D :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sven tens razao, nao tava a entender a parte dos inidices como tu os querias usar  :wallbash:

:D obrigada  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pessoal, obrigado pela vossa colaboração ... É sempre bom ouvir várias opiniões .....

Obrigado mais uma vez

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ou podes sempre ver na base de dados, se os dados tao repetidos(antes da query insert), se assim for, nao executas mais nada, else, continua com o insert na base de dados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ou podes sempre ver na base de dados, se os dados tao repetidos(antes da query insert), se assim for, nao executas mais nada, else, continua com o insert na base de dados.

Mas isso vai-te obrigar a fazer um select antes do insert, o que para sites com pouco tráfego e poucos dados até é aceitável, mas para grandes volume de dados e tráfego (leia-se muitas vistas ao site) pode ser problemático em termos de performance

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora