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

N3lson

Opinião: form post

Mensagens Recomendadas

N3lson    17
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
N3lson    17
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
N3lson    17
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1139
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1139
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
N3lson    17
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1139
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

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


×

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.