[PHP] Problema resize di immagine da db

tivovi74

Utente Attivo
31 Gen 2012
58
1
8
Ciao a tutti, avrei bisogno di un aiuto.....
Vorrei fare il resize di immagini richiamate da un db attraverso una query
Il tutto è in una funzione php, la posto così è più semplice e poi spiego cosa succede

PHP:
function usato(){
global $mysqli;
$sql = 'SELECT id_prodotto_usato, nome, descrizione, prezzo, foto_principale FROM prodotti_usati WHERE stato_vendita="in_vendita"  ORDER BY id_prodotto_usato desc LIMIT 6';
$result = $mysqli->query($sql);
$totale = $result->num_rows;
$out = '<article id="vetrina">';
$out.='<h2 class="text_grey">La Vetrina dell\'Usato:</h2>';
    while ($row = $result->fetch_array()){
        $immagine = $row['foto_principale'];;
        $id = $row['id_prodotto_usato'];
        $larghezza = 200;
        $altezza = 133;
        $salvataggio = 'img/annunci_usato/miniature/vetrina_'.$id.'.jpg';
     
function resize($immagine, $id, $larghezza, $altezza, $salvataggio){

// File and new size

$filename = $immagine;

// Content type
header('Content-Type: image/jpeg');

// Get new sizes
list($width, $height) = getimagesize($filename);
$newwidth = $larghezza;
$newheight = $altezza;

// Load
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($filename);

// Resize
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

// Output
imagejpeg($thumb, $salvataggio, 72);
imagedestroy($thumb);
return ($salvataggio);
};
        $img = resize($immagine, $id, $larghezza, $altezza, $salvataggio);
       
        $out.='<article class="float">';
       
        $out.= '<img src="'.$img.'" />';
        $out.='<h2>'.$row['nome'].'</h2>';
        $descrizione = nl2br ($row['descrizione']);
        $out.='<h3>'.$descrizione.'</h3>';
        $number = $row['prezzo'];
        $number = number_format ($number, 2, ',', '.');
        $out.='<h4>'.$number.'</h4>';
        $out.='</article>';
        };
       
$out.='</article>';   
return ($out);
};



  1. Primo problema: la funzione resize mi salva solo una immagine, non dovrebbe ripetersi in automatico essendo all'interno di ciclo while?
  2. Secondo problema: la pagina web diventa completamente bianca. Ispezionando con chrome, ho visto che nel body è presente solo un tag img, il cui src è uguale all'url della pagina. è come se la funzione usato (la prima) si interrompesse al termine della funzione resize.
Vi ringrazio sin d'ora per l'aiuto.
 
ciao
porta fuori la function resize dalla function usato()
PHP:
<?php
function resize($immagine, $id, $larghezza, $altezza, $salvataggio){
    //.......
}
function usato(){
    global $mysqli;
    //....
    $img = resize($immagine, $id, $larghezza, $altezza, $salvataggio);
    //....
}


?>
 
Ciao Borgo, grazie mille.
Ora in effetti le miniature vengono salvate perfettamente, il primo problema è risolto!
Persiste, invece, il secondo, la pagina è sempre bianca, ti riposto il codice come modificato dopo il tuo aiuto:
PHP:
function resize($immagine, $id, $larghezza, $altezza, $salvataggio){

// File and new size

$filename = $immagine;



// Content type
header('Content-Type: image/jpeg');

// Get new sizes
list($width, $height) = getimagesize($filename);
$newwidth = $larghezza;
$newheight = $altezza;

// Load
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($filename);

// Resize
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

// Output
imagejpeg($thumb, $salvataggio, 72);
imagedestroy($thumb);
//return ($salvataggio);
}
function usato(){
global $mysqli;
$sql = 'SELECT id_prodotto_usato, nome, descrizione, prezzo, foto_principale FROM prodotti_usati WHERE stato_vendita="in_vendita"  ORDER BY id_prodotto_usato desc LIMIT 6';
$result = $mysqli->query($sql);
$totale = $result->num_rows;
$out = '<article id="vetrina">';
$out.='<h2 class="text_grey">La Vetrina dell\'Usato:</h2>';
    while ($row = $result->fetch_assoc()){
       
        $immagine = $row['foto_principale'];;
        $id = $row['id_prodotto_usato'];
        $larghezza = 200;
        $altezza = 133;
        $salvataggio = 'img/annunci_usato/miniature/vetrina_'.$id.'.jpg';

$img = resize($immagine, $id, $larghezza, $altezza, $salvataggio);       

       
        $out.='<article class="float">';
       
        $out.= '<img src="img/annunci_usato/miniature/vetrina_'.$id.'.jpg" />';
        $out.='<h2>'.$row['nome'].'</h2>';
        $descrizione = nl2br ($row['descrizione']);
        $out.='<h3>'.$descrizione.'</h3>';
        $number = $row['prezzo'];
        $number = number_format ($number, 2, ',', '.');
        $out.='<h4>'.$number.'</h4>';
        $out.='</article>';
        };
       
$out.='</article>';   
return ($out);
};

Spero tu possa aiutarmi ancora.
Grazie.
 
quelloc he dico probabilemnte è una cavolata ma se non richiami la funzione
PHP:
echo usato();
non ti uscirà mai niente
 
ciao
monital ha ragione, io non l'ho detto perchè mi sembrava evidente, comunque un'osservazione sul resize che fatto in quel modo ti obbliga a fare le immagini tutte in proporzione alla w e h che gli dai.
se non le rispetti sull'originale le immagini ti possono venire deformate o in larghezza o in altezza.
io farei qualcosa del genere
PHP:
<?php
function resize($immagine, $id, $larghezza, $altezza, $salvataggio){
    //.....
    list($width, $height) = getimagesize($filename);
    $rap[]=$larghezza/$width;
    $rap[]=$altezza/$height;
    $r=min($rap);
    $newwidth =(int)($r*$larghezza);
    $newheight = (int)($r*$altezza);
    //......
}
?>
in questo modo le immagini non si deformano senza preuccuparti che la loro w e h originale sia o no diversa dal rapporto 133/200
 
Si echo usato per attivare la function usato è già nel codice html della pagina. Prima che inserissi la function resize funzionava tutto. Adesso invece è come se venisse eseguito solo il codice relativo alla funzione resize e basta. Grazie per il suggerimento sulla funzione, la implementerò sicuramente.
 
Ragazzi ho risolto, bastava spostare
PHP:
$img = resize($immagine,$id);
fuori da ciclo while.
Grazie mille per gli aiuti precedenti.
A presto.
 
Scusate, ma in realtà mi sono accorto che c'era un errore...... Funzionava solo perchè in uno dei tentativi precedenti si erano salvate le immagini sulla cartella....

Per far caricare correttamente ho spostato
PHP:
$img = resize($immagine, $id, $salvataggio);
dopo
PHP:
return ($out);
della funzione usato. A questo punto, però la funzione resize non va più, le immagini non vengono più salvate.
Per far salvare correttamente le foto, invece, devo inserire
PHP:
$img = resize($immagine, $id, $salvataggio);
nel ciclo while della funzione usato, però poi si blocca l'esecuzione del codice e la pagina non si carica, come se la funzione usato non arrivasse alla fine. Vi posto di nuovo il codice, riuscireste a spiegarmi come mai?
Grazie mille.
PHP:
function resize($immagine, $id, $salvataggio){

// File and new size

$filename = $immagine;
$percorso = $salvataggio;
$larghezza = 200;
$altezza = 133;
// Content type
header('Content-Type: image/jpeg');

// Get new sizes
list($width, $height) = getimagesize($filename);
$newwidth = $larghezza;
$newheight = $altezza;

// Load
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($filename);

// Resize
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

// Output
imagejpeg($thumb, $percorso, 72);
imagedestroy($thumb);
//return ($percorso);
};

function usato(){
global $mysqli;
$sql = 'SELECT id_prodotto_usato, nome, descrizione, prezzo, foto_principale FROM prodotti_usati WHERE stato_vendita="in_vendita"  ORDER BY id_prodotto_usato desc LIMIT 6';
$result = $mysqli->query($sql);
$out = '<article id="vetrina">';
$out.='<h2 class="text_grey margin 10">La Vetrina dell\'Usato:</h2>';
    while ($row = $result->fetch_assoc()){
        $immagine = $row['foto_principale'];;
        $id = $row['id_prodotto_usato'];
        $salvataggio = 'img/annunci_usato/miniature/vetrina_'.$id.'.jpg';
           
        $out.='<article class="float margin_5 vetrina_prd">';

        $out.= '<img src="img/annunci_usato/miniature/vetrina_'.$id.'.jpg" />';
        $out.='<p class="bold">'.$row['nome'].'</p>';
        $descrizione = nl2br ($row['descrizione']);
        $out.='<p>'.$descrizione.'</p>';
        $number = $row['prezzo'];
        $number = number_format ($number, 2, ',', '.');
        $out.='<p class="bold">'.$number.'</p>';
        $out.='</article>';
       
        };       
$out.='</article>';   
return ($out);
$img = resize($immagine,$id, $salvataggio);
};
 
ciao
ci do un occhio per beme appena posso (se hai un po' di pazienza), ma c'è una cosa che mi salta subito all'occhio
PHP:
//.......
        };       
$out.='</article>';   
return ($out);
$img = resize($immagine,$id, $salvataggio);
};
le istruzioni dopo il return nonvengono eseguite
 
Borgo grazie mille, figurati nessuna fretta, ne ho da fare, sono solo alla index... :)
avevo letto che le istruzioni dopo il return non vengono eseguite, in realtà la funzione fa il suo dovere (ovvero ridimensiona e salva) se inserisco la chiamata nel ciclo while, però poi è come se andasse in loop e non legge il restante codice.....
Grazie ancora per l'aiuto.
a presto.
 
ciao
ho notato una cosa, nella funzione hai commentato il return, evidentemente perche la funzione non ti deve restituire un qualche valore
ti schematizzo due possibilità
PHP:
<?php
function resize($immagine, $id, $salvataggio){
    //......
    //return ($percorso);
}
?>
ma facendo così la funzione resize si ferma senza passare nuovamente il controllo a usato, per prima cosa fai questa prova, un return vuoto
PHP:
<?php
function resize($immagine, $id, $salvataggio){
    //......
    return;
}
?>
in questo modo quando la resize ha terminato il suo compito ripassa il controllo alla funzione usato
un altro metodo potrebbe essere scegliere una istruzione in resize e con un if dare due return es.
PHP:
<?php
function resize($immagine, $id, $salvataggio){
    //......
    if(!imagejpeg($thumb, $percorso, 72)){
        //la funzione non ha avuto successo
        return FALSE;
    }else{
        //la funzione è OK
        imagedestroy($thumb);
        return TRUE;
    }
}
?>
analogamente nella usato
PHP:
<?php
function usato(){
    global $mysqli;
    $sql = 'SELECT id_prodotto_usato, nome, descrizione, prezzo, foto_principale FROM prodotti_usati WHERE stato_vendita="in_vendita"  ORDER BY id_prodotto_usato desc LIMIT 6';
    $result = $mysqli->query($sql);
    //.......
    while ($row = $result->fetch_assoc()){
        //...
        if(!resize($immagine, $id, $salvataggio)){
            //la resize non ha funzionato
            continue;
        }else{
            //resize OK
            //e quindi costruisci tutta la variabile $out che poi andrai a resituire con il return
        }
    }
    //..
    return $out);
}
//.....
?>
dimenticavo: verifica che abbia messo le parentesi giuste, l'ho buttata giu di getto
 
Grazie Borgo, ma purtroppo non va in nessuno dei due modi..... la funzione resize fa il suo dovere, non so se sia la chiamata all'interno del ciclo while che dia problemi di loop, però se la metto fuori mi salva solo una immagine e non le 6 che servono.....
 
ciao
scusa il ritardo, ma c'è qualcosa (che non capisco) che non torna nel tuo script, peròse guarsi negli articoli/quide c'è uno script (quello che uso) che funziona
 
ciao
scusa il ritardo, ma c'è qualcosa (che non capisco) che non torna nel tuo script, peròse guarsi negli articoli/quide c'è uno script (quello che uso) che funziona

borgo scusa ma io tempo fa feci una prova nella creazione di una funziona che non c'entra niente con le immagini, ma credevo di aver capito che non si può usare una funzione dentro una funzione sbaglio?
 

Discussioni simili