Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

rickygac

[Resolvido] Elimina da base de dados mas mantem imagem no servidor :(

Mensagens Recomendadas

rickygac

tenho um ficheiro que envia um form para a base de dados e codifica a imagem com $hex_string = base64_encode($bin_string);

depois tenho um php para eliminar a entrada da base de dados caso queira, mas acontece que ele elimina da base de dados mas deixa a imagem no servidor e quero que ele ao eliminar da base de dados remova tambem a imagem para nao ocupar espaço no servidor. Como posso alterar o código pra fazer isso?

o código é este:

<?php

// liga-se à base de dados

include('ligar-bd.php');

// confirma se a variável "id" está selecionada

if (isset($_GET['id']) && is_numeric($_GET['id'])){

// pega na variável "id" da URL

$id = $_GET['id'];

// apaga a entrada da base de dados

if ($stmt = $mysqli->prepare("DELETE FROM teste WHERE id = ? LIMIT 1")){

$stmt->bind_param("i",$id);

$stmt->execute();

$stmt->close();

}else{

echo "ERRO: Impossível preparar corrétamente o SQL.";

}

$mysqli->close();

// redireciona após ter eliminado com sucesso

header("Location: ver_todos.php");

}else{

header("Location: ver_todos.php");

}

?>


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

nao sei fazer isso... é possivel inserires isso no codigo acima?


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

nao estou a conseguir :/ como raio sei eu o nome do ficheiro? o script devia saber que é o ficheiro correspondente aquele id

<?php

// liga-se à base de dados

include('ligar-bd.php');

// confirma se a variável "id" está selecionada

if (isset($_GET['id']) && is_numeric($_GET['id'])){

// pega na variável "id" da URL

$id = $_GET['id'];

// apaga a entrada da base de dados

if ($stmt = $mysqli->prepare("DELETE FROM teste WHERE id = ? LIMIT 1")){

unlink(caminhoENomeDoFicheiro);

$stmt->bind_param("i",$id);

$stmt->execute();

$stmt->close();

}else{

echo "ERRO: Impossível eliminar.";

}

$mysqli->close();

// redireciona após ter eliminado com sucesso

header("Location: ver_todos.php");

}else{

header("Location: ver_todos.php");

}

?>

Editado por rickygac

Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
acao

boas deve ser colocado aqui.

// apaga a entrada da base de dados
if ($stmt = $mysqli->prepare("DELETE FROM teste WHERE id = ? LIMIT 1")){
$stmt->bind_param("i",$id);
$stmt->execute();
$stmt->close();
// unlink(caminhoENomeDoFicheiro);
}else{
echo "ERRO: Impossível eliminar.";
}
agora caminho e nome do ficheiro tu é que sabes aonde o gravas-te, deves fazer uma select á base de dados para o retornar.

deves também verificar se o ficheiro existe:

http://php.net/manual/pt_BR/function.file-exists.php

cumps

acao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac
<?php

// liga-se à base de dados

include('ligar-bd.php');

// confirma se a variável "id" está selecionada

if (isset($_GET['id']) && is_numeric($_GET['id'])){

// pega na variável "id" da URL

$id = $_GET['id'];

$imagem = $_GET['imagem'];

// apaga a entrada da base de dados

if ($stmt = $mysqli->prepare("DELETE FROM teste WHERE id = ? LIMIT 1")){

$stmt->bind_param("i",$id);

$stmt->execute();

// DEVERIA PEGAR NO NOME GUARDADO EM base64 NO BANCO NO CAMPO "imagem", CONVERTER NO NOME REAL DA IMAGEM E INSERIR NO UNLINK ESSE NOME

unlink($imagem);

$stmt->close();

}else{

echo "ERRO: Impossível eliminar.";

}

$mysqli->close();

// redireciona após ter eliminado com sucesso

header("Location: ver_todos.php");

}else{

header("Location: ver_todos.php");

}

?>

 


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
acao

boas, não é necessário descodificar, o que é necessário é pegar o nome conforme foi guardado, é idêntico á situação de amostrar a imagem.

cumps

acao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

boas, não é necessário descodificar, o que é necessário é pegar o nome conforme foi guardado, é idêntico á situação de amostrar a imagem.

cumps

acao

tou a ver... mas ja tentei mil e uma maneiras e nao estou a conseguir, dá para ajudar no código?


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac
Em 4/8/2016 às 18:50, acao disse:

boas

amostra cod de como colocas as imagens no browser, a consulta à base de dados.

cumps

acao

<?php

// LIGA-SE À BASE DE DADOS

include('ligar-bd.php');

// INFORMA QUE VAI USAR UTF8 AO GRAVAR NA BASE DE DADOS

$mysqli->set_charset('utf8');

// SE FOR PEDIDO UMA CONSULTA

if(!$_GET[getfile]){

// SE ELA NÃO EXISTIR MOSTRA A MENSAGEM DE ERRO

if ($_FILES["file"]["error"] > 0){

echo "Ups... falha no envio, tente novamente. ERRO: " . $_FILES["file"]["error"] . "<br>";

}else{

// TRATAMENTO E CODIFICAÇÃO DAS IMAGENS

move_uploaded_file($_FILES["file"]["tmp_name"], $_FILES["file"]["name"]);

$bin_string = file_get_contents($_FILES["file"]["name"]);

$hex_string = base64_encode($bin_string);

// OPÇÕES DO FORMULÁRIO

$nome = filter_var($_POST['nome'], FILTER_SANITIZE_STRING);

$categoria = filter_var($_POST['categoria'], FILTER_SANITIZE_STRING);

// INSERE NA BASE DE DADOS

$mysqli->query(" INSERT INTO teste(

imagem,

nome,

categoria

) VALUES (

'" . $hex_string . "',

'$nome',

'$categoria'

) ");

}

}else{

// SELECIONA NA BASE DE DADOS A ÚLTIMA ENTRADA

if ($result = $mysqli->query(" SELECT * FROM teste ORDER BY id DESC ")){

if($row = $result->fetch_assoc()){

$output_hex_string = $row["imagem"];

$output_bin_string = base64_decode($output_hex_string);

header("Content-Type: image/png");

header("Content-Length: " . strlen($output_bin_string));

// MOSTRA A ÚLTIMA ENTRADA

$result->free();

echo $output_bin_string;

}

}

}

include "ultimo_envio.php";

?>

 


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
acao

boas

// SELECIONA NA BASE DE DADOS A ÚLTIMA ENTRADA
if ($result = $mysqli->query(" SELECT * FROM teste ORDER BY id DESC ")){

	 if($row = $result->fetch_assoc()){
				 $output_hex_string = $row["imagem"];
				 $id = $row["id"];
	}
}

// apaga a entrada da base de dados
if ($stmt = $mysqli->prepare("DELETE FROM teste WHERE id = ? LIMIT 1")){
	  $stmt->bind_param("i",$id);
	  $stmt->execute();

		  // DEVERIA PEGAR NO NOME GUARDADO EM base64 NO BANCO NO CAMPO "imagem", CONVERTER NO NOME REAL DA		  IMAGEM E INSERIR NO UNLINK ESSE NOME
	 unlink($row["imagem"]);

	$stmt->close();
}else{
	 echo "ERRO: Impossível eliminar.";
}

,não testei, mas +- isto, na tua consulta adicionei o campo id para para depois deletar o id consultado e eliminar a imagem correspondente.

cumps

acao

Editado por acao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

boas

// SELECIONA NA BASE DE DADOS A ÚLTIMA ENTRADA
if ($result = $mysqli->query(" SELECT * FROM id, teste ORDER BY id DESC ")){

	 if($row = $result->fetch_assoc()){
				 $output_hex_string = $row["imagem"];
				 $id = $row["id"];
	}
}

// apaga a entrada da base de dados
if ($stmt = $mysqli->prepare("DELETE FROM teste WHERE id = ? LIMIT 1")){
	  $stmt->bind_param("i",$id);
	  $stmt->execute();

		  // DEVERIA PEGAR NO NOME GUARDADO EM base64 NO BANCO NO CAMPO "imagem", CONVERTER NO NOME REAL DA		  IMAGEM E INSERIR NO UNLINK ESSE NOME
	 unlink($row["imagem"]);

	$stmt->close();
}else{
	 echo "ERRO: Impossível eliminar.";
}

,não testei, mas +- isto, na tua consulta adicionei o campo id para para depois deletar o id consultado e eliminar a imagem correspondente.

cumps

acao

com este codigo que é o que tenho9 atualmente:

<?php

// liga-se à base de dados

include('ligar-bd.php');

// confirma se a variável "id" está selecionada

if (isset($_GET['id']) && is_numeric($_GET['id'])){

// pega na variável "id" da URL

$id = $_GET['id'];

$imagem = $_GET['imagem'];

// SELECIONA NA BASE DE DADOS A ÚLTIMA ENTRADA

if ($result = $mysqli->query(" SELECT * FROM id, teste ORDER BY id DESC ")){

if($row = $result->fetch_assoc()){

$output_hex_string = $row["imagem"];

$id = $row["id"];

}

}

// apaga a entrada da base de dados

if ($stmt = $mysqli->prepare("DELETE FROM teste WHERE id = ? LIMIT 1")){

$stmt->bind_param("i",$id);

$stmt->execute();

unlink($row["imagem"]);

$stmt->close();

}else{

echo "ERRO: Impossível eliminar.";

}

$mysqli->close();

// redireciona após ter eliminado com sucesso

header("Location: ver_todos.php");

}else{

header("Location: ver_todos.php");

}

?>

dá erro... repara nos erros:

Warning: unlink() [function.unlink]: No such file or directory in /teste/apagar.php on line 25

Warning: Cannot modify header information - headers already sent by (output started at /home/rpublici/public_html/teste/apagar.php:25) in /apagar.php on line 34

mas reparei que tinhas uma função mal no select, tinhas o id ao lado da tabela, ou seja como se fosse tambem uma tabela, removi isso mas agora da o erro:

Warning: unlink(/9j/4gIcSUNDX1BST0ZJTEUAAQEAAAIMbGNtcwIQAABtbnRyUkdCIFhZWiAH3AABABkAAwApADlhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApkZXNjAAAA/AAAAF5jcHJ0AAABXAAAAAt3dHB0AAABaAAAABRia3B0AAABfAAAABRyWFlaAAABkAAAABRnWFlaAAABpAAAABRiWFlaAAABuAAAABRyVFJDAAABzAAAAEBnVFJDAAABzAAAAEBiVFJDAAABzAAAAEBkZXNjAAAAAAAAAANjMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAAAEZCAABYWVogAAAAAAAA9tYAAQAAAADTLVhZWiAAAAAAAAADFgAAAzMAAAKkWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPY3VydgAAAAAAAAAaAAAAywHJA2MFkghrC/YQPxVRGzQh8SmQMhg7kkYFUXdd7WtwegWJsZp8rGm/fdPD6TD////gABBKRklGAAEBAAABAAEAAP/tAIRQaG90b3Nob3AgMy4wADhCSU0EBAAAAAAAaBwCZwAUdWRQdkxCLXdxXzRGQkRNNkdDOEkcAigASkZCTUQwZjAwMDc3NzAzMDAwMGJiMTkwMDAwNDEzZTAwMDA3ZDQ1MDAwMGEwNGMwMDAwMGE1NzAwMDA2OTk1MDAwMGVlOWMwMDAw/9sAQwALCAgKCAcLCgkKDQwLDREcEhEPDxEiGRoUHCkkKyooJCcnLTJANy0wPTAnJzhMOT1DRUhJSCs2T1VORlRAR in /teste/apagar.php on line 25

Warning: Cannot modify header information - headers already sent by (output started at /teste/apagar.php:25) in /home/rpublici/public_html/teste/apagar.php on line 34

Editado por rickygac

Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
acao

boas

pois estava mal o select, não tinha reparado que estavas a consultar os campos todos e o id caiu no sitio errado.

o erro é no caminho para o ficheiro, tenta colocar (../ ou .../ antes do $row["imagem"]) para subir degraus ou adiciona a pasta teste/

unlink("../".$row["imagem"]);

ps: é a extensão que falta:

unlink($row["imagem"].".JPEG");

ou outra

cumps

​acao

Editado por acao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

boas

pois estava mal o select, não tinha reparado que estavas a consultar os campos todos e o id caiu no sitio errado.

o erro é no caminho para o ficheiro, tenta colocar (../ ou .../ antes do $row["imagem"]) para subir degraus ou adiciona a pasta teste/

unlink("../".$row["imagem"]);

cumps

​acao

continua a nao dar...

Editado por rickygac

Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
acao

boas

editei o post anterior:

ps: é a extensão que falta:

unlink($row["imagem"].".JPEG");

ou outra

Editado por acao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

boas

pois estava mal o select, não tinha reparado que estavas a consultar os campos todos e o id caiu no sitio errado.

o erro é no caminho para o ficheiro, tenta colocar (../ ou .../ antes do $row["imagem"]) para subir degraus ou adiciona a pasta teste/

unlink("../".$row["imagem"]);

ps: é a extensão que falta:

unlink($row["imagem"].".JPEG");

ou outra

cumps

​acao

naaa... estensao tb nao esta a dar...

Warning: unlink(.PNG) [function.unlink]: No such file or directory in /teste/apagar.php on line 25

Warning: Cannot modify header information - headers already sent by (output started at /home/rpublici/public_html/teste/apagar.php:25) in /teste/apagar.php on line 34


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

com este código eu mostro a imagem certa:

<?php

// liga-se à base de dados

include('ligar-bd.php');

// SELECIONA NA BASE DE DADOS A ÚLTIMA ENTRADA

if ($result = $mysqli->query(" SELECT * FROM teste ORDER BY id DESC ")){

if($row = $result->fetch_assoc()){

$output_hex_string = $row["imagem"];

$output_bin_string = base64_decode($output_hex_string);

header("Content-Type: image/png");

header("Content-Length: " . strlen($output_bin_string));

$id = $row["id"];

echo $output_bin_string;

}};

?>


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
acao

boas

já vi aonde está o erro, está a guardar a imagem com o nome original e a guardar na basedados apenas a codificação, e assim não é funcional porque nunca sabes a extensão do ficheiro.

a função unlink deixa assim :

unlink($row["imagem"]);

no upload / insert faz assim:

// TRATAMENTO E CODIFICAÇÃO DAS IMAGENS

					if (!file_exists("imagens")){
									mkdir("../imagens", 0755);  cria pasta na raiz do site, verifica se foi para o sitio certo, senão altera o caminho.
					}

$arqName = $_FILES["file"]["name"];
$pasta ="../imagens/"	 // aqui colocas assim e depois vais ver se a imagem foi parar ao sitio certo, senão altera, ../ isto significa que estamo a sibir um diretório referente aonde se encontra este ficheiro php, e pareceme que está um degrau abaixo da pasta imagens, faz acertos.
 // Pega a extensão do arquivo enviado
 $extensao = strtolower(end(explode('.', $arqName)));
 // Define o novo nome do arquivo usando um UNIX TIMESTAMP
 $nome = md5(microtime()) . '.' . $extensao;   // alterei a codificação para md5 por ser mais curta e não ser necessário o base64
move_uploaded_file($_FILES["file"]["tmp_name"],$pasta . $nome);

$bin_string = file_get_contents($_FILES["file"]["name"]);
$hex_string = $pasta . $nome;

// OPÇÕES DO FORMULÁRIO
$nome = filter_var($_POST['nome'], FILTER_SANITIZE_STRING);
$categoria = filter_var($_POST['categoria'], FILTER_SANITIZE_STRING);

// INSERE NA BASE DE DADOS
$mysqli->query(" INSERT INTO teste(
imagem,
nome,
categoria
) VALUES (
'" . $hex_string . "',
'$nome',
'$categoria'
) ");

}

}

faz acertos porque estou a fazer direto aqui no app.

cumps

acao

Editado por acao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

boas

já vi aonde está o erro, está a guardar a imagem com o nome original e a guardar na basedados apenas a codificação, e assim não é funcional porque nunca sabes a extensão do ficheiro.

a função unlink deixa assim :

unlink($row["imagem"]);

no upload / insert faz assim:

// TRATAMENTO E CODIFICAÇÃO DAS IMAGENS

					if (!file_exists("imagens")){
									mkdir("../imagens", 0755);  cria pasta na raiz do site, verifica se foi para o sitio certo, senão altera o caminho.
					}

$arqName = $_FILES["file"]["name"];
$pasta ="../imagens/"	 // aqui colocas assim e depois vais ver se a imagem foi parar ao sitio certo, senão altera, ../ isto significa que estamo a sibir um diretório referente aonde se encontra este ficheiro php, e pareceme que está um degrau abaixo da pasta imagens, faz acertos.
 // Pega a extensão do arquivo enviado
 $extensao = strtolower(end(explode('.', $arqName)));
 // Define o novo nome do arquivo usando um UNIX TIMESTAMP
 $nome = md5(microtime()) . '.' . $extensao;   // alterei a codificação para md5 por ser mais curta e não ser necessário o base64
move_uploaded_file($_FILES["file"]["tmp_name"],$pasta . $nome);

$bin_string = file_get_contents($_FILES["file"]["name"]);
$hex_string = $pasta . $nome;

// OPÇÕES DO FORMULÁRIO
$nome = filter_var($_POST['nome'], FILTER_SANITIZE_STRING);
$categoria = filter_var($_POST['categoria'], FILTER_SANITIZE_STRING);

// INSERE NA BASE DE DADOS
$mysqli->query(" INSERT INTO teste(
imagem,
nome,
categoria
) VALUES (
'" . $hex_string . "',
'$nome',
'$categoria'
) ");

}

}

faz acertos porque estou a fazer direto aqui no app.

cumps

acao

boas,

mas isso assim pelo que vejo nao codifica a imagem, nao perde um pouco de segurança dessa forma?

ok eu alterei e ele passou a enviar bem as imagens pra pasta "imagens" que era outra coisa que queria fazer e nao estava a conseguir, antes enviava tudo pra root...

tambem esta a eliminar bem, agora acontece que ao alterar essa codificação alterou-me tambem os outros ficheiros, eu tenho um include "ultimo_envio.php"; que deixou de mostrar a imagem, penso que devido á alteração da codificação.

codigo do ultimo_envio.php:

<html>

<body>

<?php

echo "

<center>

<hr size=1 width=300 class='degrade'>

Última entrada adicionada:

<br>

<i><b> $nome </b></i>

<hr size=1 width=300 class='listado'>

<a href='envia.php?getfile=1' target='blank''><img src='envia.php?getfile=1' class='imagem'></a>

";

include "index.php";

?>

</center>

</body>

</html>

Editado por rickygac

Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
acao

boas

então faz assim:

apaga todas as imagens no servidor à mão,

ao teu cod inicial comenta apenas este cod:

//move_uploaded_file($_FILES["file"]["tmp_name"], $_FILES["file"]["name"]);

e corre o script inser e o delet

cumps

acao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

//move_uploaded_file($_FILES["file"]["tmp_name"], $_FILES["file"]["name"]);

não existe desde que alteramos o código, agora é assim:

move_uploaded_file($_FILES["file"]["tmp_name"],$pasta . $nome);

código atual inteiro do envia.php

<?php

// LIGA-SE À

Editado por rickygac

Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

com este código ultimo_envio.php mostra a imagem mas da-me o seguinte erro:

Warning: file_get_contents(12963758_1715744612005544_7078464498064874713_n.jpg) [function.file-get-contents]: failed to open stream: No such file or directory in /teste/envia.php on line 35



<?php

echo "

<center>

<hr size=1 width=300 class='degrade'>

Última entrada adicionada:

<br>

<i><b> $nome </b></i>

<hr size=1 width=300 class='listado'>

<a href='$hex_string' target='blank''><img src='$hex_string' class='imagem'></a>

";

include "index.php";

?>

Editado por rickygac

Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação 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.