Ir para conteúdo

POWERED BY:

Arquivado

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

Daniel Filho

[Resolvido] Deletando registros através de uma lista

Recommended Posts

Estou fazendo um simples sistema de notícia em PHP, com o intuito de aprender.

 

Pois bem, já consegui montar o banco de dados e fazer o script que adicionasse as notícias nele. Assim como também já consegui fazer a recuperação das notícias em uma outra página.

 

O problema agora, é que eu estou tentando criar um "painel", onde sejam exibidos os títulos das notícias (de todas ja inseridas no banco de dados) e com cada uma, a opção de deletá-la.

 

Acho qeu já cheguei bem perto.

 

Deem uma olhada no código, eu comentei ele todo para que vocês possam me entender melhor.

 

<?php
 include "conexao.php"; //Faz a conexão com o banco de dados
 $exibir_sql = mysql_query("SELECT titulo FROM noticia ORDER BY id DESC"); //Busca os títulos das notícias ja registradas para exibi-las
 $exibir_id = mysql_query("SELECT id FROM noticia"); //Busca a id das notícias ja registradas para serem usadas na ação de deletar
 $linhas = mysql_num_rows($exibir_sql); //Determina o número de linhas para ser usada na lógica do loop
 for ($contador = 0; $contador<$linhas; $contador++) { // Início do loop
	 $titulo = mysql_result($exibir_sql, $contador, "titulo"); //Responsável por ordenar as notícias
	 $id = mysql_result($exibir_id, $contador, "id"); //Responsável por ordenar os ids
	 $deletar = mysql_query("DELETE FROM noticia WHERE id='$id'"); //Responsável por deletar os ids (aqui que está o problema)
	 echo "$titulo - <a href='del.php?id=\"$id\"'>REMOVER</a>"; //Exibi o título das notícias e a ação para deleta-la
	 echo "<br />"; //Quebra de linha para melhor organizar as notícias
 } //Fim do loop
 mysql_close($conexao); //Fecha a conexão com o banco de dados
 ?>

Então, os títulos são exibidos de forma correta, assim como a opção "REMOVER" também.

 

O problema é que quando eu clico em remover, a URL é carregada (com a id de cada notícia), porém, todos os registros do banco de dados são apagados.

 

Alguém pode me dar uma luz?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu costumo utilizar Query String para isso.

Dentro do loop (while) que mostra os títulos, coloco um link com a palavra excluir apontando para uma ação.

 

echo "<a href=\"?acao=excluir_noticia&id=$id\" OnClick=\"return confirm('Você confirma a exclusão da notícia?')\">EXCLUIR</a>";

Feito o link, crio a ação, que será responsável pela exclusão

 

if (isset ($_GET['acao'])) //se existir acao na url
{
 $acao = $_GET['acao']; //cria a variável com o nome de 'acao' com o valor dela
 if ($acao == "excluir_noticia") // testa se 'acao' é igual a excluir. Se for, é porque o usuário clicou em 'excluir'
 {
 include ('inc/conexao.php'); // conecta ao MySQL
 $sql = mysql_query("delete from noticias where id=".$_GET['id'].""); //deleta a linha em questão, pelo id da notícia
 if ($sql)
 { 
 echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;URL=editar_noticias.php\">"; // redireciona para a mesma página de exclusão, ou seja, 'atualiza' a página.
 }
 else
 {
 echo 'Erro ao executar SQL';
 }
 }
} 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, não tem parte que executa a remoção, estou tentando fazer tudo por ai!

 

 

O problema é que quando eu clico em remover, a URL é carregada (com a id de cada notícia), porém, todos os registros do banco de dados são apagados.

 

 

 

Contraditório. :blink:

 

Se não há exclusão, como os registros estão sendo removidos ao clicar no link?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, realmente pode ser contraditorio.

 

Mas é isso mesmo que acontece.

 

Acho que a linha $deletar = mysql_query("DELETE FROM noticia WHERE id='$id'"); está se encarregando de excluir tudo!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Claro que vai deletar tudo

 

 for ($contador = 0; $contador<$linhas; $contador++) { // Início do loop
         $titulo = mysql_result($exibir_sql, $contador, "titulo"); //Responsável por ordenar as notícias
         $id = mysql_result($exibir_id, $contador, "id"); //Responsável por ordenar os ids
         $deletar = mysql_query("DELETE FROM noticia WHERE id='$id'"); //Responsável por deletar os ids (aqui que está o problema)
         echo "$titulo - <a href='del.php?id=\"$id\"'>REMOVER</a>"; //Exibi o título das notícias e a ação para deleta-la
         echo "<br />"; //Quebra de linha para melhor organizar as notícias
 } //Fim do loop
No loop você exibe a listagem com a opção de remover e remove ao mesmo tempo.

Toda a noticia é removida e listada.

 

Remova o $deletar (assim você terá apenas a listagem com o link de remover) e olhe o código que o Renato passou.

Compartilhar este post


Link para o post
Compartilhar em outros sites

De fato, é o que o Skyo falou. Eu não havia visto o comando DELET ali.

 

Essa página del.php deveria apenas fazer a exclusão. Ou seja, haverá ua página para listar e outra só para remover. O DELET não pode ficar dentro de loop

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, eu entendi.

 

Só ainda me resta uma pequena dúvida.

 

O Beraldo falou que deve haver uma página para fazer a listagem e uma outra só com o script para fazer a operação de exclusão.

 

Bom, olhei o código do Renato e entendi. Mas como faço para a outra página que conterá o script de exclusão, seja ativada conforme eu clico para remover a notícia desejada?

 

Tipo, no formulário podemos definir uma página para rodar o script, através do action, assim como definir os nomes dos elementos do formulário que serão recuperados e recriados como variáveis.

 

Acho que deu pra especificar a dúvida!

 

Obrigado a todos pela ajuda dada até aqui!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Beraldo falou que deve haver uma página para fazer a listagem e uma outra só com o script para fazer a operação de exclusão.

 

Você pode até usar a mesma página, mas tem que fazer alguns IF's para verificar se a ação desejada é excluir. Para um iniciante, talvez usar páginas diferentes seja melhor.

 

 

Bom, olhei o código do Renato e entendi. Mas como faço para a outra página que conterá o script de exclusão, seja ativada conforme eu clico para remover a notícia desejada?

 

O link será deste tipo:

remover.php?id=5

 

 

nesse script remover.php, vocÊ pegará o ID da URL usando $_GET['id'].

 

Aí executa o comando DELETE usando esse valor no WHERE

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi, muito obrigado!

 

Eu coloquei na mesma página, mas entendi a situação se fosse diferente.

 

Agora, prometo que esta será minha última pergunta!

 

$sql = mysql_query("delete from noticias where id=".$_GET['id']."");

Na linha acima, porque concatenar $_GET['id']?

Compartilhar este post


Link para o post
Compartilhar em outros sites

pois $_GET é uma variável, e e aconselhável usar concatenação em vez de inserir variáveis dentro de strings.

 

Ou seja, prefira fazer isto:

 

echo "texto " . $var . " mais texto";

 

em vez de

 

echo "texto $var mais texto";

 

 

Deixa o código mais claro.

 

 

Mas cuidado ao inserir $_GET e $_POST diretamente na string. Há riscos de sql injection

pesquise por formas de filtragem de dados a fim de evitar sql injection

 

Basicamente, usar addslashes() resolve o problema. Há um tópico chamado Segurança em PHP, no fórum de Desafios, que trata sobre esse assunto

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok!

 

Vou pesquisar, muito orbigado pela ajuda!

 

Em breve creio que postarei mais tópicos ainda sobre este meu sistema de notícias!

 

Esse código que postei acima faz parte de um sistema de notícias que criei também com a ajuda do pessoal aqui do fórum. O pessoal é muito prestativo para nos ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse código que postei acima faz parte de um sistema de notícias que criei também com a ajuda do pessoal aqui do fórum. O pessoal é muito prestativo para nos ajudar.

Com certeza!

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.