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

_deXter

Inserção dupla

12 mensagens neste tópico

Viva,

Tenho um problema... Ao inserir dados (coisas simples numa bd) está a acontecer que os dados são introduzidos em duplicados... Alguém sabe o que poderá estar a acontecer? Lembrei-me que talvez pudesse ser por haver várias ligações abertas à mesma bd?

Confesso que como comecei há pouco tempo a trabalhar com PHP/MySQL não sei muito bem quando deve fazer close de uma conexão... Por exemplo, quando se segue uma hiperligação a ligação à bd continua aberta? Deve desligar-se? Se me poderem dar um breve esclarecimento sobre isso, agradeço. =)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Cada vez que mudas de hiperligaçao quer dizer que tas a puxar outra pagina .php ou a actualizares a mesma. Sim a conexão à bd fecha. Agora isso dos duplicados deve ser erro no teu código. Se o poderes colocar pa ver melhor era uma ajuda.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

<?php

$ok = LigarBD();
$total = MotsTotal(1); 

if ($ok)
{
	$uploadfile = base64_decode($_GET['up']);
	$sql = "INSERT INTO infos (Link,Data) VALUES ('$uploadfile',NOW())";
	echo MotsTotal(0); // imaginando que aqui retorna 2, por exemplo
	$resultado = mysql_query($sql);
	echo MotsTotal(0); // ... aqui retorna-me 4, quando o lógico seria retornar 3 

	$tags = explode(' ', base64_decode($_GET['tags']));
	$ntags = count($tags);
	for ($i = 0; $i < $ntags; $i++)
		AdicionarTag($total, $tags[$i]);

	echo '<strong>Imagem adicionada com sucesso!</strong>';
	echo '<br /><br /><br /><strong>A redireccionar... </strong>';

	mysql_close();
}
else {
	die('Não foi possível conectar: ' . mysql_error());
}

//echo '<meta HTTP-EQUIV="Refresh" CONTENT="2; URL=index.php">';
?>

Vejamos, o MotsTotal(1) retorna o número total de registos na tabela com o valor incrementado, enquanto que o MotsTotal(0) é mesmo o valor.

Vejam o comentários no código para o resto da explicação..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mostra aí a definição da MotsTotal().

Compreendo o teu pedido, lol, mas o problema não é daí. Porque não é por aí que eu vejo que a inserção é feita em duplicado, vejo (também) mesmo directamente no phpMyAdmin, nas tabelas. :P

E portanto sei que o problema não está na contagem.. :S

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

São inseridas duas linhas com os mesmos valores?

Esse código não tem aí nada que cause essa situação. Concerteza estás a fazer um query repetido. tens que ver onde é que a função mysql_query é executada. estás concerteza a chama-la duas vezes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

São inseridas duas linhas com os mesmos valores?

Esse código não tem aí nada que cause essa situação. Concerteza estás a fazer um query repetido. tens que ver onde é que a função mysql_query é executada. estás concerteza a chama-la duas vezes.

Ya, é como se o código fosse executado duas vezes seguidas. Pois... Terei então que procurar melhor. Realmente não percebo... Eu tenho várias funções à parte (entre elas o MotsTotals()) em que são executados quase sempre queries à bd...

Primeiro até pensei que fosse por eu não costumar fazer close das ligações à bd, e talvez pudesse dar erro por isso, mas já vi que não.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebo... Agora por vezes até já aconteceu fazer um inserção tripla... Mas o mais comum continua a ser dois.

Alguém me pode dar umas luzes sobre quando ligar/desligar conexões à bd? Por exemplo:

- Eu tenho um file chamado functions.php, onde estão uma carrada de funções que eu utilizo em várias páginas e essas funções usam (a maior parte) informação da bd, ou sejas queries. Acontece que eu geralmente abre a ligação à bd na página principal e definição da bd já só tenho o código para o querie, já não faço a conexão, isto é correcto? Ou deveria para cada função ligar e desligar à bd? 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que não vale a pena tar a criar uma conexao para cada funçao. Basta no inicio do ficheiro teres a abrir e no fim a fechar... mas isso de tar a ir dupla ou tripla é certamente 'erro' no código. Algures ai vais encontrar uma insersão dupla. E acho que nao te devia ser dificil bastava ires à linha onde tens esse insert e veres...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que não vale a pena tar a criar uma conexao para cada funçao. Basta no inicio do ficheiro teres a abrir e no fim a fechar... mas isso de tar a ir dupla ou tripla é certamente 'erro' no código. Algures ai vais encontrar uma insersão dupla. E acho que nao te devia ser dificil bastava ires à linha onde tens esse insert e veres...

Onde tenho esse insert é no código que coloquei mais acima.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, vou colocar aqui mais info para ver se o pessoal me consegue ajudar... Já me estou a passar com isto. Lol

É o seguinte, o que eu tenho é um form para introduzir uma imagem e as tags, depois é feito um preview à imagem e confirmada ou não a colocação da imagem no site, ou seja, a introdução na bd de um link para a imagem e noutra tabela das tags associadas.

Tenho os seguintes files:

- index.php:

<?php
include "functions.php";
include "session.php";
include "header.php"; 
include "ok.php";
?>

<center>
<?php
if ($_SESSION['logged'] == TRUE)
	include "upload.php";
else
	echo "<form action='index.php' method='POST' enctype='multipart/form-data'>
  				<input type='password' name='pass' /><br /><br />
				<input type='image' src='../upload-server-32x32.png' width='32' height='32'>  
		 </form>";
?>
</center>

<?php include "list.php"; ?>
<?php include "footer.php"; ?>

- upload.php

<?php //include "functions.php"; ?>

<script language="javascript" type="text/javascript">  
function checarform()  
{  
if (document.img.tags.value=='')  
{  
	alert('Mete uma Tag, são de borla!');  
	return false;  
}  
else  
	return true;  
}  
</script>

<center>
<?php 
if ($_GET['preview'] == "ok")
{
	//LigarBD();
	$total = MotsTotal(1);

	$mot_URL = MoveFileImgs($total);
	if ($mot_URL != NULL)
	{
		echo "Preview:<br />";
		echo "<img src='".$mot_URL."' align='center'><br />";

		$tags = base64_encode($_POST['tags']);
		$uploadpath = base64_encode($mot_URL);

		echo 
		"<form name='conf' id='conf' action='index.php?tags=$tags&up=$uploadpath' method='POST' enctype='multipart/form-data'>
	  <input type='submit' value='Confirmar' />
	  </form>
	     <form name='cancel' id='cancel' action='index.php' method='POST' enctype='multipart/form-data'>
	  <input type='submit' value='Cancelar' />
	  </form>";
	}
}

else 
{ 
	echo 
	"<form name='img' id='img' action='index.php?preview=ok' method='POST' enctype='multipart/form-data' onsubmit='return checarform();'>
	  <p>Imagem: <input type='file' name='file'>
	  </p>
	  <p>
		Tags: <br>
		<input type='text' name='tags' id='tags'><br>
	</p>

		  <input type='submit' value='Ok' />
	</form>";
}
?>
<p><a href="index.php?session=off">Encerrar sessão!</a></p>
</center>

- ok.php:

<p align="center">
<?php
//$ok = LigarBD();

$total = MotsTotal(1);

if ($_GET['up'] != '')
{
	$uploadfile = base64_decode($_GET['up']);
	$sql = "INSERT INTO infos (Link,Data) VALUES ('$uploadfile',NOW())";
	$resultado = mysql_query($sql);

	$tags = explode(' ', base64_decode($_GET['tags']));
	$ntags = count($tags);
	for ($i = 0; $i < $ntags; $i++)
		AdicionarTag($total, $tags[$i]);

	echo '<strong>Imagem adicionada com sucesso!</strong>';
	echo '<br /><br /><br /><strong>A redireccionar... </strong>';
}
?>
</p>

Portanto.. Funciona assim, escolhe-se a imagem, tags e tal... Depois ele faz o preview através do "upload.php" e depois faz a inserção na bd através do ok.php. Curiosamente, logo a seguir a fazer a inserção da imagem, ou seja quando aparece "Imagem adicionada com sucesso" não aparece em duplicado, mas ao actualizar o site, já lá está mais uma cópia na bd... Não percebo. :S

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