PDA

View Full Version : [PHP + Mysql]prelevare e visualizzare un'immagine da un DB


cruyffissimo
14-01-2010, 21:56
$host='localhost';
$nome_database='prova';
$nome_utente='root';
$password='';
$connessione=mysql_connect($host,$nome_utente,$password);
mysql_select_db($nome_database);
$query = "SELECT codice_immagine FROM immagine WHERE chiave= 1";
$risultato = mysql_query($query) or die('Query non valida: ' . mysql_error());
$tmp = mysql_fetch_array($risultato);
header('Content-Type: image/jpeg');
echo $tmp['image'];
salve a tutti, vi ho postato il codice con cui intendo prelevare una immagine dal database (di nome prova), la tabella si chiama (immagine) e il campo contenitore dell'immagine è (codice_immagine), ma alla fine, lo eseguo e scrive questo:
"http://localhost/prova%20immagini/mostraImg.php"
mostraImg.php è il nome del file che eseguo...

vi prego, non riesco a capire il perchè, su internet è tutto incasinato!!
grazie mille

:muro: :muro: :muro:

Torav
14-01-2010, 22:00
fai una SELECT chiedendo il campo codice_immagine e poi cerchi di stampare $tmp['image'] invece di $tmp['codice_immagine'] e quindi ti stampa, ovviamente, una stringa vuota. Cambiando la chiave dell'array dovrebbe funzionare

flx2000
15-01-2010, 11:46
"mysql_fetch_array" ritorna i campi indicizzati da numeri interi, quindi devi usare echo $tmp[0];

cruyffissimo
15-01-2010, 13:42
vi ringrazio ragazzi...
ho provato a cambiare l'indice del vettore $temp
sia mettendo 0 che mettendo codice_immagine
ma non è successo nulla

:mc: :muro:

Torav
15-01-2010, 15:54
"mysql_fetch_array" ritorna i campi indicizzati da numeri interi, quindi devi usare echo $tmp[0];

veramente restituisce un array con i campi indicizzati SIA da interi che dai nomi delle colonne (almeno se non specifichi il secondo parametro).

vi ringrazio ragazzi...
ho provato a cambiare l'indice del vettore $temp
sia mettendo 0 che mettendo codice_immagine
ma non è successo nulla

:mc: :muro:

hai provato a farti stampare il numero di righe che ottieni dalla query? con mysql_num_rows()

flx2000
15-01-2010, 16:26
veramente restituisce un array con i campi indicizzati SIA da interi che dai nomi delle colonne (almeno se non specifichi il secondo parametro).

Esatto, avevo dato per scontata la caratteristica di mysql_fetch_assoc che al contrario restituisce solo l'associativo.
Ad ogni modo avrebbe dovuto funzionare in entrambi i casi, quindi il problema è altrove.

cruyffissimo
15-01-2010, 16:59
sisi, risulta 1 come deve essere, ma proprio non capisco perchè mi stampa l'indirizzo in locale del file in php...:muro:

flx2000
17-01-2010, 18:48
Sei sicuro che non ci siano errori nella richiesta che fai?
Perché in caso di errori l'header è compromesso e non puoi più inviarlo col comando "header".

Prova a fare la query a mano con phpMyAdmin o un client mysql, e poi assicurati che la riga dell'header sia esattamente questa (maiuscole/minuscole/spazi esatti):
header("Content-type: image/jpeg");

cruyffissimo
20-01-2010, 13:03
ho provato e riprovato, la query è giusta...
ti posto ancora il codice..

$host='localhost';
$nome_database='prova';
$nome_utente='root';
$password='';
$connessione=mysql_connect($host,$nome_utente,$password);
mysql_select_db($nome_database);
$query = "SELECT codice_immagine FROM immagine WHERE chiave= '1'";
$risultato = mysql_query($query);
$tmp = mysql_fetch_array($risultato);
header("Content-type: image/jpeg");
echo $tmp['codice_immagine'];

flx2000
20-01-2010, 13:26
Non hai alcun log del programma?

Comunque ti consiglio di usare sempre le versioni "sicure", ad esmpio cambia mysql_select_db($nome_database); in mysql_select_db($nome_database,$connessione); e mysql_query($query); in mysql_query($query,$connessione);

Per il resto qualche punto di controllo non farebbe male:
$connessione = mysql_connect($host,$nome_utente,$password);
if ( $connessione == false ) { echo "Impossibile connettersi al db"; }

e cose del genere...

cruyffissimo
20-01-2010, 17:15
tutti i controlli li avevo evitati apposta,davo per scontato che funzionasse...cosa intendi per log, scusa la domanda...XD

flx2000
20-01-2010, 21:10
I log sono i file di diagnostica prodotti dai servizi per rendicontare ogni cosa che accade, dagli errori all'utilizzo ecc.
Ad ogni modo puoi forzare il PHP a gestire gli errori in un certo modo, inserendo all'inizio del tuo programma queste righe:

ini_set("display_errors",1);
error_reporting(E_STRICT); (usa E_ALL se non hai PHP 5)
ini_set("error_log","errori.txt");

In questo modo ad ogni esecuzione del tuo script potrai trovare in errori.txt tutto quello che è successo, di buono e/o di imprevisto.

cruyffissimo
21-01-2010, 16:03
ho provato...

cmq sembra tutto giusto...segnalo una cosa...tolgo l'header e mi stampa a video una serie di caratteri chiaramenti sarà la codifica in ascii dell'immagine in questione...il database è pieno, il campo è un campo blob...
magari è l'header che da problemi...

cosa ne pensi?

:mc:

flx2000
21-01-2010, 16:14
Prova a fare questa cosa.
Al posto di:
header("Content-type: image/jpeg");
echo $tmp['codice_immagine'];
scrivi:
file_put_contents("prova.jpg",$tmp['codice_immagine']);

Scarica quel file prova.jpg così creato e vedi se è un'immagine valida.
Se non lo è la colpa non sta nel tuo codice PHP ma da qualche altra parte.

cruyffissimo
21-01-2010, 18:00
nulla...ma si può???che rabbia, ho provato anche a cancellare tutto il database e a farne uno prova, ma nulla...

tu come fai a scaricare le immagini dal database?
oppure, conosci un'altro metodo per scaricarle?


:help: :bsod: :bsod:

flx2000
22-01-2010, 09:19
In genere non si mettono mai immagini nei database.
Molto più comodo inserire solo il link all'immagine, che poi vai a pescare in una cartella del webserver.

In pratica:

header("Content-type: image/jpeg");
$db = mysql_connection(...bla,bla,bla...);
$res = mysql_query("select nome_file from immagine where chiave= '1'",$db);
$row = mysql_fetch_assoc($res);
readfile($row['nome_file']);
mysql_close($db);

cruyffissimo
22-01-2010, 11:21
a ok capisco, però non si dipende troppo dalla posizione della foto nelle varie cartelle?

vizzz
22-01-2010, 13:20
a ok capisco, però non si dipende troppo dalla posizione della foto nelle varie cartelle?

ma l'immagine in che tipo di campo è?

anonimizzato
22-01-2010, 13:51
a ok capisco, però non si dipende troppo dalla posizione della foto nelle varie cartelle?

In che senso?

Tu basta che memorizzi in un campo ad hoc il nome dell'immagine poi il path assoluto e relativo dellastessa lo memorizzi in una variabile/costante di configurazione.

A meno di vincoli imprescindibili è sempre meglio usare il filesystem per memorizzare i file.

flx2000
22-01-2010, 16:08
[...]
A meno di vincoli imprescindibili è sempre meglio usare il filesystem per memorizzare i file.

Appunto.
E' notoriamente meglio evitare i bytecode direttamente dentro i database.

cruyffissimo
24-01-2010, 14:39
il campo immagine era blob...

vorrà dire che memorizzerò soltanto il nome dell'immagine e poi me la giocherò con l'html..