Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

lauinsane

[Resolvido] Deletar registros de tabelas relacionadas

Recommended Posts

Estou com um problema para deletar alguns registros em tabelas relacionadas e gostaria de uma ajuda se possivel. A estrutura do BD está assim:

 

CREATE TABLE gvnews (
	id int(5) unsigned NOT NULL auto_increment,
	titulo varchar(255) NOT NULL,
	data date NOT NULL,
	texto text,
	PRIMARY KEY (id)
	);

CREATE TABLE gvnews_img (
	id int(5) unsigned NOT NULL auto_increment,
	id_news varchar(5) NOT NULL,
	imagem text,
	PRIMARY KEY (id)
	); 

 

 

 

E o código que estou utilizando é este. Alguma coisa com certeza está feito errado na parte de deletar, pois o mesmo não funciona hehehehe. Ele tem que deletar o registro da noticia de GVNEWS e depois o registro relacionada a mesma noticia de GVNEWS_IMG e ai então remover a imagem que está armazenada em uma pasta. Qualquer ajuda ou diga será muito bem recebida :D

 

 

 

 

 


<?
include ("include/conecta.php");
require_once("verifica.php");

	$id = $_GET["id"];

	if($_GET["acao"] == excluir){

	$consulta = mysql_query("SELECT * FROM gvnews WHERE id = '$id'");
	$resultado = mysql_fetch_object($consulta);

	$sql = "DELETE FROM gvnews,gvnews_img WHERE gvnews.id=gvnews_img.id_news AND gvnews.id ='$id' ";
	$del = mysql_query($sql)or die(mysql_error());
	
	if( $del ){
	if(is_file('../' . $resultado->imagem)){
		unlink('../' . $resultado->imagem);
	} 
	}
	}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<script language=javascript>
function abrir (URL){
   window.open(URL,"janela1","width=450,height=500,left=400,top=200,scrollbars=YES")
}
</script>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<title>Untitled Document</title>
</head>

<body>
<table width="600" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td> </td>
  </tr>
  <tr>
    <td><table width="600" border="0" cellspacing="0" cellpadding="0">
		  <?
	$dados = mysql_query("SELECT * FROM gvnews ORDER BY data DESC");
	$conta = mysql_num_rows($dados);
		if($conta == "0"){
			echo "Sem noticias cadastradas";
	} else {
	?>
      <tr>
        <td width="47">ID</td>
        <td width="80">Data</td>
        <td width="338">Titulo</td>
        <td width="135">Status</td>
        </tr>
		  <?
	while($linha=mysql_fetch_array($dados)){

	$id = $linha["id"];
	$titulo = $linha["titulo"];
	$data = $linha["data"];
	$imagem = $linha["imagem"];
	
	$data_explode = explode('-',$data);// Remove a / da variavel data
	$data_explode[0];// Exibe somente o dia da data
	$data_explode[1];// Exibe somente o mes da data
	$data_explode[2];// Exibe somente o ano da data
	$data_formatada = $data_explode[2]."/".$data_explode[1]."/".$data_explode[0];
	
	?>
      <tr>
        <td><? echo "$id" ?></td>
        <td><? echo "$data_formatada" ?></td>
        <td><? echo "$titulo" ?></td>
        <td><table width="100" border="0" cellspacing="0" cellpadding="0">
          <tr>
            <td> </td>
            <td> </td>
            <td> </td>
            </tr>
          <tr>
            <td><a href="javascript:abrir('gvnews_view.php?id=<?php echo "$id"; ?>')">Visualizar</a></td>
            <td><a href="?cat=gvnews⊂=editar&id=<?php echo "$id"; ?>">Editar</a></td>
            <td><a href="?cat=gvnews&acao=excluir&id=<?php echo "$id"; ?>">Excluir</a></td>
            </tr>
        </table></td>
        </tr>
      <tr>
        <td> </td>
        <td> </td>
        <td> </td>
        <td> </td>
        </tr>
	<?
	}
	}
	?>
    </table></td>
  </tr>
</table>
</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites
CREATE TABLE gvnews (
       id int(5) unsigned NOT NULL auto_increment,
       titulo varchar(255) NOT NULL,
       data date NOT NULL,
       texto text,
       PRIMARY KEY (id)
       ) ENGINE = INNODB;

CREATE TABLE gvnews_img (
       id int(5) unsigned NOT NULL auto_increment,
       id_news varchar(5) NOT NULL,
       imagem text,
       PRIMARY KEY (id),
       INDEX (id_news),
       FOREIGN KEY (id_news) REFERENCES gvnews(id) ON DELETE CASCADE
       ) ENGINE = INNODB; 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas a parte do DELETE na consulta SQL é que não estou conseguindo achar a formula. Fica me retornando o seguinte erro:

 

 

"Você tem um erro de sintaxe no seu SQL próximo a 'WHERE gvnews.id=gvnews_img.id_news AND gvnews.id ='1'' na linha 1"

Compartilhar este post


Link para o post
Compartilhar em outros sites

sua ID é INTEGER, deve ser passada fora das aspas

 

... WHERE ID = 1

 

se estruturar o banco com a FOREIGN KEY, não precisará fazer esta comparação de ID's, basta remover a notícia da tabela principal:

DELETE FROM gvnews WHERE id = 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

É, não funcionou, Ele deleta da tabela gvnews mas não da gvnews_img e nem remove o arquivo da pasta.

 

Alguma outra dica que posso tentar? Pois meu conhecimento limitado está mais que esgotado.

 

sua ID é INTEGER, deve ser passada fora das aspas

 

... WHERE ID = 1

 

se estruturar o banco com a FOREIGN KEY, não precisará fazer esta comparação de ID's, basta remover a notícia da tabela principal:

DELETE FROM gvnews WHERE id = 1

 

 

O ID é passado para saber qual noticia é para excluir dentro da relação de noticias que é dada na página.

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu só tinha adicionado a foreign key, agora que estudei suas tabelas e estão mal formadas =)

 

CREATE TABLE gvnews (
       id int(5) unsigned NOT NULL auto_increment,
       titulo varchar(255) NOT NULL,
       dia date NOT NULL,
       texto text,
       PRIMARY KEY (id)
       ) ENGINE = INNODB;

CREATE TABLE gvnews_img (
       id int(5) unsigned NOT NULL auto_increment,
       id_news int(5) unsigned NOT NULL,
       imagem text,
       PRIMARY KEY (id),
       INDEX (id_news),
       FOREIGN KEY (id_news) REFERENCES gvnews(id) ON DELETE CASCADE
       ) ENGINE = INNODB;

 

agora sim TEM que funcionar. até testei aqui

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu só tinha adicionado a foreign key, agora que estudei suas tabelas e estão mal formadas =)

 

CREATE TABLE gvnews (
       id int(5) unsigned NOT NULL auto_increment,
       titulo varchar(255) NOT NULL,
       dia date NOT NULL,
       texto text,
       PRIMARY KEY (id)
       ) ENGINE = INNODB;

CREATE TABLE gvnews_img (
       id int(5) unsigned NOT NULL auto_increment,
       id_news int(5) unsigned NOT NULL,
       imagem text,
       PRIMARY KEY (id),
       INDEX (id_news),
       FOREIGN KEY (id_news) REFERENCES gvnews(id) ON DELETE CASCADE
       ) ENGINE = INNODB;

 

agora sim TEM que funcionar. até testei aqui

 

 

 

Ainda nada Evandro, ele deleta da tabela gvnews mas não da gvnews_im nem apaga as imagens da pasta. Vou postar como está o código da página para deletar os valores da tabela, se não for pedir demais, pode da uma verificada pra mim se está tudo certo? O bd alterei para esse último que você postou pra mim:

 


<?
include ("include/conecta.php");
require_once("verifica.php");

$id = $_GET["id"];

if($_GET["acao"] == excluir){

$consulta = mysql_query("SELECT * FROM gvnews_img WHERE id = '$id'");
$resultado = mysql_fetch_object($consulta);
$sql = "DELETE FROM gvnews WHERE id = '$id'";
$del = mysql_query($sql)or die(mysql_error());

if( $del ){
if(is_file('../' . $resultado->imagem)){
	unlink('../' . $resultado->imagem);
} 
}
}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http-~~-//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http-~~-//www.w3.org/1999/xhtml">

<script language=javascript>
function abrir (URL){
  window.open(URL,"janela1","width=450,height=500,left=400,top=200,scrollbars=YES")
}
</script>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<title>Untitled Document</title>
</head>

<body>
<table width="600" border="0" cellspacing="0" cellpadding="0">
 <tr>
   <td> </td>
 </tr>
 <tr>
   <td><table width="600" border="0" cellspacing="0" cellpadding="0">
	  <?
$dados = mysql_query("SELECT * FROM gvnews ORDER BY data DESC");
$conta = mysql_num_rows($dados);
	if($conta == "0"){
		echo "Sem noticias cadastradas";
} else {
?>
     <tr>
       <td width="47">ID</td>
       <td width="80">Data</td>
       <td width="338">Titulo</td>
       <td width="135">Status</td>
       </tr>
	  <?
while($linha=mysql_fetch_array($dados)){

$id = $linha["id"];
$titulo = $linha["titulo"];
$data = $linha["data"];
$imagem = $linha["imagem"];

$data_explode = explode('-',$data);// Remove a / da variavel data
$data_explode[0];// Exibe somente o dia da data
$data_explode[1];// Exibe somente o mes da data
$data_explode[2];// Exibe somente o ano da data
$data_formatada = $data_explode[2]."/".$data_explode[1]."/".$data_explode[0];

?>
     <tr>
       <td><? echo "$id" ?></td>
       <td><? echo "$data_formatada" ?></td>
       <td><? echo "$titulo" ?></td>
       <td><table width="100" border="0" cellspacing="0" cellpadding="0">
         <tr>
           <td> </td>
           <td> </td>
           <td> </td>
           </tr>
         <tr>
           <td><a href="javascript:abrir('gvnews_view.php?id=<?php echo "$id"; ?>')">Visualizar</a></td>
           <td><a href="?cat=gvnews⊂=editar&id=<?php echo "$id"; ?>">Editar</a></td>
           <td><a href="?cat=gvnews&acao=excluir&id=<?php echo "$id"; ?>">Excluir</a></td>
           </tr>
       </table></td>
       </tr>
     <tr>
       <td> </td>
       <td> </td>
       <td> </td>
       <td> </td>
       </tr>
<?
}
}
?>
   </table></td>
 </tr>
</table>
</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

feita com o seu próprio código

 

http://www.youtube.com/watch?v=l3ZqB39j05U

 

 

Ok, o valor do ID já está pré definido como 1 no seu exemplo, mas e se você tem 4 noticias, com 3 imagens cadastradas em cada e quer deletar a noticia com ID 3. Pelo código que estou usando pode ver que passo essa id pelo link e depois é feito um GET para excluir exatamente a que quero. É isso que não consegui fazer, consegui apenas fazer depois que alterei para o código que estou postando abaixo, talvés destrui toda a funcionabilidade do BD que você fez, mas foi o unico jeito que consegui fazer funcionar. Outro problema que surgiu, é para excluir as imagens que estão no servidor relacionados com o registro selecionado para exclusão. UMA imagem ele exclui, mas as outras não. Dei uma reduzida no código para ficar só a lógica mesmo, o resto era desnecessário para o fórum. Uma coisa que notei, aind sobre excluir do BD os registro, é que estou passando pelo link o id apenas do gvnews, mas pelo seu exemplo no vídeo, excluindo a id do gvnews já provoca a cascata nas tabelas, então to mais perdido que cego em tiroteio hehehehe

 


<?
include ("include/conecta.php");
require_once("verifica.php");

	$id = $_GET["id"];

	if($_GET["acao"] == excluir){

	$consulta = mysql_query("SELECT * FROM gvnews_img WHERE id_news = $id");
	$resultado = mysql_fetch_object($consulta);
	$sql = "DELETE gvnews,gvnews_img FROM gvnews INNER JOIN gvnews_img WHERE gvnews.id=$id AND gvnews_img.id_news=$id";
	$del = mysql_query($sql)or die(mysql_error());
	
	if( $del ){
	if(is_file($resultado->imagem)){
		unlink($resultado->imagem);
	} 
	}
	}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<title>Untitled Document</title>
</head>

<body>
<table width="600" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td><table width="182" border="0" cellspacing="0" cellpadding="0">
		  <?
	$dados = mysql_query("SELECT * FROM gvnews ORDER BY data DESC");
	$conta = mysql_num_rows($dados);
		if($conta == "0"){
			echo "Sem noticias cadastradas";
	} else {
	?>
      <tr>
        <td width="47">ID</td>
        <td width="135">Status</td>
        </tr>
		  <?
	while($linha=mysql_fetch_array($dados)){
	$id = $linha["id"];
	?>
      <tr>
        <td><? echo "$id" ?></td>
        <td><a href="?cat=gvnews&acao=excluir&id=<?php echo $id; ?>">Excluir</a></td>
        </tr>
	<?
	}
	}
	?>
    </table></td>
  </tr>
</table>
</body>
</html>

 

Deve ser o mesmo sistema do adicionar multiplas imagens utilizando loop, mas não estou achando a lógica novamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

RESOLVIDO

 

 

<?
include ("include/conecta.php");
require_once("verifica.php");

	$id = $_GET["id"];

	if($_GET["acao"] == excluir){

	$consulta = mysql_query("SELECT * FROM gvnews_img WHERE id_news = $id");
	while($resultado = mysql_fetch_object($consulta)){
	unlink($resultado->imagem);
	}
	$sql = "DELETE gvnews,gvnews_img FROM gvnews INNER JOIN gvnews_img WHERE gvnews.id=$id AND gvnews_img.id_news=$id";
	$del = mysql_query($sql)or die(mysql_error());
	}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.