Problemi cambiare nome nelle foto

pinoshine

Utente Attivo
15 Set 2012
95
0
0
Ciao a tutti, ho alcuni problemi con la creazione di una galleria di immagini, lo script funziona bene tranne per la rinominazione della foto, nel database la foto viene nominata nello stesso id progressivo della tabella invece la foto riname il nome originale io vorrei che la foto avesse lo stesso id della tabella, il codice dopo upload e' questo:
PHP:
 <?php
				
  require 'config.php';
  require 'function.php';

  // crea cartella
   $path_img = "../foto hotel/";
   
  // Creo una array con i formati accettati
  $tipi_consentiti = array("image/gif","image/jpeg","image/png");

  // verifico che il formato del file sia tra quelli accettati
  if (in_array($_FILES['imagefile']['type'], $tipi_consentiti)){ 
    // copio il file nella cartella delle immagini
    copy ($_FILES['imagefile']['tmp_name'], $path_img . $_FILES['imagefile']['name']);

    // recupero i dati dal form appena caricata
    $idhotel = addslashes($_POST['idhotel']);
    $descrizione = addslashes($_POST['descrizione']);
    $nome = addslashes($_FILES['imagefile']['name']);
    $path = $path_img . stripslashes($nome);
    $tipo = addslashes($_FILES['imagefile']['type']);
				
    // creo la miniatura
    makeThumb($path_img,$path,$nome,$tipo);

    // aggiorno il database
    $query = "INSERT INTO images (idhotel,descrizione,nome,tipo) VALUES('$idhotel','$descrizione','$nome','$tipo')";
    $res = mysql_query($query,$connessione) or die (mysql_error($connessione));
    
	//recupera l'id dall'immagine
    $last_id = mysql_insert_id();
    
    // salva immagine con id associato della tabella
    $image_id = $last_id;
    imagejpeg($tipo, $path_img . '/' . $image_id  . '.jpg');
    imagedestroy($nome);

    $query2 = "UPDATE images  SET nome = '" . $image_id. "' WHERE id = '" . $last_id ."' ";
    $res = mysql_query($query2,$connessione) or die (mysql_error($connessione));

    list($path_img,$path,$nome,$tipo) = getimagesize($path_img . '/' . $image_id .
        '.jpg');
	
	if ($_POST['Submit']) {
    // make sure the requested image is valid
    if (isset($_POST['id']) && ctype_digit($_POST['id']) &&
        file_exists($path_img . '/' . $_POST['id'] . '.jpg')) {
        $tipo = imagecreatefromjpeg($path_img . '/' . $_POST['id'] . '.jpg');
		}
	}
	echo '<script language=javascript>document.location.href="javascript: history.go(-1)"</script>';
	
  }else{
    // stampo un messaggio di errore nel caso in cui il file sia di un formato non consentito
    echo "<div align=center>Impossibile eseguire l'upload - DEVI INSERIRE TUTTI I CAMPI.</div>";
	
  }
							   	

$url = htmlspecialchars($_SERVER['HTTP_REFERER']);
echo ("<BR><BR><center><a href='$url'>TORNA INDIETRO</a></center>");
?>
ed il file function.php e' questo:
PHP:
<?php
  function makeThumb($dir,$pic,$n,$t){
  list($width, $height, $type, $attr) = getimagesize($pic);
  $max_w = 100;
  $max_h = 100;
  $ratio = min($max_w/$width,$max_h/$height);

  // Verifico che l'immagine originale sia più grande delle dimensioni massime 100*100pxl
  if ($ratio < 1){
    // Individuo le nuove dimensioni da assegnare all'immagine
    $w = floor($ratio*$width);
    $h = floor($ratio*$height);

    // creo una nuova immagine con le dimensioni appena calcolate
    $thumb = imagecreatetruecolor($w,$h);
    if ($t == 'image/jpeg'){$temp = imagecreatefromjpeg($pic);}
    elseif ($t == 'image/jpeg'){$temp = imagecreatefromgif($pic);}
	elseif ($t == 'image/gif'){$temp = imagecreatefromgif($pic);}
    elseif ($t == 'image/png'){$temp = imagecreatefrompng($pic);}

    // ridimensiono l'originale e salvo nella cartella di destinazione
    imagecopyresized($thumb,$temp,0,0,0,0,$w,$h,$width,$height);
    if ($t == 'image/pjpeg'){imagejpeg($thumb,"$dir/tb_".$n, 150);}
	elseif ($t == 'image/jpeg'){imagegif($thumb,"$dir/tb_".$n, 150);}
    elseif ($t == 'image/gif'){imagegif($thumb,"$dir/tb_".$n, 150);}
    elseif ($t == 'image/png'){imagepng($thumb,"$dir/tb_".$n, 150);}
  }
}
?>
Ragazzi riuscite a capire dove sto sbagliando?
 
Ciao,
hai provato a spostare questo
PHP:
// copio il file nella cartella delle immagini
    copy($_FILES['imagefile']['tmp_name'], $path_img . $_FILES['imagefile']['name']);
dopo aver recuperaro l'id?
PHP:
// aggiorno il database
    $query = "INSERT INTO images (idhotel,descrizione,nome,tipo) VALUES('$idhotel','$descrizione','$nome','$tipo')";
    $res = mysql_query($query, $connessione) or die(mysql_error($connessione));


    //recupera l'id dall'immagine
    $last_id = mysql_insert_id();
    // qui dovrai recuperare la sua estensione
    copy($last_id . ".png", $path_img . $_FILES['imagefile']['name']);

anche se non conosco la funzione copy(), magari sto dicendo una cavolata :evil:
 
ciao
prova così
PHP:
<?php
// copio il file nella cartella delle immagini
    copy($_FILES['imagefile']['tmp_name'], $path_img . $_FILES['imagefile']['name']); //come detto da criric
//....
// aggiorno il database
    $query = "INSERT INTO images (idhotel,descrizione,nome,tipo) VALUES('$idhotel','$descrizione','$nome','$tipo')";
    $res = mysql_query($query, $connessione) or die(mysql_error($connessione)); 
	//e rinomino
	//recupera l'id dall'immagine
    $last_id = mysql_insert_id();
	//e rinomino (metto dei passaggi che puoi saltare) se in $nome c'è tutto es. pinco.jpg
	$vecchio_nome=$path_img.$nome; //se in $path_img c'è gia lo slash ok, altrimenti $path_img."/".$nome;
	$est=pathinfo($nome, PATHINFO_EXTENSION);
	$nuovo_nome=$path_img.$last_id.$est; //lo stesso per lo slash $path_img."/".$last_id.$est;
	rename($vecchio_nome,$nuovo_nome);
//........
?>
poi un paio di cose
PHP:
<?php
//.....
    if ($t == 'image/pjpeg'){imagejpeg($thumb,"$dir/tb_".$n, 150);}
    elseif ($t == 'image/jpeg'){imagegif($thumb,"$dir/tb_".$n, 150);}
    elseif ($t == 'image/gif'){imagegif($thumb,"$dir/tb_".$n, 150);}
    elseif ($t == 'image/png'){imagepng($thumb,"$dir/tb_".$n, 150);}
//...
?>
perche metti due volte imagegif?
inoltre
per imagejpeg($thumb,"$dir/tb_".$n, XY) la qualità XY va da 0 a 100
per imagegif($thumb,"$dir/tb_".$n, 150) non ci và la qualità imagegif($thumb,"$dir/tb_".$n)
per imagepng($thumb,"$dir/tb_".$n, XY) la qualità XY va da 0 a 9

edit
mi sono accorto dora di un'incongruenza:
salvi in db il nome del file poi lo vuoi rinominare, ma così poi quando estrai dal db non lo trovo se vuoi visualizzare l'immagine
 
Ultima modifica:
Ragazzi grazie per la risposta, ho provato entrambe le risposte, spostando ilquesto pezzo di codice:
PHP:
//recupera l'id dall'immagine
    $last_id = mysql_insert_id();
    // qui dovrai recuperare la sua estensione
    copy($last_id . ".png", $path_img . $_FILES['imagefile']['name']);
come ha detto criric non carica la foto nella cartelle, invece cambiando questo:
PHP:
 <?php
// copio il file nella cartella delle immagini
    copy($_FILES['imagefile']['tmp_name'], $path_img . $_FILES['imagefile']['name']); //come detto da criric
//....
// aggiorno il database
    $query = "INSERT INTO images (idhotel,descrizione,nome,tipo) VALUES('$idhotel','$descrizione','$nome','$tipo')";
    $res = mysql_query($query, $connessione) or die(mysql_error($connessione)); 
    //e rinomino
    //recupera l'id dall'immagine
    $last_id = mysql_insert_id();
    //e rinomino (metto dei passaggi che puoi saltare) se in $nome c'è tutto es. pinco.jpg
    $vecchio_nome=$path_img.$nome; //se in $path_img c'è gia lo slash ok, altrimenti $path_img."/".$nome;
    $est=pathinfo($nome, PATHINFO_EXTENSION);
    $nuovo_nome=$path_img.$last_id.$est; //lo stesso per lo slash $path_img."/".$last_id.$est;
    rename($vecchio_nome,$nuovo_nome);
//........
?>
la foto viene rinominata cosi':1jpg in sostanza manca il punto pero' non riesco a capire dove' l'errore!! complimenti ,seiete grandi ragazzi!!
 
Ragazzi grazie per la risposta, ho provato entrambe le risposte, spostando ilquesto pezzo di codice:
PHP:
//recupera l'id dall'immagine
    $last_id = mysql_insert_id();
    // qui dovrai recuperare la sua estensione
    copy($last_id . ".png", $path_img . $_FILES['imagefile']['name']);
come ha detto criric non carica la foto nella cartelle, invece cambiando questo:
PHP:
 <?php
// copio il file nella cartella delle immagini
    copy($_FILES['imagefile']['tmp_name'], $path_img . $_FILES['imagefile']['name']); //come detto da criric
//....
// aggiorno il database
    $query = "INSERT INTO images (idhotel,descrizione,nome,tipo) VALUES('$idhotel','$descrizione','$nome','$tipo')";
    $res = mysql_query($query, $connessione) or die(mysql_error($connessione)); 
    //e rinomino
    //recupera l'id dall'immagine
    $last_id = mysql_insert_id();
    //e rinomino (metto dei passaggi che puoi saltare) se in $nome c'è tutto es. pinco.jpg
    $vecchio_nome=$path_img.$nome; //se in $path_img c'è gia lo slash ok, altrimenti $path_img."/".$nome;
    $est=pathinfo($nome, PATHINFO_EXTENSION);
    $nuovo_nome=$path_img.$last_id.$est; //lo stesso per lo slash $path_img."/".$last_id.$est;
    rename($vecchio_nome,$nuovo_nome);
//........
?>
la foto viene rinominata cosi':1jpg in sostanza manca il punto pero' non riesco a capire dove' l'errore!! complimenti ,seiete grandi ragazzi!!
Dovresti aggiungerlo qui
PHP:
$nuovo_nome=$path_img.$last_id.'.'.$est;
 
Grazie sei un grande !! adesso funziona :fonzie: visto che ci sei ho un problema nel cancellare la foto adesso ti posto il codice:
PHP:
<?php      
include 'config.php';  

if(!isset($_GET['id'])) 
    { 
    exit('Nella pagina '.$_SERVER['PHP_SELF'].' non arrivato nessun id'); 
    } 
    
$query = "SELECT * FROM images WHERE id='".intval($_GET['id'])."' LIMIT 1";       
$risultato = mysql_query($query) or die('Query select fallifa per il seguente motivo: '.mysql_error());           
if (mysql_num_rows($risultato)===1)           
    {

 
$row = mysql_fetch_array($risultato);
         
    $foto_da_cancellare = "../foto hotel/". stripslashes($row['nome']);          
            
    if(file_exists($foto_da_cancellare))      
        {      
        unlink($foto_da_cancellare) or die ('problemi nella cancellazione della foto');      
        }  
    else     
        {      
        exit('il file '.$foto_da_cancellare.' non esiste!');      
        }    

    mysql_query("DELETE FROM images WHERE id='".intval($_GET['id'])."' LIMIT 1") or die('Query delete fallifa per il seguente motivo: '.mysql_error()); 
    }               

echo" 
    <BR><BR> 
    <center> 
    <span class=gensmall>Cancellazione avvenuta con successo.</span> 
    </center>";      
$url = htmlspecialchars($_SERVER['HTTP_REFERER']);
echo ("<BR><BR><center><a href='$url'>TORNA INDIETRO</a></center>");
?>
La query mi dice: il file ../foto hotel/1 non esiste! in pratica ci manca ".jpg" (almeno credo) Scusami se ne approfitto ma ci sto sbattendo da parecchio: :dipser:
Grie
 
Se sono tutte .jpg ti basta concatenarlo
PHP:
$foto_da_cancellare = "../foto hotel/". stripslashes($row['nome']).'.jpg';

Sennò puoi memorizzare nel nome anche l'estensione o metterla in un campo a parte (tipo in un enum)
PHP:
$foto_da_cancellare = "../foto hotel/". stripslashes($row['nome']).$row['estensione'];
 
Grazie grazie!! ho risolto con il 1° codice, mi hai veramente tolto un pensiero enorme!!
PHP:
$foto_da_cancellare = "../foto hotel/". stripslashes($row['nome']).'.jpg';
cmq la tabella img e' cosi' composta:
Codice:
CREATE TABLE `images` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `idhotel` varchar(255) NOT NULL DEFAULT '',
  `descrizione` varchar(255) NOT NULL DEFAULT '',
  `nome` varchar(255) NOT NULL DEFAULT '',
  `tipo` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=36 ;

io vorrei usare il secondo codice che mi hai suggerito in modo da non avere vincoli di upload, nella riga tipo io memorizzo il tipo di file, provando il codice sopra indicato nella colonna tipo non scrive niente, qualche idea
Grazie
 
Hai controllato il valore di $tipo prima di inserirlo? Che risultato ti dava?
 
ciao
scusate ma ci sono alcune cose (forse perchè mancano delle parti di codice, o forse sono gnocco) che non capisco:
1) da un form immagino carichi la foto $_FILES['imagefile']['name'] che conterrà es. pinco.jpg
2) fai la tumb e quindi avrai tumb_pinco.jpg
3) fai l'insert nella tabella del db (immagino che sia $nome ?), cosa contiene $nome?
4) rinomini pinco.jpg in (sempre es prendendo il last id) 333.jpg, e la tumb?
5) vuoi eliminare la foto e prima fai la select con where id=intval($_GET['id']) (il limit 1 non servirebbe, anche in delete: l'id dovrebbe essere univoco) estraendo stripslashes($row['nome'])
e fai l'unlink del immagine, ma solita domanda cosa c'è in nome? e ancora, non cancelli anche la tumb?
 
ciao
scusate ma ci sono alcune cose (forse perchè mancano delle parti di codice, o forse sono gnocco) che non capisco:
1) da un form immagino carichi la foto $_FILES['imagefile']['name'] che conterrà es. pinco.jpg
2) fai la tumb e quindi avrai tumb_pinco.jpg
3) fai l'insert nella tabella del db (immagino che sia $nome ?), cosa contiene $nome?
4) rinomini pinco.jpg in (sempre es prendendo il last id) 333.jpg, e la tumb?
5) vuoi eliminare la foto e prima fai la select con where id=intval($_GET['id']) (il limit 1 non servirebbe, anche in delete: l'id dovrebbe essere univoco) estraendo stripslashes($row['nome'])
e fai l'unlink del immagine, ma solita domanda cosa c'è in nome? e ancora, non cancelli anche la tumb?
No la thumb non la faccio o meglio l'ho eliminata perche preferisco rimpicciolire l'immagine in modo da non caricare troppo roba visto che e' un sito di hotel (e ne saranno circa 100) e per ogni hotel carico 4 o 5 foto cmq adesso carico tutto lo script in modo che se qualcuno lo vuole puo' scaricarlo

Edit: nel post diestro e' presente la tabella sql
Edit2. limit 1 l'ho inserito per essere sicuro di cancellare solo quella foto, puo' essere anche inutile che come dici tu giustamente prende l'id univoco, invece $nome contine il mone originale della foto perima della rinominazione
 

Allegati

Ultima modifica:
ciao ragazzi, ho un nuovo problema con la cancellazione delle foto, in pratica se cancello un artico con una sola foto inserita non ho problemi ma se cancello l'intero articolo publicato con piu' foto (saranno all'incira 4) le foto mi rimaagono nella carte e la query mi da questo errore:
"Query select fallifa per il seguente motivo: No database selected"
non capisco perche' solo una foto nn da problemi, cmq questo e' il codice:
PHP:
<?
    require 'config.php' ;
	
    $sql = "DELETE hotel.*,prezzi.*,offerte.*,camere.*,servizzi_hotel.* FROM hotel  LEFT JOIN prezzi ON  hotel.idhotel=prezzi.idhotel LEFT JOIN offerte ON hotel.idhotel=offerte.idhotel LEFT JOIN camere ON hotel.idhotel=camere.idhotel LEFT JOIN servizzi_hotel ON hotel.idhotel=servizzi_hotel.idhotel WHERE hotel.idhotel=".$_GET["id"];
	mysql_query ($sql,$connessione);
	mysql_close ($connessione);
	?>
	<?php      
require 'config.php';  

if(!isset($_GET['id'])) 
    { 
    exit('Nella pagina '.$_SERVER['PHP_SELF'].' non arrivato nessun id'); 
    } 
    
$query = "SELECT * FROM images WHERE idhotel=".$_GET["id"] ;       
$risultato = mysql_query($query) or die('Query select fallifa per il seguente motivo: '.mysql_error());           
if (mysql_num_rows($risultato)===1)           
    {

 
$row = mysql_fetch_array($risultato);
         
    $foto_da_cancellare = "../foto hotel/". stripslashes($row['nome']).'.jpg';          
            
    if(file_exists($foto_da_cancellare))      
        {      
        unlink($foto_da_cancellare) or die ('problemi nella cancellazione della foto');      
        }  
    else     
        {      
        exit('il file '.$foto_da_cancellare.' non esiste!');      
        }    

    mysql_query("DELETE FROM images WHERE idhotel=".$_GET['id']) or die('Query delete fallifa per il seguente motivo: '.mysql_error()); 
    }                                        
echo" 
    <BR><BR> 
    <center> 
    <span class=gensmall>Cancellazione avvenuta con successo.</span> 
    </center>";      
$url = htmlspecialchars($_SERVER['HTTP_REFERER']);
echo ("<BR><BR><center><a href='$url'>TORNA INDIETRO</a></center>");   
?>
Grazie raga! :)
 
ciao
immagino che se l'hotel ha 4 immagini nella tabella immagini tu abbia es.
d idhotel nome
1 27 imm1
2 27 imm2
3 31 imm1
4 27 imm3
ecc...
quindi
PHP:
<?php
//.....
$query = "SELECT * FROM images WHERE idhotel=".$_GET["id"] ;       
$risultato = mysql_query($query) or die('Query select fallifa per il seguente motivo: '.mysql_error());
if(mysql_num_rows($risultato) > 0{
	while($row=mysql_fetch_array($risultato)){
		$foto_da_cancellare = "../foto hotel/". stripslashes($row['nome']).'.jpg';
		if(file_exists($foto_da_cancellare)){
			unlink($foto_da_cancellare) or die ('problemi nella cancellazione della foto');
		}else{
			echo "l'immagine $foto_da_cancellare non esiste<br />";//no l'exit perche se non ne trova una ma ce ne sono altre esce comunque
		}
	}
}
//....
?>
 
Grazie di cuore!! adesso funziona tutto alla perfezione!! ringrazio anche tutti gli altri che mi hanno aiutato nei giorni passati, mi avete risoltoun problema grandissimo!!
Se posso permettermi ho un proble su di un javascrpit che da la coferma prima della cancellazione sempre sul cancella tutto sopra indicato che mi da questo erorre:"cancella_tutto.php non arrivato nessun id"
questo e' lo script:
Codice:
<script language="JavaScript">
	<!--
	if (!confirm("Vuoi veramente cancellare l'hotel?"))
	{
	 history.back();
	}
	else
	{
		location.href="cancella_tutto.php";
	}
	//-->
	</script>
	<?
		session_start();
		$_SESSION["id"]=$_GET["id"];
	?>
Grazie ancora per l'aiuto!!
 

Discussioni simili