Ir para conteúdo

POWERED BY:

Arquivado

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

Thiago Moraes

Apagar imagem

Recommended Posts

O registro da imagem é apagada do banco corretamente, mas unlink() não está apagando do diretório.

 

<?php 
	
	if ($totalImagens == 0) {
	
		echo "Nenhuma imagem encontrada";
		
		} else {
		
	while ($row_getImagens = mysql_fetch_array($getImagens)) {
	
	echo "<p><img src='../user/colecoes/imagens/" . $row_getImagens['imagem'] . "' /><br />" . $row_getImagens['titulo'] . "<br />" . $row_getImagens['descricao'] . "</p>";
	
	echo "<a href='index.php?pages=imagens&action=apagar&img_id=" . $row_getImagens['id'] . "'>Apagar</a>";
	
}

}	

  if (isset($_GET['action']) && $_GET['action'] == 'apagar') {
  $deleteSQL = sprintf("DELETE FROM imagens WHERE user_id=%s AND id=%s",
					   GetSQLValueString($getUserId, "int"),
                       GetSQLValueString($_GET['img_id'], "int"));

  mysql_select_db($database_dbconn, $dbconn);
  $Result1 = mysql_query($deleteSQL, $dbconn) or die(mysql_error());
  unlink("../user/colecoes/imagens/" . $row_getImagens['imagem']);
  header("Location: index.php?pages=imagens");
	
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

unlink("../user/colecoes/imagens/" . $row_getImagens['imagem']);

Não existe $row_getImagens['imagem'] no caso, ele existe dentro do laço que monta o link para apagar, uma solução é você passar o nome da imagem no link ou realizar uma consulta com o ID antes de apagar e usar isto no unlink.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use file_exists, is_writable e is_readable, para verificar se o caminho do arquivo está correto.

 

-----------------------

 

[Editado]

 

Adicione ao cabeçario do seu arquivo isso:

error_reporting(E_ALL|E_STRICT);

Aparentemente tem várias variáveis com falhas em seu código.

-----------------------

 

[Editado]

Antes que eu me esqueça, prefira caminho absoluto ao invés de relativo

Compartilhar este post


Link para o post
Compartilhar em outros sites

ESerra, quando vc diz passar o nome no link, vc sugere isso:

 

echo "<a href='index.php?pages=imagens&action=apagar&img_id=" . $row_getImagens['imagem'] . "'>Apagar</a>";

 

silverfox, acredito que o problema é o que foi mencionado pelo ESerra, mas não entendi como resolver

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use as funções que lhe passei e você irá identificar o erro.

 

--------------------

 

Editado:

 

(obs.: tem várias falhas no seu código, com error_reporting você vai "enxergar"), tente isto:

 

 

<?php 
error_reporting(E_ALL|E_STRICT);//Exibe todos erros em modo Strict
if ($totalImagens == 0) {


echo "Nenhuma imagem encontrada";


} else {


while ($row_getImagens = mysql_fetch_array($getImagens)) {


echo "<p><img src='../user/colecoes/imagens/" . $row_getImagens['imagem'] . "' /><br />" . $row_getImagens['titulo'] . "<br />" . $row_getImagens['descricao'] . "</p>";


echo "<a href='index.php?pages=imagens&action=apagar&img_id=" . $row_getImagens['id'] . "'>Apagar</a>";


}


}


if (isset($_GET['action']) && $_GET['action'] == 'apagar') {
if(!file_exists("../user/colecoes/imagens/" . $row_getImagens['imagem'])){
echo 'O arquivo "../user/colecoes/imagens/',$row_getImagens['imagem'],'" não existe';
} else if(!is_readable("../user/colecoes/imagens/" . $row_getImagens['imagem'])){
echo 'O arquivo "../user/colecoes/imagens/',$row_getImagens['imagem'],'" não pode ser visualizado';
} else if(!is_writable("../user/colecoes/imagens/" . $row_getImagens['imagem'])){
echo 'O arquivo "../user/colecoes/imagens/',$row_getImagens['imagem'],'" não pode ser escrito';
} else {
$deleteSQL = sprintf("DELETE FROM imagens WHERE user_id=%s AND id=%s",
  GetSQLValueString($getUserId, "int"),
  GetSQLValueString($_GET['img_id'], "int"));


  mysql_select_db($database_dbconn, $dbconn);
  $Result1 = mysql_query($deleteSQL, $dbconn) or die(mysql_error());
  unlink("../user/colecoes/imagens/" . $row_getImagens['imagem']);
   header("Location: index.php?pages=imagens");
}
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou tentar lhe explicar algumas falhas, acredito que você irá compreender:

Você está usando while para pegar a váriavel:

 


$row_getImagens['imagem']

Mas isso pode ocasionar um erro dentro da sua função deletar, já que a cada loop, a variavel recebe um novo valor.

 

Você está provavelmente usando mysql_select_db 2 vezes.

 

A ação apagar deveria vir antes do loop, pois se apagar depois do loop, ainda sim a imagem irá aparecer.

 

Como eu disse existem várias falhas. Espero que eu tenha lhe ajudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi a questão do loop, mas como eu posso resolver isso? eu preciso listar as imagens, e cada imagem vai ter o seu link pra apagar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, mais como eu posso fazer que a imagem correta seja apagada pelo unlink() ?



Consegui...

 

<?php 

  if (isset($_GET['action']) && ($_GET['action'] == 'apagar')) {
  
  $imagem_query = sprintf("SELECT imagem FROM `imagens` WHERE user_id=%s AND id=%s",
  GetSQLValueString($getUserId, "int"), GetSQLValueString($_GET['img_id'], "int")); 
   
  $apaga = mysql_query($imagem_query, $dbconn) or die(mysql_error());
  $row_user = mysql_fetch_assoc($apaga);
  
  $imagem = $row_user['imagem'];
  
  $deleteSQL = sprintf("DELETE FROM imagens WHERE user_id=%s AND id=%s",
					   GetSQLValueString($getUserId, "int"),
                       GetSQLValueString($_GET['img_id'], "int"));

  mysql_select_db($database_dbconn, $dbconn);
  $Result1 = mysql_query($deleteSQL, $dbconn) or die(mysql_error());
  unlink("../user/colecoes/imagens/".$imagem);
  header("Location: index.php?pages=imagens");
	
}

	if ($totalImagens == 0) {
	
		echo "Nenhuma imagem encontrada";
		
		} else {
		
	while ($row_getImagens = mysql_fetch_array($getImagens)) {
	
	echo "<p><img src='../user/colecoes/imagens/" . $row_getImagens['imagem'] . "' width='200' height='auto' /><br />" . $row_getImagens['titulo'] . "<br />" . $row_getImagens['descricao'] . "</p>";
	
	echo "<a href='index.php?pages=imagens&action=apagar&img_id=" . $row_getImagens['id'] . "'>Apagar</a>";
	
}

}	

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use:


echo "<a href='index.php?pages=imagens&action=apagar&img_id=" . $row_getImagens['id'] . "&imagem=".$row_getImagens['imagem']."'>Apagar</a>";

Na hora de apagar basta resgatar o nome usando $_GET['imagem'];

 

Caso o nome tenha caracteres especiais use urlencode também.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara pode ser o header que atrapalha de você ver o erro:

 

Tente assim:

 

 

<?php 
error_reporting(E_ALL|E_STRICT);//Exibe todos erros em modo Strict


if ($totalImagens == 0) {




echo "Nenhuma imagem encontrada";




} else {




while ($row_getImagens = mysql_fetch_array($getImagens)) {




echo "<p><img src='../user/colecoes/imagens/" . $row_getImagens['imagem'] . "' /><br />" . $row_getImagens['titulo'] . "<br />" . $row_getImagens['descricao'] . "</p>";




echo "<a href='index.php?pages=imagens&action=apagar&img_id=" . $row_getImagens['id'] . "'>Apagar</a>";




}




}




if (isset($_GET['action']) && $_GET['action'] == 'apagar') {
if(!file_exists("../user/colecoes/imagens/" . $row_getImagens['imagem'])){
echo 'O arquivo "../user/colecoes/imagens/',$row_getImagens['imagem'],'" não existe';
} else if(!is_readable("../user/colecoes/imagens/" . $row_getImagens['imagem'])){
echo 'O arquivo "../user/colecoes/imagens/',$row_getImagens['imagem'],'" não pode ser visualizado';
} else if(!is_writable("../user/colecoes/imagens/" . $row_getImagens['imagem'])){
echo 'O arquivo "../user/colecoes/imagens/',$row_getImagens['imagem'],'" não pode ser escrito';
} else {
$deleteSQL = sprintf("DELETE FROM imagens WHERE user_id=%s AND id=%s",
GetSQLValueString($getUserId, "int"),
GetSQLValueString($_GET['img_id'], "int"));




mysql_select_db($database_dbconn, $dbconn);
$Result1 = mysql_query($deleteSQL, $dbconn) or die(mysql_error());
unlink("../user/colecoes/imagens/" . $row_getImagens['imagem']);
//header("Location: index.php?pages=imagens"); //header bloqueado
echo 'O arquivo "../user/colecoes/imagens/',$row_getImagens['imagem'],'" foi apagado com sucesso!';
}
}
?>

 

--------------------------

Editado:

 

Use:


echo "<a href='index.php?pages=imagens&action=apagar&img_id=" . $row_getImagens['id'] . "&imagem=".$row_getImagens['imagem']."'>Apagar</a>";

Na hora de apagar basta resgatar o nome usando $_GET['imagem'];

 

Caso o nome tenha caracteres especiais use urlencode também.

 

Não use isso, é de péssima segurança.

Compartilhar este post


Link para o post
Compartilhar em outros sites

silverfox, não existe erro no arquivo, ele existe, pode ser escrito e alterado, o diretório está ok tbm. Da uma olhada no post #10 e me fala se a minha solução é a mais apropriada. Pelo menos ta funcionando.

 

Obrigado pelas sugestões.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você viu que no post#12 eu mudei umas coisas no código? Provavelmente não. Teste ele por favor, o que eu acho é que o seu código está "sem logica", causando inúmeros erros de lógica e não de execução.

 

Nesse código eu removi o header e adicionei um "echo". Assim que você testar, você irá conseguir entender.

 

Sobre o seu código no post#10, ele está parcialmente correto, mas procure usar mais IFS para verificar as falhas antes de tentar uma execução, por exemplo:

 

 


 

if(($row_user = mysql_fetch_assoc($apaga))){
//resto do seu código aqui dentro
} else {
echo 'falhou!';
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • provavelmente Mysql_select_db 2 veses.
  • Falta de IFS para verificar erros
  • ordem de execuções incorretas.

Teste o código que lhe passei no poste #12. Eu bloquei o header e adicionei um echo, veja o que aparece nesse último echo pelo navegador:

 

echo 'O arquivo "../user/colecoes/imagens/',$row_getImagens['imagem'],'" foi apagado com sucesso!';

 

Não se ofenda com os meus comentários, só estou tentando lhe ajudar, ok? Eu poderia lhe dar a resposta pronta, mas me lembrei de um antigo ditado aqui no forum:

 

 

não dou o peixe ensino a pescar

 

silverfox, não existe erro no arquivo, ele existe, pode ser escrito e alterado, o diretório está ok tbm. Da uma olhada no post #10 e me fala se a minha solução é a mais apropriada. Pelo menos ta funcionando.

 

Obrigado pelas sugestões.

Levando em consideração que o seu código funciona agora, mesmo com as outras falhas. Acredito que mudar a ordem do loop e da ação foi pela minha explicação, o que quer dizer que eu provavelmente esteja certo sobre os outros pontos falhos, concorda?

Entenda eu só queria lhe ajudar.

 

Fico feliz que tenha conseguido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pq me sentiria ofendido? se estivesse tudo certo eu não postaria aqui no fórum pedindo ajuda. Pelo contrário, se existe erros no código eu sou o maior beneficiado em ficar sabendo.

 

Vamos lá, testando o código que vc postou o resultado foi o mesmo de antes, apagou o registro do banco mas não o arquivo e imprimiu a mesagem na tela "O arquivo "../user/colecoes/imagens/" foi apagado com sucesso!"

 

E apareceu uma mensagem de erro referente ao unlink(), ja citado no início do tópico.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então parabéns, você encontrou o erro:

"O arquivo "../user/colecoes/imagens/" foi apagado com sucesso!"

 

Não aparece o nome do arquivo, só nome da pasta (o que eu já havia percebido e estava tentando lhe explicar).

O seja a lógica estava errada.

 

O que você precisa saber[editado]:

  • Para a ação deletar use uma query (me refiro ao SELECT * FROM) separada para resgatar o caminho do arquivo.
  • Sempre use ifs (tanto para mysql_query quanto para mysql_fetch_array)
  • Em arquivos sempre deixe as ações em primeiro (como deletar, upload, write, etc).
  • Nunca resgate valores de loops (a não ser que você tenha muita confiança no que fez), faça algo isolado.
  • Use caminhos absolutos e não relativos.
  • Sempre use IFS com unlink, is_file, file_exists, para trabalhar com arquivos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, não aparece o nome do arquivo pelo motivo postado já no post #2.

 

 

unlink("../user/colecoes/imagens/" . $row_getImagens['imagem']);

Não existe $row_getImagens['imagem'] no caso, ele existe dentro do laço que monta o link para apagar, uma solução é você passar o nome da imagem no link ou realizar uma consulta com o ID antes de apagar e usar isto no unlink.

 

 

Eu só demorei pra entender a solução "...realizar uma consulta com o ID antes de apagar e usar isto no unlink."

 

 

 

O que você precisa saber[editado]:

  • Para a ação deletar use uma query (me refiro ao SELECT * FROM) separada para resgatar o caminho do arquivo.
  • Sempre use ifs (tanto para mysql_query quanto para mysql_fetch_array)

  • Em arquivos sempre deixe as ações em primeiro (como deletar, upload, write, etc).

  • Nunca resgate valores de loops (a não ser que você tenha muita confiança no que fez), faça algo isolado.

  • Use caminhos absolutos e não relativos.

  • Sempre use IFS com unlink, is_file, file_exists, para trabalhar com arquivos.

 

Se vc tivesse postado isso antes, teria economizado alguns posts.

 

Enfim, obrigado pela ajuda, vou seguir essas recomendações :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu só demorei pra entender a solução "...realizar uma consulta com o ID antes de apagar e usar isto no unlink."

 

Sim essa é apenas uma parte, não é só separadamente, mas também fazer as ações separadamente.

 

Boa sorte e bom trabalho.

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.