Melhor Forma De Impedir Insert Duplicado

Prezados,

Esta situação não se refere especificamente ao Yii, mas gostaria de saber quais as soluções que vocês utilizam para evitar inserts duplicados. Em um crud padrão do yii por exemplo, se o usuário clicar repetidas vezes no botão salvar ao inserir um registro, ele será duplicado.

Vejo as seguintes opções:

  1. bloquear o botão inserir ao clicar a primeira vez -> mas se o link oscilar, o usuário não conseguirá reenviar o formulário;

  2. fazer um select para verificar se o registro já existe -> penso ser pesado, principalmente ao utilizar uma aplicação de alto tráfego, onde teremos mysql replicado para separação de bases para inserts e selects (que é meu caso);

Existe alguma solução mais prática e leve?

Uma forma simples de evitar isso é usar um redirect para a mesma página depois de salvar.


$this->redirect("url");

Uma outra forma mais simples ainda é usar o método refresh do Yii.


$this->refresh();

Legal Aryel, esta é uma boa prática que evita problemas com o botão voltar do navegador. Já passei por isso no passado e contornei com ‘redirect’ (ou mesmo o ‘header’ do php quando não usava framework).

Mas mesmo assim ainda consigo inserir vários registros simplesmente clicando feito um louco no botão cadastrar do crud… ou seja, o php acaba recebendo várias requisições http e tratando todas elas (fazendo inserts duplicados).

Apix,

Quando o cliente clicar, você desativa o botão. Se houver alguma instabilidade no sistema, se caso ocorrer, colocar um setTimeout() de 30 segundos, se o formulário não submeter em 30 segundos o botão volta a ser ativado.