Eliminare immagini da directory / *dal database fatto!

Marco Bonanno

Utente Attivo
3 Lug 2012
32
0
6
Ciao ragazzi, ho certato da tutte le parti ma non riesco ad integrare nel codice la funzione che cancella le immagini anche dalla directory. Spiego meglio.

Uno script mi carica le immagini in due directory, una in miniatura, e una originale /uploads/original - /uploads/thumbs oltre che caricarle nel database.

Sono riuscito bene o male a creare un file delete.php che mostra il contenuto nel database ed affiancare la funzione delete, funziona perfettamente. Purtroppo non è sufficiente, avrei bisogno che cancellasse le immagini dalle due directory.


Posto il codice di DELETE.php

PHP:
<?php
$con = mysql_connect("localhost","*******","******");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}

mysql_select_db("**********************", $con);

if($_POST)
{
	$ids = isset($_POST['id']) ? $_POST['id'] : array();
	elimina_record($ids);
}
elseif(isset($_GET['id']))
{
	elimina_record(array($_GET['id']));
}
else
	mostra_lista();

function mostra_lista()
{
	// mostro un eventuale messaggio
	if(isset($_GET['msg']))
		echo '<b>'.htmlentities($_GET['msg']).'</b><br /><br />';

	// preparo la query
	$query = "SELECT id,name,filename FROM image";

	// invio la query
	$result = mysql_query($query);

	// controllo l'esito
	if (!$result) {
		die("Errore nella query $query: " . mysql_error());
	}

	echo '
	<form name="form1" method="post" action="">
	<table border="1">
		<tr>
			<th>&nbsp;</th>
			<th>ID</th>
			<th>&nbsp;</th>
		</tr>';

	while ($row = mysql_fetch_assoc($result))
	{
		$name = htmlentities($row['name']);
		$id = htmlentities($row['id']);
		$filename = htmlentities($row['filename']);



		// preparo il link per la modifica dei dati del record
		$link = $_SERVER['PHP_SELF'].'?id=' . $row['id'];

		echo "<tr>
				<td><input name=\"id[]\" type=\"checkbox\" value=\"$row[id]\" /></td>
				<td>$id</td>
				<td><a href=\"$link\">elimina</a></td>
			</tr>";
	}

	echo '</table>
		<br />
		<input type="submit" name="Submit" value="Elimina record selezionati" />
		</form>';

	// libero la memoria di PHP occupata dai record estratti con la SELECT
	mysql_free_result($result);

	// chiudo la connessione a MySQL
	mysql_close();
}

function elimina_record($ids)
{
	// verifico che almeno un id sia stato selezionato
	if(count($ids) < 1)
	{
		$messaggio = urlencode("Nessun record selezionato!");
		header('location: '.$_SERVER['PHP_SELF'].'?msg='.$messaggio);
		exit;
	}

	// per precauzione converto gli ID in interi
	$ids = array_map('intval',$ids);

	// creo una lista di ID per la query
	$ids = implode(',',$ids);

	// preparo la query
	$query = "DELETE FROM image WHERE id IN ($ids)";

	// invio la query
	$result = mysql_query($query);

	// controllo l'esito
	if (!$result) {
		die("Errore nella query $query: " . mysql_error());
	}

	// conto il numero di record cancellati
	$num_record = mysql_affected_rows();

	// chiudo la connessione a MySQL
	mysql_close();

	$messaggio = urlencode("Numero record cancellati: $num_record");
	header('location: '.$_SERVER['PHP_SELF'].'?msg='.$messaggio);
}
?>



Non riesco proprio come muovermi, non sono espertissimo, sono riuscito ad assemblare il codice infatti prendendolo da varie fonti, preferirei quindi mi aiutaste un po più con il cucchiaino :)

Probabilmente dovrebbe essere utilizzata la funzione unlink, ma non so come e dove inserire.
Grazie, se ci fosse bisogno di altri file sono a disposizione.

Grazie mille davvero a chi mi vorrà aiutare :)
 
ciao
devi trasmettere anche i nomi dei file alla funzione elimina_record come l'array degli id
PHP:
<?php
function elimina_record($ids, $files){
    // verifico che almeno un id sia stato selezionato
    if(count($ids) < 1){
        $messaggio = urlencode("Nessun record selezionato!");
        header('location: '.$_SERVER['PHP_SELF'].'?msg='.$messaggio);
        exit;
    }
    // per precauzione converto gli ID in interi
    $ids = array_map('intval',$ids);
    // ... le query....
	/*
	ora non so come chiami le miniature, stesso nome delle immagini grandi?
	ne quale sia il percorso esatto, quindi ti schematizzo
	*/
	$cart_1="/uploads/original/";
	$cart_2="/uploads/thumbs/";
	foreach($files as $file){
		$f_1=$cart_1.$file;
		$f_2=$cart_2.$file;
		//comunque per sicurezza ti conviene verificare che i file esistano in modo da non bloccare lo script
		unlink($f_1);
		unlink($f_2);
	}
    //...
} 
?>
 
Ciao e grazie per la risposta, sei stato gentilissimo. Ho cambiato il nome di file in filename, che dovrebbe essere il nome con cui vengono salvati le immagini nelle directory, ma nulla.

Ti posto quindi il codice completo della funzione che effettua l'upload:

PHP:
session_start();
$_SESSION['id']="1";
$id=$_SESSION['id'];
include 'config.php';  //assume you have connected to database already.
$folder = 'uploads/';
$name = date('YmdHis');
$filename = md5($_SERVER['REMOTE_ADDR'].rand()).'.jpg';
$original = $folder.$filename;

// The JPEG snapshot is sent as raw input:
$input = file_get_contents('php://input');

if(md5($input) == '7d4df9cc423720b7f1f3d672b89362be'){
	// Blank image. We don't need this one.
	exit;
}

$result = file_put_contents($original, $input);
if (!$result) {
	echo '{
		"error"		: 1,
		"message"	: "Failed save the image. Make sure you chmod the uploads folder and its subfolders to 777."
	}';
	exit;
}

$info = getimagesize($original);
if($info['mime'] != 'image/jpeg'){
	unlink($original);
	exit;
}

// Moving the temporary file to the originals folder:
rename($original,'uploads/original/'.$filename);
$original = 'uploads/original/'.$filename;

// Using the GD library to resize 
// the image into a thumbnail:

$origImage	= imagecreatefromjpeg($original);
$newImage	= imagecreatetruecolor(154,110);
imagecopyresampled($newImage,$origImage,0,0,0,0,154,110,520,370); 

imagejpeg($newImage,'uploads/thumbs/'.$filename);

echo '{"status":1,"message":"Success!","filename":"'.$filename.'"}';


    $sql="INSERT INTO image VALUES ('','$name','$filename')";
    $result=mysqli_query($con,$sql);
    $value=mysqli_insert_id($con);
    $_SESSION["myvalue"]=$value;
 

Discussioni simili