Ir para o conteúdo
xaboto

[Resolvido] Apagar pasta dentro do servidor

Mensagens Recomendadas

xaboto    0
xaboto

Depois de conseguir criar um formulario para introduzir novas categorias na base de dados e suas respetivas pastas dentro do servidor (o topico encontra-se aqui), venho agora aqui com duvidas na parte de apaga-las.

O formulario apenas pede para selecionar a categoria a apagar que irá processar este ficheiro php:

<?php

$Categoria= $_POST['DelCategoria'];
include 'ligarbd.php';
header ('Content-type: text/html; charset=utf-8');


// sql para apagar no servidor
$sql1="SELECT caminho FROM categorias WHERE CodCategoria=$Categoria";

//sql para apagar na base de dados
$sql2="DELETE FROM categorias WHERE CodCategoria=$Categoria";

//sql para complementar mensagens de erro
$sql3="SELECT nomeCategoria FROM categorias WHERE CodCategoria=$Categoria";

//pesquisa na base de dados do caminho da pasta para apaga-la posteriormente no servidor
if($query1=mysql_query($sql1)){
$name1 = mysql_fetch_array($query1);
$caminho= $name1[0];

//pesquisa na base de dados para apagar categoria e (&&) comando para apagar categoria no servidor
if($query2= mysql_query($sql2) && rmdir("$caminho")) {
echo 'Categoria eliminada com sucesso';
mysql_close($conexao);
header ('Location:index.php');
exit;
}

//mensagem de erro de apagar a categoria na base de dados e no servidor
else{
if($query3=mysql_query($sql3)){
$name2 = mysql_fetch_array($query3);
$nomepasta= $name2[0];
echo'Erro: a ligação à base de dados, para eliminar a pasta '.$nomepasta.' , poderá estar com problemas ou o acesso ao servidor para efetuar a sua eliminação não foi possível.
<p>Contacte a equipa de suporte<br>ou<br>Clique <a href="index.php">aqui</a> para voltar ao início e tente novamente.</p>';
}

else
echo 'Erro: a ligação à base de dados, para eliminar a pasta, poderá estar com problemas ou o acesso ao servidor para efetuar a sua eliminação não foi possível.
<p>Contacte a equipa de suporte<br>ou<br>Clique <a href="index.php">aqui</a> para voltar ao início e tente novamente.</p>';
}

}

//mensagem de erro da pesquisa pelo caminho da categoria no servidor
else{
if($query4=mysql_query($sql3)){
$name3 = mysql_fetch_array($query3);
$nomepasta1= $name3[0];
echo'A ligação à base de dados, para obter o caminho da pasta '.$nomepasta1.' a eliminar no servidor, poderá estar com problemas.
<p>Contacte a equipa de suporte<br>ou<br>Clique <a href="index.php">aqui</a> para voltar ao início e tente novamente.</p>';
}
else
echo 'A ligação à base de dados, para obter o caminho da pasta a eliminar no servidor, poderá estar com problemas.
<p>Contacte a equipa de suporte<br>ou<br>Clique <a href="index.php">aqui</a> para voltar ao início e tente novamente.</p>';
}


?>

O código funciona todo, ou seja, apaga a categoria na base de dados e a pasta no servidor, o problema é quando meto uma imagem dentro de uma pasta e mando apaga-la (a pasta com a imagem la dentro). A categoria é apagada na base de dados e não me apaga no servidor se tiver uma imagem la dentro, o que é estranho porque o if só deveria funcionar se as duas ações fossem feitas com sucesso. Depois aparece-me a mensagem de erro que está no else. Alguma sugestão para conseguir apagar a pasta com conteudo la dentro (as pastas só irão possuir imagens do tipo jpg, png e jpeg e tambem gifs)?

Editado por apocsantos
geshi

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bioshock    169
bioshock

Primeiro precisas de eliminar todos os ficheiros dentro da pasta e só depois eliminar a pasta.

Experimenta assim:

array_map('unlink', glob($caminho . '/*.*'));
rmdir($caminho);

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
xaboto    0
xaboto

Primeiro precisas de eliminar todos os ficheiros dentro da pasta e só depois eliminar a pasta.

Experimenta assim:

array_map('unlink', glob($caminho . '/*.*'));
rmdir($caminho);

É mesmo isso, pode parecer fácil mas para mim como ainda não estou familiarizado com php pensei que fosse um problema que desse mais trabalho.

Primeiramente, dê permissão chmod na pasta principal 777

base/pasta_a_ser_deletada/

No caso, base tem que ter permissão 777

Depois, chame a função desse post http://www.codigosnaweb.com/forum/Script-para-deletar-diretorio-ou-o-que-tem-dentro_1_289.html

Teste o funcionamento antes de aplicar ao seu sistema.

Obrigado pela resposta mas a solução do bioshock é bem mais simples e para mim é melhor dado que como amador, quanto menos código para eu perceber melhor :D

Mas continua a fazer jeito essa solução. É sempre bom saber que para um objetivo existem varios meios.

Só gostava de esclarecer aqui mais um assunto. Quanto eu faço aquele if:

if($query2= mysql_query($sql2) && array_map('unlink', glob($caminho . '/*.*')) && rmdir("$caminho"))

O que me estava a acontecer era: a primeira função ele conseguiu fazer que foi apagar o registo da categoria na base de dados, mas depois não deu para apagar a categoria e ele foi para o else visto que o if nao foi concretizado com sucesso. Com isto fiquei sem a categoria na base de dados, mas com a pasta e imagens no servidor por apagar. O que eu queria saber era se existe alguma função que verifique primeiro se estes três comandos (apagar na base de dados, apagar ficheiros e depois a pasta) podem, naquele momento, ser executados todos com sucesso e depois sim desta verificação, executa-los para evitar que alguma coisa fique por apagar. Espero que me tenha feito entender.

Editado por xaboto

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Devexz    47
Devexz

Teoricamente o array_map vai apagar todos os ficheiros dentro da pasta.

Sendo assim, primeiro apagas os ficheiros e depois fazes rmdir e vês o valor retornado, se for true então podes executar a query.

Se por alguma razão a pasta não for apagada, não corres o risco de executar a query.

Algo deste género:


.... bla bla bla ...

//apagar ficheiros dentro da pasta
array_map('unlink', glob($caminho . '/*.*'));

//se a pasta for apagada e a query for executada com êxito
if($query2= mysql_query($sql2) && rmdir("$caminho")) { 
//yes!
}

... bla bla bla ...

Editado por Devexz

Ás vezes, mais vale deixar a assinatura em branco.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
xaboto    0
xaboto

Teoricamente o array_map vai apagar todos os ficheiros dentro da pasta.

Sendo assim, primeiro apagas os ficheiros e depois fazes rmdir e vês o valor retornado, se for true então podes executar a query.

Se por alguma razão a pasta não for apagada, não corres o risco de executar a query.

Algo deste género:


.... bla bla bla ...

//apagar ficheiros dentro da pasta
array_map('unlink', glob($caminho . '/*.*'));

//se a pasta for apagada e a query for executada com êxito
if($query2= mysql_query($sql2) && rmdir("$caminho")) {
//yes!
}

... bla bla bla ...

E é o que eu tenho, pus os tres comandos dentro do if até.

if($query2= mysql_query($sql2) && array_map('unlink', glob($caminho . '/*.*')) && rmdir("$caminho"))

O problema é que, pelo que percebi, ele ao testar o if também começa logo a fazer os comandos , ou seja, se o ultimo comando do if nao funcionar por qualquer razão, os outros dois comandos atrás que funcionaram ficam feitos, ficando assim com a eliminação da categoria incompleta e não é o que eu quero. Ou ele faz tudo ou não faz nada e mostra-me a mensagem de erro.

Editado por xaboto

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

não é o que eu quero. Ou ele faz tudo ou não faz nada e mostra-me a mensagem de erro.

em operações de destruição, o que pretendes é quase impossível.

tens sempre de compremeter algo.

o que podes fazer seria:

- verificar se a categoria existe na base de dados, se existe, então a probabilidade de problemas na remoção serão reduzidas.

- se a categoria existir, mover a pasta para um local temporário. este processo de mover a pasta indica duas coisas

> indica que podes apagar sem problemas de permissões

> removes a pasta do local de "produção", sem perder a informação

- se consegiste mover a pasta, então é assumido a catagoria como "removida" mesmo que exista algum erro (que neste momento podemos assumir que a sua probabilidade será reduzida)

> então podes apagar a pasta e executar o comando de SQL, se der erro, crias um log ou manda um email a pedir a interveção de um administrador para limpeza manual

- se não conseguiste mover a pasta, terás a informação na base de dados ainda existente e a pasta no local correcto, e envias para o log ou mandas um email para um administrador verificar o erro


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
xaboto    0
xaboto

em operações de destruição, o que pretendes é quase impossível.

tens sempre de compremeter algo.

o que podes fazer seria:

- verificar se a categoria existe na base de dados, se existe, então a probabilidade de problemas na remoção serão reduzidas.

- se a categoria existir, mover a pasta para um local temporário. este processo de mover a pasta indica duas coisas

> indica que podes apagar sem problemas de permissões

> removes a pasta do local de "produção", sem perder a informação

- se consegiste mover a pasta, então é assumido a catagoria como "removida" mesmo que exista algum erro (que neste momento podemos assumir que a sua probabilidade será reduzida)

> então podes apagar a pasta e executar o comando de SQL, se der erro, crias um log ou manda um email a pedir a interveção de um administrador para limpeza manual

- se não conseguiste mover a pasta, terás a informação na base de dados ainda existente e a pasta no local correcto, e envias para o log ou mandas um email para um administrador verificar o erro

A categoria sempre existirá porque eu no form da eliminação de categorias estou a fazer um select na base de dados para só mostrar como opção de escolha ao utilizador as categorias que existem. Os erros que poderão acontecer (penso eu sem certezas do que estou a dizer) será na ligação à base de dados, mas ai não há problema porque como a eliminação na base de dados é o primeiro comando a ser executado no if ele passa logo para o else para mostrar a mensagem de erro e tudo estará bem.

Acho que só tenho de ter cuidado é se a pasta tem ou não imagens lá dentro para saber se executo ou não o comando para apagar os ficheiros. Depois desta verificação mando então apagar a pasta. Acho que com esta estrutura não terei problemas. Vou testar

Editado por xaboto

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.