Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

N3lson

Opinião: form post

Mensagens Recomendadas

N3lson

Boa noite criei este post para saber quais as vossas técnicas para "limpar" o $_POST de um form para evitar dupla inserção, após um refresh.

Editado por N3lson

You can't do it, kid. But don't worry, my boy. You're not the only one. No one else can do it.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
N3lson

será melhor dares um exemplo da situação de que referes

Imaginem um form

$_POST['XXX'] = 4;

INSERT INTO ZZZ(b) values($_POST['XXX']);

no final da inserção na base de dados (usando mesma página), se o user fazer o refresh da página, volta a inserir o valor 4 (dupla inserção).

Editado por N3lson

You can't do it, kid. But don't worry, my boy. You're not the only one. No one else can do it.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
N3lson
	public function inserir_equipamento(){
	echo '<form action="" method="post">

						<div class="block">
							<label><i class="fa fa-calendar fa-fw"></i>Nome do equipamento</label>
							<input type="text" name="maquina" placeholder="Nome interno do equipamento">
						</div>
				<div class="block">
					  <button type="submit" class="btn azul round f-dir"><i class="fa fa-sign-out fa-fw"></i> Registar</button>
					  <div class="clear"></div>
				</div>
		 </form>';
	if(isset($_POST['maquina']) && !empty($_POST['maquina']))
	{
			 sql::inserir_sql($_POST,'maquina');
	}

/**** SQL CLASS ****/

public function inserir_sql($form=array(),$tabela=null,$preg = null)
{
	$virgula = ',';

		$sql = "INSERT INTO {$tabela}(";

			#campos da tabela
			foreach($form as $post=>$value)
			{
				$sql .= $post.$virgula;
			}

			$sql .= ') VALUES(';


			#valores para tabela
			foreach($form as $post=>$valor)
			{
				if ($valor == 'Executar')
				{
					continue;
				}
				if($post == 'nota')
				{
					$valor = nl2br($valor);
				}

				$sql .= "'".$valor ."'". $virgula;
			}
			$sql .=')';

			$query = str_replace(",)",")",$sql);


	if($tabela == 'maquina')
	{
		$a = $this->con->query("SELECT * FROM maquina WHERE maquina LIKE '{$form['maquina']}'");
		$existe = $a->fetch_object();

	}

	# controle de dados repetidos
	if(@$existe)
	{
		html::aviso('O equipamento que está a inserir já se encontra registado na base de dados!', html::indexof().'?inserir='.session_id());
		//html::alerta('O equipamento que está a inserir já se encontra registado na base de dados!\n', html::indexof());
	}
	else
	{
		 $do = $this->con->query($query);

		 $resultado = $this->con->affected_rows;

		 if($resultado > 0)
		 {
			 html::aviso('<span class="verde">Acção concluída com sucesso</span>. Dados Inseridos [ '.$resultado.' ]',html::indexof());
			 //html::alerta('Acção concluída com sucesso \nDados Inseridos [ '.$resultado.' ]',html::indexof());
		 }
		 else
		 {
			 html::aviso('<span class="vermelho">ERRO:</SPAN> Ocorreu um erro ao executar a acção pretendida. Se o problema persistir, contacte administrador do sistema.', html::indexof());
			 //html::alerta('Ocorreu um erro ao executar a acção pretendida.\nSe o problema persistir, contacte Administrador do sistema\n+ '.$con->error.' +', html::indexof());
		 }
	}

Editado por N3lson

You can't do it, kid. But don't worry, my boy. You're not the only one. No one else can do it.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

antes de mais, sendo um pedido por POST, efectuar um refresh da página (Ctrl-R) não efectua a inserção na base de dados


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

pois ... esqueci-me que voçes teem o péssimo hábito de fazer post para a mesma página, alem de não fazer redirect no fim do processamento


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
N3lson

pois ... esqueci-me que voçes teem o péssimo hábito de fazer post para a mesma página, alem de não fazer redirect no fim do processamento

Está a fazer redirect

html::aviso('<span class="verde">Acção concluída com sucesso</span>. Dados Inseridos [ '.$resultado.' ]',html::indexof());

	public function indexof($place=null)
{
	if(!$place)
	{
		$r = $_SERVER['PHP_SELF'];
	}
	else{
		$r = $place.'.php';
	}
	return $r;
}

O que pretendia saber era a técnica que vocês usam para limpar o $_post depois de submetido.

Editado por N3lson

You can't do it, kid. But don't worry, my boy. You're not the only one. No one else can do it.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

como disse, simplesmente não se limpa nada porque não existe necessidade de o fazer:

   client           |       server
---------------------+--------------------

  ----- request form -------->+
                            form.php
  <----- reply form page -----+
  |
  +----- send form data ---------->+
                                submit.php
       <- redirect to result page -+
       |
       +- request result page -------->+
                                  result_page.php
  <------ present result page ---------+
(refresh)
  +---- request result page ---------->+
                                  result_page.php
  <------ present result page ---------+

nota : ainda melhor do que isto é o envio por ajax

  • Voto 1

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.