Newsgroup: it.comp.www.php
Titolo: immagini su campo blob

ciao a tutti.
sto cercando di inserire e leggere delle immagini da un campo blob con php e
mysql
ho letto questo:
http://php.dopoil.com/faq.php?ImageIntoDB
Io sto procedendo come segue:
Pagina 1: ha una form enctype="multipart/form-data" che invia i dati in GET
alla pagina 2
Pagina 2: tra i vari valori, recupero il file della foto cosě:
$frmFoto1 = $_GET['frmFoto1']; //frmFoto1 č il nome del campo input
type=file
$fd = fopen ($frmFoto1, "rb");
$contents1 = fread ($fd, filesize ($frmFoto1));
fclose ($fd);
L'inserimento va a buon fine
Pagina 3: in una pagina di visualizzazione, tra gli altri campi del record,
cerco di visualizzare il campo con la foto cosě:
header ("Content-type: image/gif");
print "$row[foto1]";
(ovviamente prima ho la connesione al DB ecc.)
Il risultato č che mi viene stampata una stringa molto lunga di caratteri ma
non la foto...
non riesco a capire dove stia il problema...
Tex

 L'inserimento va a buon fine
Sembra che vada a buon fine....
in realtà devi aggiungere gli slash perchè l'immagine viene vista come una 
enorme stringa strazeppa di virgolette e apici.
Prova a fare così prima della query di inserimento:
$contents1 = addslashes($contents1);
Ti consiglio anche un client mysql avanzato capace di mostrare il contenuto 
dei campi blob.
Io uso mysql-front (
www.mysqlfront.de
) 

 Io uso mysql-front (
www.mysqlfront.de
)
su questo ti ringrazio molto... attualmente uso dbManager ma mi sta facendo
un po incacchiare :))
Tex

ho risolto!
ho fatto cosě:
ho creato un file a parte (image.php) che fa la connessione al db e recupera
l'immagine dalla tabella:
$idIMG1 = $_GET['idIMG1'];
include ("../DBConfig.php");
$db = mysql_connect($db_host, $db_user, $db_password);
if ($db == FALSE)
die ("Errore nella connessione.");
mysql_select_db($db_name, $db)
or die ("Errore nella selezione del database.");
$queryIMG = "SELECT foto1 FROM tabella where id = $idIMG1";
$resultIMG = mysql_query($queryIMG, $db);
$rowIMG = mysql_fetch_array($resultIMG);
header ("Content-type: image/gif");
echo($rowIMG['foto1']);
poi nel file che visualizza le foto ho fatto cosě:
<img src="image.php?idIMG1=<?echo "$row[id]" ?>" alt="" border="0">
per adesso č l'unica alternativa funzionante... non riesco a capire il
perchč perň... e mi piacerebbe anche sapere se č possibile risolvere in modi
+ semplici :)
grazie
Tex

 + semplici :)
In realtà è veramente l'unico sistema
Non avevo capito che tentati di stampare il contenuto del campo dentro una 
pagina normale.
Questo sistema non può funzionare per due motivi
1- Php non può mandare header dopo aver stampato anche un solo careattere a 
video (anche uno spazio). Quindi l'header che inizializza il contenuto 
binario tipo GIF deve essere mandato come prima cosa
2- Il browser deve essere informato che quello che gli sta per arrivare è 
una immagine. Perciò devi richiamarla attraverso un tag <IMG>
Mi fa piacere sentire che hai risolto comunque 

> Mi fa piacere sentire che hai risolto comunque
A furia di sbatterci la testa :))
una cosa:
perchè se all'interno della pagina che richiama l'immagine ho già una
connessione al db attiva ne devo rifare una nel file image.php e non posso
semplicemente fare soltanto la query??
Tex

 semplicemente fare soltanto la query??
PHP è un linguaggio stateless, cioè privo di stato. Ogni pagina è un 
microprogramma che viene lanciato dal server web (apache?) e che esaurisce 
il suo compito appena prima che il server cominci a trasmetterti la pagina 
così elaborata. le variabili esauriscono il loro compito alla fine della 
compilazione e non c'è modo, se non attraverso alcuni espedienti (vedi il 
capitolo del manuale sulle sessioni utente), di conservarne il valore.
Ciò significa che ogni volta che apri una nuova pagina le uniche variabili 
valorizzate sono quelle che gli passi tu attraverso la query string.
Se vuoi risolvere il tuo problema crea un file separato che effettua la 
connessione al DB e includilo in tutte le pagine che ne hanno necessità. In 
questo modo, se cambierai la password o il nome del DB, non dovrai andare a 
modificarlo in tutte le pagine. 

 modificarlo in tutte le pagine.
Si :) questo l'avevo già fatto, solo volevo evitare di riaprire la
connessione... il punto è che avevo pensato che richiamare un pagina php
come un'immagine, fosse simile al funzionamento di un include... cosa che
non è :))
ti ringrazio per la spiegazione molto dettagliata :)
Tex