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

Sign in to follow this  
_deXter

Inserção dupla

Recommended Posts

_deXter

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. =)

Share this post


Link to post
Share on other sites
zeroonnet

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.

Share this post


Link to post
Share on other sites
_deXter

<?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..

Share this post


Link to post
Share on other sites
djthyrax

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


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Share this post


Link to post
Share on other sites
_deXter

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

Share this post


Link to post
Share on other sites
pedrotuga

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.

Share this post


Link to post
Share on other sites
_deXter

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.

Share this post


Link to post
Share on other sites
_deXter

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? 

Share this post


Link to post
Share on other sites
zeroonnet

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...

Share this post


Link to post
Share on other sites
_deXter

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.

Share this post


Link to post
Share on other sites
_deXter

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.